From c049eeac7dd7e69f9b4f5bfce0e25e9ebc4036b7 Mon Sep 17 00:00:00 2001 From: Dominique Belhachemi Date: Sat, 3 Apr 2010 16:18:28 +0200 Subject: Import sparskit_2.0.0.orig.tar.gz [dgit import orig sparskit_2.0.0.orig.tar.gz] --- BLASSM/README | 83 + BLASSM/blassm.f | 1116 ++ BLASSM/makefile | 21 + BLASSM/matvec.f | 830 + BLASSM/rmatvec.f | 202 + BLASSM/tester.f | 172 + DOC/QUICK_REF | 200 + DOC/README | 14 + DOC/dir.eps | 115 + DOC/dir.fig | 46 + DOC/dir.pdf | Bin 0 -> 1471 bytes DOC/doc_data.txt | 15 + DOC/jpwh.pdf | Bin 0 -> 42831 bytes DOC/jpwh.ps | 6057 ++++++ DOC/mat8.pdf | Bin 0 -> 63163 bytes DOC/mat8.ps | 8564 ++++++++ DOC/mat9.pdf | Bin 0 -> 54091 bytes DOC/mat9.ps | 7332 +++++++ DOC/msh8.pdf | Bin 0 -> 21743 bytes DOC/msh8.ps | 10937 +++++++++++ DOC/msh9.pdf | Bin 0 -> 20888 bytes DOC/msh9.ps | 9353 +++++++++ DOC/paper.pdf | Bin 0 -> 432929 bytes DOC/paper.ps | 46661 ++++++++++++++++++++++++++++++++++++++++++++ DOC/paper.tex | 1998 ++ DOC/vbrpic.eps | 307 + DOC/vbrpic.fig | 207 + DOC/vbrpic.pdf | Bin 0 -> 2451 bytes FORMATS/README | 143 + FORMATS/chkfmt1.f | 424 + FORMATS/chkun.f | 168 + FORMATS/formats.f | 3716 ++++ FORMATS/makefile | 28 + FORMATS/rvbr.f | 142 + FORMATS/unary.f | 3141 +++ INFO/README | 66 + INFO/dinfo13.f | 394 + INFO/info.saylr1 | 42 + INFO/infofun.f | 800 + INFO/makefile | 18 + INFO/rinfo1.f | 39 + INFO/rinfoC.c | 104 + INFO/saylr1 | 368 + INOUT/README | 23 + INOUT/chkio.f | 100 + INOUT/hb2pic.f | 35 + INOUT/hb2ps.f | 42 + INOUT/inout.f | 1504 ++ INOUT/makefile | 28 + INOUT/semantic.cache | 15 + ITSOL/README | 63 + ITSOL/ilut.f | 2430 +++ ITSOL/itaux.f | 217 + ITSOL/iters.f | 3586 ++++ ITSOL/makefile | 27 + ITSOL/rilut.f | 285 + ITSOL/riter2.f | 102 + ITSOL/riters.f | 129 + ITSOL/riters_sav | 129 + ITSOL/runilut.f | 264 + ITSOL/saylr1 | 367 + LGPL | 504 + MATGEN/FDIF/README | 31 + MATGEN/FDIF/functns.f | 171 + MATGEN/FDIF/genmat.f | 1279 ++ MATGEN/FDIF/makefile | 21 + MATGEN/FDIF/rgen5pt.f | 66 + MATGEN/FDIF/rgenblk.f | 63 + MATGEN/FEM/README | 26 + MATGEN/FEM/convdif.f | 131 + MATGEN/FEM/elmtlib2.f | 1501 ++ MATGEN/FEM/femgen.f | 620 + MATGEN/FEM/functns2.f | 225 + MATGEN/FEM/makefile | 20 + MATGEN/FEM/mat.hb | 513 + MATGEN/FEM/meshes.f | 986 + MATGEN/FEM/semantic.cache | 16 + MATGEN/MISC/README | 15 + MATGEN/MISC/makefile | 25 + MATGEN/MISC/markov.f | 143 + MATGEN/MISC/rsobel.f | 14 + MATGEN/MISC/rzlatev.f | 108 + MATGEN/MISC/sobel.f | 158 + MATGEN/MISC/zlatev.f | 542 + MATGEN/README | 57 + ORDERINGS/README | 55 + ORDERINGS/ccn.f | 709 + ORDERINGS/color.f | 917 + ORDERINGS/dsepart.f | 980 + README | 108 + UNSUPP/BLAS1/blas1.f | 670 + UNSUPP/MATEXP/README | 20 + UNSUPP/MATEXP/exppro.f | 593 + UNSUPP/MATEXP/makefile | 14 + UNSUPP/MATEXP/phipro.f | 640 + UNSUPP/MATEXP/rexp.f | 98 + UNSUPP/MATEXP/rphi.f | 127 + UNSUPP/PLOTS/README | 19 + UNSUPP/PLOTS/psgrd.f | 190 + UNSUPP/PLOTS/texgrid1.f | 242 + UNSUPP/PLOTS/texplt1.f | 243 + UNSUPP/README | 57 + dotests | 144 + logfile | 329 + makefile | 153 + sgrep | 5 + 106 files changed, 126717 insertions(+) create mode 100644 BLASSM/README create mode 100644 BLASSM/blassm.f create mode 100644 BLASSM/makefile create mode 100644 BLASSM/matvec.f create mode 100644 BLASSM/rmatvec.f create mode 100644 BLASSM/tester.f create mode 100644 DOC/QUICK_REF create mode 100644 DOC/README create mode 100644 DOC/dir.eps create mode 100644 DOC/dir.fig create mode 100644 DOC/dir.pdf create mode 100644 DOC/doc_data.txt create mode 100644 DOC/jpwh.pdf create mode 100644 DOC/jpwh.ps create mode 100644 DOC/mat8.pdf create mode 100644 DOC/mat8.ps create mode 100644 DOC/mat9.pdf create mode 100644 DOC/mat9.ps create mode 100644 DOC/msh8.pdf create mode 100644 DOC/msh8.ps create mode 100644 DOC/msh9.pdf create mode 100644 DOC/msh9.ps create mode 100644 DOC/paper.pdf create mode 100644 DOC/paper.ps create mode 100644 DOC/paper.tex create mode 100644 DOC/vbrpic.eps create mode 100644 DOC/vbrpic.fig create mode 100644 DOC/vbrpic.pdf create mode 100644 FORMATS/README create mode 100644 FORMATS/chkfmt1.f create mode 100644 FORMATS/chkun.f create mode 100644 FORMATS/formats.f create mode 100644 FORMATS/makefile create mode 100644 FORMATS/rvbr.f create mode 100644 FORMATS/unary.f create mode 100644 INFO/README create mode 100644 INFO/dinfo13.f create mode 100644 INFO/info.saylr1 create mode 100644 INFO/infofun.f create mode 100644 INFO/makefile create mode 100644 INFO/rinfo1.f create mode 100644 INFO/rinfoC.c create mode 100644 INFO/saylr1 create mode 100644 INOUT/README create mode 100644 INOUT/chkio.f create mode 100644 INOUT/hb2pic.f create mode 100644 INOUT/hb2ps.f create mode 100644 INOUT/inout.f create mode 100644 INOUT/makefile create mode 100644 INOUT/semantic.cache create mode 100644 ITSOL/README create mode 100644 ITSOL/ilut.f create mode 100644 ITSOL/itaux.f create mode 100644 ITSOL/iters.f create mode 100644 ITSOL/makefile create mode 100644 ITSOL/rilut.f create mode 100644 ITSOL/riter2.f create mode 100644 ITSOL/riters.f create mode 100644 ITSOL/riters_sav create mode 100644 ITSOL/runilut.f create mode 100644 ITSOL/saylr1 create mode 100644 LGPL create mode 100644 MATGEN/FDIF/README create mode 100644 MATGEN/FDIF/functns.f create mode 100644 MATGEN/FDIF/genmat.f create mode 100644 MATGEN/FDIF/makefile create mode 100644 MATGEN/FDIF/rgen5pt.f create mode 100644 MATGEN/FDIF/rgenblk.f create mode 100644 MATGEN/FEM/README create mode 100644 MATGEN/FEM/convdif.f create mode 100644 MATGEN/FEM/elmtlib2.f create mode 100644 MATGEN/FEM/femgen.f create mode 100644 MATGEN/FEM/functns2.f create mode 100644 MATGEN/FEM/makefile create mode 100644 MATGEN/FEM/mat.hb create mode 100644 MATGEN/FEM/meshes.f create mode 100644 MATGEN/FEM/semantic.cache create mode 100644 MATGEN/MISC/README create mode 100644 MATGEN/MISC/makefile create mode 100644 MATGEN/MISC/markov.f create mode 100644 MATGEN/MISC/rsobel.f create mode 100644 MATGEN/MISC/rzlatev.f create mode 100644 MATGEN/MISC/sobel.f create mode 100644 MATGEN/MISC/zlatev.f create mode 100644 MATGEN/README create mode 100644 ORDERINGS/README create mode 100644 ORDERINGS/ccn.f create mode 100644 ORDERINGS/color.f create mode 100644 ORDERINGS/dsepart.f create mode 100644 README create mode 100644 UNSUPP/BLAS1/blas1.f create mode 100644 UNSUPP/MATEXP/README create mode 100644 UNSUPP/MATEXP/exppro.f create mode 100644 UNSUPP/MATEXP/makefile create mode 100644 UNSUPP/MATEXP/phipro.f create mode 100644 UNSUPP/MATEXP/rexp.f create mode 100644 UNSUPP/MATEXP/rphi.f create mode 100644 UNSUPP/PLOTS/README create mode 100644 UNSUPP/PLOTS/psgrd.f create mode 100644 UNSUPP/PLOTS/texgrid1.f create mode 100644 UNSUPP/PLOTS/texplt1.f create mode 100644 UNSUPP/README create mode 100755 dotests create mode 100644 logfile create mode 100644 makefile create mode 100755 sgrep diff --git a/BLASSM/README b/BLASSM/README new file mode 100644 index 0000000..071c687 --- /dev/null +++ b/BLASSM/README @@ -0,0 +1,83 @@ +c----------------------------------------------------------------------c +c c +c BLASSM and MATVEC MODULES c +c c +c----------------------------------------------------------------------c +c c +c This directory contains the BLASSM and MATVEC modules of SPARSKIT c +c c +c----------------------------------------------------------------------c +c c +c Current contents c +c----------------------------------------------------------------------c +c c +c blassm.f : contains the latest version of the basc linear algerba c +c routines for sparse matrices. c +c c +c tester.f : is a main program to test the routines and the paths c +c c +c matvec.f : contains the subroutines in the module matvec c +c c +c rmatvec.f: a test program that runs all the routines in matvec c +c c +c----------------------------------------------------------------------c +c c +c makefile : make file for tester.ex (tests blassm.f) and mvec.ex c +c (tests routines in matvec.f) c +c c +c----------------------------------------------------------------------c +c----------------------------------------------------------------------c +c----------------------------------------------------------------------c +c current status of blassm.f c +c c +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c BASIC LINEAR ALGEBRA FOR SPARSE MATRICES. BLASSM MODULE c +c----------------------------------------------------------------------c +c amub : computes C = A*B c +c aplb : computes C = A+B c +c aplsb : computes C = A + s B c +c apmbt : Computes C = A +/- transp(B) c +c aplsbt : Computes C = A + s * transp(B) c +c diamua : Computes C = Diag * A c +c amudia : Computes C = A* Diag c +c apldia : Computes C = A + Diag. c +c aplsca : Computes A:= A + s I (s = scalar) c +c----------------------------------------------------------------------c +c----------------------------------------------------------------------c +c c +c current status of matvec.f c +c c +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c BASIC MATRIX-VECTOR OPERATIONS - MATVEC MODULE c +c Matrix-vector Mulitiplications and Triang. Solves c +c----------------------------------------------------------------------c +c contents: +c---------- c +c 1) Matrix-vector products: c +c--------------------------- c +c amux : A times a vector. Compressed Sparse Row (CSR) format. c +c amuxms: A times a vector. Modified Compress Sparse Row format. c +c atmux : Transp(A) times a vector. CSR format. c +c amuxe : A times a vector. Ellpack/Itpack (ELL) format. c +c amuxd : A times a vector. Diagonal (DIA) format. c +c amuxj : A times a vector. Jagged Diagonal (JAD) format. c +c vbrmv : Sparse matrix-full vector product, in VBR format c +c c +c 2) Triangular system solutions: c +c------------------------------- c +c lsol : Unit Lower Triang. solve. Compressed Sparse Row (CSR) format.c +c ldsol : Lower Triang. solve. Modified Sparse Row (MSR) format. c +c lsolc : Unit Lower Triang. solve. Comp. Sparse Column (CSC) format. c +c ldsolc: Lower Triang. solve. Modified Sparse Column (MSC) format. c +c ldsoll: Lower Triang. solve with level scheduling. MSR format. c +c usol : Unit Upper Triang. solve. Compressed Sparse Row (CSR) format.c +c udsol : Upper Triang. solve. Modified Sparse Row (MSR) format. c +c usolc : Unit Upper Triang. solve. Comp. Sparse Column (CSC) format. c +c udsolc: Upper Triang. solve. Modified Sparse Column (MSC) format. c +c----------------------------------------------------------------------c + + diff --git a/BLASSM/blassm.f b/BLASSM/blassm.f new file mode 100644 index 0000000..899deb3 --- /dev/null +++ b/BLASSM/blassm.f @@ -0,0 +1,1116 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c BASIC LINEAR ALGEBRA FOR SPARSE MATRICES. BLASSM MODULE c +c----------------------------------------------------------------------c +c amub : computes C = A*B c +c aplb : computes C = A+B c +c aplb1 : computes C = A+B [Sorted version: A, B, C sorted] c +c aplsb : computes C = A + s B c +c aplsb1 : computes C = A+sB [Sorted version: A, B, C sorted] c +c apmbt : Computes C = A +/- transp(B) c +c aplsbt : Computes C = A + s * transp(B) c +c diamua : Computes C = Diag * A c +c amudia : Computes C = A* Diag c +c aplsca : Computes A:= A + s I (s = scalar) c +c apldia : Computes C = A + Diag. c +c----------------------------------------------------------------------c +c Note: this module still incomplete. c +c----------------------------------------------------------------------c + subroutine amub (nrow,ncol,job,a,ja,ia,b,jb,ib, + * c,jc,ic,nzmax,iw,ierr) + real*8 a(*), b(*), c(*) + integer ja(*),jb(*),jc(*),ia(nrow+1),ib(*),ic(*),iw(ncol) +c----------------------------------------------------------------------- +c performs the matrix by matrix product C = A B +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A = row dimension of C +c ncol = integer. The column dimension of B = column dimension of C +c job = integer. Job indicator. When job = 0, only the structure +c (i.e. the arrays jc, ic) is computed and the +c real values are ignored. +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format. +c +c b, +c jb, +c ib = Matrix B in compressed sparse row format. +c +c nzmax = integer. The length of the arrays c and jc. +c amub will stop if the result matrix C has a number +c of elements that exceeds exceeds nzmax. See ierr. +c +c on return: +c---------- +c c, +c jc, +c ic = resulting matrix C in compressed sparse row sparse format. +c +c ierr = integer. serving as error message. +c ierr = 0 means normal return, +c ierr .gt. 0 means that amub stopped while computing the +c i-th row of C with i=ierr, because the number +c of elements in C exceeds nzmax. +c +c work arrays: +c------------ +c iw = integer work array of length equal to the number of +c columns in A. +c Note: +c------- +c The row dimension of B is not needed. However there is no checking +c on the condition that ncol(A) = nrow(B). +c +c----------------------------------------------------------------------- + real*8 scal + logical values + values = (job .ne. 0) + len = 0 + ic(1) = 1 + ierr = 0 +c initialize array iw. + do 1 j=1, ncol + iw(j) = 0 + 1 continue +c + do 500 ii=1, nrow +c row i + do 200 ka=ia(ii), ia(ii+1)-1 + if (values) scal = a(ka) + jj = ja(ka) + do 100 kb=ib(jj),ib(jj+1)-1 + jcol = jb(kb) + jpos = iw(jcol) + if (jpos .eq. 0) then + len = len+1 + if (len .gt. nzmax) then + ierr = ii + return + endif + jc(len) = jcol + iw(jcol)= len + if (values) c(len) = scal*b(kb) + else + if (values) c(jpos) = c(jpos) + scal*b(kb) + endif + 100 continue + 200 continue + do 201 k=ic(ii), len + iw(jc(k)) = 0 + 201 continue + ic(ii+1) = len+1 + 500 continue + return +c-------------end-of-amub----------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine aplb (nrow,ncol,job,a,ja,ia,b,jb,ib, + * c,jc,ic,nzmax,iw,ierr) + real*8 a(*), b(*), c(*) + integer ja(*),jb(*),jc(*),ia(nrow+1),ib(nrow+1),ic(nrow+1), + * iw(ncol) +c----------------------------------------------------------------------- +c performs the matrix sum C = A+B. +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A and B +c ncol = integer. The column dimension of A and B. +c job = integer. Job indicator. When job = 0, only the structure +c (i.e. the arrays jc, ic) is computed and the +c real values are ignored. +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format. +c +c b, +c jb, +c ib = Matrix B in compressed sparse row format. +c +c nzmax = integer. The length of the arrays c and jc. +c amub will stop if the result matrix C has a number +c of elements that exceeds exceeds nzmax. See ierr. +c +c on return: +c---------- +c c, +c jc, +c ic = resulting matrix C in compressed sparse row sparse format. +c +c ierr = integer. serving as error message. +c ierr = 0 means normal return, +c ierr .gt. 0 means that amub stopped while computing the +c i-th row of C with i=ierr, because the number +c of elements in C exceeds nzmax. +c +c work arrays: +c------------ +c iw = integer work array of length equal to the number of +c columns in A. +c +c----------------------------------------------------------------------- + logical values + values = (job .ne. 0) + ierr = 0 + len = 0 + ic(1) = 1 + do 1 j=1, ncol + iw(j) = 0 + 1 continue +c + do 500 ii=1, nrow +c row i + do 200 ka=ia(ii), ia(ii+1)-1 + len = len+1 + jcol = ja(ka) + if (len .gt. nzmax) goto 999 + jc(len) = jcol + if (values) c(len) = a(ka) + iw(jcol)= len + 200 continue +c + do 300 kb=ib(ii),ib(ii+1)-1 + jcol = jb(kb) + jpos = iw(jcol) + if (jpos .eq. 0) then + len = len+1 + if (len .gt. nzmax) goto 999 + jc(len) = jcol + if (values) c(len) = b(kb) + iw(jcol)= len + else + if (values) c(jpos) = c(jpos) + b(kb) + endif + 300 continue + do 301 k=ic(ii), len + iw(jc(k)) = 0 + 301 continue + ic(ii+1) = len+1 + 500 continue + return + 999 ierr = ii + return +c------------end of aplb ----------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine aplb1(nrow,ncol,job,a,ja,ia,b,jb,ib,c,jc,ic,nzmax,ierr) + real*8 a(*), b(*), c(*) + integer ja(*),jb(*),jc(*),ia(nrow+1),ib(nrow+1),ic(nrow+1) +c----------------------------------------------------------------------- +c performs the matrix sum C = A+B for matrices in sorted CSR format. +c the difference with aplb is that the resulting matrix is such that +c the elements of each row are sorted with increasing column indices in +c each row, provided the original matrices are sorted in the same way. +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A and B +c ncol = integer. The column dimension of A and B. +c job = integer. Job indicator. When job = 0, only the structure +c (i.e. the arrays jc, ic) is computed and the +c real values are ignored. +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format with entries sorted +c +c b, +c jb, +c ib = Matrix B in compressed sparse row format with entries sorted +c ascendly in each row +c +c nzmax = integer. The length of the arrays c and jc. +c amub will stop if the result matrix C has a number +c of elements that exceeds exceeds nzmax. See ierr. +c +c on return: +c---------- +c c, +c jc, +c ic = resulting matrix C in compressed sparse row sparse format +c with entries sorted ascendly in each row. +c +c ierr = integer. serving as error message. +c ierr = 0 means normal return, +c ierr .gt. 0 means that amub stopped while computing the +c i-th row of C with i=ierr, because the number +c of elements in C exceeds nzmax. +c +c Notes: +c------- +c this will not work if any of the two input matrices is not sorted +c----------------------------------------------------------------------- + logical values + values = (job .ne. 0) + ierr = 0 + kc = 1 + ic(1) = kc +c + do 6 i=1, nrow + ka = ia(i) + kb = ib(i) + kamax = ia(i+1)-1 + kbmax = ib(i+1)-1 + 5 continue + if (ka .le. kamax) then + j1 = ja(ka) + else + j1 = ncol+1 + endif + if (kb .le. kbmax) then + j2 = jb(kb) + else + j2 = ncol+1 + endif +c +c three cases +c + if (kc .gt. nzmax) goto 999 + if (j1 .eq. j2) then + if (values) c(kc) = a(ka)+b(kb) + jc(kc) = j1 + ka = ka+1 + kb = kb+1 + kc = kc+1 + else if (j1 .lt. j2) then + jc(kc) = j1 + if (values) c(kc) = a(ka) + ka = ka+1 + kc = kc+1 + else if (j1 .gt. j2) then + jc(kc) = j2 + if (values) c(kc) = b(kb) + kb = kb+1 + kc = kc+1 + endif + if (ka .le. kamax .or. kb .le. kbmax) goto 5 + ic(i+1) = kc + 6 continue + return + 999 ierr = i + return +c------------end-of-aplb1----------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine aplsb (nrow,ncol,a,ja,ia,s,b,jb,ib,c,jc,ic, + * nzmax,ierr) + real*8 a(*), b(*), c(*), s + integer ja(*),jb(*),jc(*),ia(nrow+1),ib(nrow+1),ic(nrow+1) +c----------------------------------------------------------------------- +c performs the operation C = A+s B for matrices in sorted CSR format. +c the difference with aplsb is that the resulting matrix is such that +c the elements of each row are sorted with increasing column indices in +c each row, provided the original matrices are sorted in the same way. +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A and B +c ncol = integer. The column dimension of A and B. +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format with entries sorted +c +c s = real. scalar factor for B. +c +c b, +c jb, +c ib = Matrix B in compressed sparse row format with entries sorted +c ascendly in each row +c +c nzmax = integer. The length of the arrays c and jc. +c amub will stop if the result matrix C has a number +c of elements that exceeds exceeds nzmax. See ierr. +c +c on return: +c---------- +c c, +c jc, +c ic = resulting matrix C in compressed sparse row sparse format +c with entries sorted ascendly in each row. +c +c ierr = integer. serving as error message. +c ierr = 0 means normal return, +c ierr .gt. 0 means that amub stopped while computing the +c i-th row of C with i=ierr, because the number +c of elements in C exceeds nzmax. +c +c Notes: +c------- +c this will not work if any of the two input matrices is not sorted +c----------------------------------------------------------------------- + ierr = 0 + kc = 1 + ic(1) = kc +c +c the following loop does a merge of two sparse rows + adds them. +c + do 6 i=1, nrow + ka = ia(i) + kb = ib(i) + kamax = ia(i+1)-1 + kbmax = ib(i+1)-1 + 5 continue +c +c this is a while -- do loop -- +c + if (ka .le. kamax .or. kb .le. kbmax) then +c + if (ka .le. kamax) then + j1 = ja(ka) + else +c take j1 large enough that always j2 .lt. j1 + j1 = ncol+1 + endif + if (kb .le. kbmax) then + j2 = jb(kb) + else +c similarly take j2 large enough that always j1 .lt. j2 + j2 = ncol+1 + endif +c +c three cases +c + if (kc .gt. nzmax) goto 999 + if (j1 .eq. j2) then + c(kc) = a(ka)+s*b(kb) + jc(kc) = j1 + ka = ka+1 + kb = kb+1 + kc = kc+1 + else if (j1 .lt. j2) then + jc(kc) = j1 + c(kc) = a(ka) + ka = ka+1 + kc = kc+1 + else if (j1 .gt. j2) then + jc(kc) = j2 + c(kc) = s*b(kb) + kb = kb+1 + kc = kc+1 + endif + goto 5 +c +c end while loop +c + endif + ic(i+1) = kc + 6 continue + return + 999 ierr = i + return +c------------end-of-aplsb --------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine aplsb1 (nrow,ncol,a,ja,ia,s,b,jb,ib,c,jc,ic, + * nzmax,ierr) + real*8 a(*), b(*), c(*), s + integer ja(*),jb(*),jc(*),ia(nrow+1),ib(nrow+1),ic(nrow+1) +c----------------------------------------------------------------------- +c performs the operation C = A+s B for matrices in sorted CSR format. +c the difference with aplsb is that the resulting matrix is such that +c the elements of each row are sorted with increasing column indices in +c each row, provided the original matrices are sorted in the same way. +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A and B +c ncol = integer. The column dimension of A and B. +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format with entries sorted +c +c s = real. scalar factor for B. +c +c b, +c jb, +c ib = Matrix B in compressed sparse row format with entries sorted +c ascendly in each row +c +c nzmax = integer. The length of the arrays c and jc. +c amub will stop if the result matrix C has a number +c of elements that exceeds exceeds nzmax. See ierr. +c +c on return: +c---------- +c c, +c jc, +c ic = resulting matrix C in compressed sparse row sparse format +c with entries sorted ascendly in each row. +c +c ierr = integer. serving as error message. +c ierr = 0 means normal return, +c ierr .gt. 0 means that amub stopped while computing the +c i-th row of C with i=ierr, because the number +c of elements in C exceeds nzmax. +c +c Notes: +c------- +c this will not work if any of the two input matrices is not sorted +c----------------------------------------------------------------------- + ierr = 0 + kc = 1 + ic(1) = kc +c +c the following loop does a merge of two sparse rows + adds them. +c + do 6 i=1, nrow + ka = ia(i) + kb = ib(i) + kamax = ia(i+1)-1 + kbmax = ib(i+1)-1 + 5 continue +c +c this is a while -- do loop -- +c + if (ka .le. kamax .or. kb .le. kbmax) then +c + if (ka .le. kamax) then + j1 = ja(ka) + else +c take j1 large enough that always j2 .lt. j1 + j1 = ncol+1 + endif + if (kb .le. kbmax) then + j2 = jb(kb) + else +c similarly take j2 large enough that always j1 .lt. j2 + j2 = ncol+1 + endif +c +c three cases +c + if (j1 .eq. j2) then + c(kc) = a(ka)+s*b(kb) + jc(kc) = j1 + ka = ka+1 + kb = kb+1 + kc = kc+1 + else if (j1 .lt. j2) then + jc(kc) = j1 + c(kc) = a(ka) + ka = ka+1 + kc = kc+1 + else if (j1 .gt. j2) then + jc(kc) = j2 + c(kc) = s*b(kb) + kb = kb+1 + kc = kc+1 + endif + if (kc .gt. nzmax) goto 999 + goto 5 +c +c end while loop +c + endif + ic(i+1) = kc + 6 continue + return + 999 ierr = i + return +c------------end-of-aplsb1 --------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine apmbt (nrow,ncol,job,a,ja,ia,b,jb,ib, + * c,jc,ic,nzmax,iw,ierr) + real*8 a(*), b(*), c(*) + integer ja(*),jb(*),jc(*),ia(nrow+1),ib(ncol+1),ic(*),iw(*) +c----------------------------------------------------------------------- +c performs the matrix sum C = A + transp(B) or C = A - transp(B) +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A and transp(B) +c ncol = integer. The column dimension of A. Also the row +c dimension of B. +c +c job = integer. if job = -1, apmbt will compute C= A - transp(B) +c (structure + values) +c if (job .eq. 1) it will compute C=A+transp(A) +c (structure+ values) +c if (job .eq. 0) it will compute the structure of +c C= A+/-transp(B) only (ignoring all real values). +c any other value of job will be treated as job=1 +c a, +c ja, +c ia = Matrix A in compressed sparse row format. +c +c b, +c jb, +c ib = Matrix B in compressed sparse row format. +c +c nzmax = integer. The length of the arrays c, jc, and ic. +c amub will stop if the result matrix C has a number +c of elements that exceeds exceeds nzmax. See ierr. +c +c on return: +c---------- +c c, +c jc, +c ic = resulting matrix C in compressed sparse row format. +c +c ierr = integer. serving as error message. +c ierr = 0 means normal return. +c ierr = -1 means that nzmax was .lt. either the number of +c nonzero elements of A or the number of nonzero elements in B. +c ierr .gt. 0 means that amub stopped while computing the +c i-th row of C with i=ierr, because the number +c of elements in C exceeds nzmax. +c +c work arrays: +c------------ +c iw = integer work array of length at least max(ncol,nrow) +c +c Notes: +c------- It is important to note that here all of three arrays c, ic, +c and jc are assumed to be of length nnz(c). This is because +c the matrix is internally converted in coordinate format. +c +c----------------------------------------------------------------------- + logical values + values = (job .ne. 0) +c + ierr = 0 + do 1 j=1, ncol + iw(j) = 0 + 1 continue +c + nnza = ia(nrow+1)-1 + nnzb = ib(ncol+1)-1 + len = nnzb + if (nzmax .lt. nnzb .or. nzmax .lt. nnza) then + ierr = -1 + return + endif +c +c trasnpose matrix b into c +c + ljob = 0 + if (values) ljob = 1 + ipos = 1 + call csrcsc (ncol,ljob,ipos,b,jb,ib,c,jc,ic) +c----------------------------------------------------------------------- + if (job .eq. -1) then + do 2 k=1,len + c(k) = -c(k) + 2 continue + endif +c +c--------------- main loop -------------------------------------------- +c + do 500 ii=1, nrow + do 200 k = ic(ii),ic(ii+1)-1 + iw(jc(k)) = k + 200 continue +c----------------------------------------------------------------------- + do 300 ka = ia(ii), ia(ii+1)-1 + jcol = ja(ka) + jpos = iw(jcol) + if (jpos .eq. 0) then +c +c if fill-in append in coordinate format to matrix. +c + len = len+1 + if (len .gt. nzmax) goto 999 + jc(len) = jcol + + ic(len) = ii + if (values) c(len) = a(ka) + else +c else do addition. + if (values) c(jpos) = c(jpos) + a(ka) + endif + 300 continue + do 301 k=ic(ii), ic(ii+1)-1 + iw(jc(k)) = 0 + 301 continue + 500 continue +c +c convert first part of matrix (without fill-ins) into coo format +c + ljob = 2 + if (values) ljob = 3 + do 501 i=1, nrow+1 + iw(i) = ic(i) + 501 continue + call csrcoo (nrow,ljob,nnzb,c,jc,iw,nnzb,c,ic,jc,ierr) +c +c convert the whole thing back to csr format. +c + ljob = 0 + if (values) ljob = 1 + call coicsr (nrow,len,ljob,c,jc,ic,iw) + return + 999 ierr = ii + return +c--------end-of-apmbt--------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine aplsbt(nrow,ncol,a,ja,ia,s,b,jb,ib, + * c,jc,ic,nzmax,iw,ierr) + real*8 a(*), b(*), c(*), s + integer ja(*),jb(*),jc(*),ia(nrow+1),ib(ncol+1),ic(*),iw(*) +c----------------------------------------------------------------------- +c performs the matrix sum C = A + transp(B). +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A and transp(B) +c ncol = integer. The column dimension of A. Also the row +c dimension of B. +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format. +c +c s = real. scalar factor for B. +c +c +c b, +c jb, +c ib = Matrix B in compressed sparse row format. +c +c nzmax = integer. The length of the arrays c, jc, and ic. +c amub will stop if the result matrix C has a number +c of elements that exceeds exceeds nzmax. See ierr. +c +c on return: +c---------- +c c, +c jc, +c ic = resulting matrix C in compressed sparse row format. +c +c ierr = integer. serving as error message. +c ierr = 0 means normal return. +c ierr = -1 means that nzmax was .lt. either the number of +c nonzero elements of A or the number of nonzero elements in B. +c ierr .gt. 0 means that amub stopped while computing the +c i-th row of C with i=ierr, because the number +c of elements in C exceeds nzmax. +c +c work arrays: +c------------ +c iw = integer work array of length at least max(nrow,ncol) +c +c Notes: +c------- It is important to note that here all of three arrays c, ic, +c and jc are assumed to be of length nnz(c). This is because +c the matrix is internally converted in coordinate format. +c +c----------------------------------------------------------------------- + ierr = 0 + do 1 j=1, ncol + iw(j) = 0 + 1 continue +c + nnza = ia(nrow+1)-1 + nnzb = ib(ncol+1)-1 + len = nnzb + if (nzmax .lt. nnzb .or. nzmax .lt. nnza) then + ierr = -1 + return + endif +c +c transpose matrix b into c +c + ljob = 1 + ipos = 1 + call csrcsc (ncol,ljob,ipos,b,jb,ib,c,jc,ic) + do 2 k=1,len + 2 c(k) = c(k)*s +c +c main loop. add rows from ii = 1 to nrow. +c + do 500 ii=1, nrow +c iw is used as a system to recognize whether there +c was a nonzero element in c. + do 200 k = ic(ii),ic(ii+1)-1 + iw(jc(k)) = k + 200 continue +c + do 300 ka = ia(ii), ia(ii+1)-1 + jcol = ja(ka) + jpos = iw(jcol) + if (jpos .eq. 0) then +c +c if fill-in append in coordinate format to matrix. +c + len = len+1 + if (len .gt. nzmax) goto 999 + jc(len) = jcol + ic(len) = ii + c(len) = a(ka) + else +c else do addition. + c(jpos) = c(jpos) + a(ka) + endif + 300 continue + do 301 k=ic(ii), ic(ii+1)-1 + iw(jc(k)) = 0 + 301 continue + 500 continue +c +c convert first part of matrix (without fill-ins) into coo format +c + ljob = 3 + do 501 i=1, nrow+1 + iw(i) = ic(i) + 501 continue + call csrcoo (nrow,ljob,nnzb,c,jc,iw,nnzb,c,ic,jc,ierr) +c +c convert the whole thing back to csr format. +c + ljob = 1 + call coicsr (nrow,len,ljob,c,jc,ic,iw) + return + 999 ierr = ii + return +c--------end-of-aplsbt-------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine diamua (nrow,job, a, ja, ia, diag, b, jb, ib) + real*8 a(*), b(*), diag(nrow), scal + integer ja(*),jb(*), ia(nrow+1),ib(nrow+1) +c----------------------------------------------------------------------- +c performs the matrix by matrix product B = Diag * A (in place) +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A +c +c job = integer. job indicator. Job=0 means get array b only +c job = 1 means get b, and the integer arrays ib, jb. +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format. +c +c diag = diagonal matrix stored as a vector dig(1:n) +c +c on return: +c---------- +c +c b, +c jb, +c ib = resulting matrix B in compressed sparse row sparse format. +c +c Notes: +c------- +c 1) The column dimension of A is not needed. +c 2) algorithm in place (B can take the place of A). +c in this case use job=0. +c----------------------------------------------------------------- + do 1 ii=1,nrow +c +c normalize each row +c + k1 = ia(ii) + k2 = ia(ii+1)-1 + scal = diag(ii) + do 2 k=k1, k2 + b(k) = a(k)*scal + 2 continue + 1 continue +c + if (job .eq. 0) return +c + do 3 ii=1, nrow+1 + ib(ii) = ia(ii) + 3 continue + do 31 k=ia(1), ia(nrow+1) -1 + jb(k) = ja(k) + 31 continue + return +c----------end-of-diamua------------------------------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine amudia (nrow,job, a, ja, ia, diag, b, jb, ib) + real*8 a(*), b(*), diag(nrow) + integer ja(*),jb(*), ia(nrow+1),ib(nrow+1) +c----------------------------------------------------------------------- +c performs the matrix by matrix product B = A * Diag (in place) +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A +c +c job = integer. job indicator. Job=0 means get array b only +c job = 1 means get b, and the integer arrays ib, jb. +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format. +c +c diag = diagonal matrix stored as a vector dig(1:n) +c +c on return: +c---------- +c +c b, +c jb, +c ib = resulting matrix B in compressed sparse row sparse format. +c +c Notes: +c------- +c 1) The column dimension of A is not needed. +c 2) algorithm in place (B can take the place of A). +c----------------------------------------------------------------- + do 1 ii=1,nrow +c +c scale each element +c + k1 = ia(ii) + k2 = ia(ii+1)-1 + do 2 k=k1, k2 + b(k) = a(k)*diag(ja(k)) + 2 continue + 1 continue +c + if (job .eq. 0) return +c + do 3 ii=1, nrow+1 + ib(ii) = ia(ii) + 3 continue + do 31 k=ia(1), ia(nrow+1) -1 + jb(k) = ja(k) + 31 continue + return +c----------------------------------------------------------------------- +c-----------end-of-amudiag---------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine aplsca (nrow, a, ja, ia, scal,iw) + real*8 a(*), scal + integer ja(*), ia(nrow+1),iw(*) +c----------------------------------------------------------------------- +c Adds a scalar to the diagonal entries of a sparse matrix A :=A + s I +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format. +c +c scal = real. scalar to add to the diagonal entries. +c +c on return: +c---------- +c +c a, +c ja, +c ia = matrix A with diagonal elements shifted (or created). +c +c iw = integer work array of length n. On return iw will +c contain the positions of the diagonal entries in the +c output matrix. (i.e., a(iw(k)), ja(iw(k)), k=1,...n, +c are the values/column indices of the diagonal elements +c of the output matrix. ). +c +c Notes: +c------- +c The column dimension of A is not needed. +c important: the matrix a may be expanded slightly to allow for +c additions of nonzero elements to previously nonexisting diagonals. +c The is no checking as to whether there is enough space appended +c to the arrays a and ja. if not sure allow for n additional +c elemnts. +c coded by Y. Saad. Latest version July, 19, 1990 +c----------------------------------------------------------------------- + logical test +c + call diapos (nrow,ja,ia,iw) + icount = 0 + do 1 j=1, nrow + if (iw(j) .eq. 0) then + icount = icount+1 + else + a(iw(j)) = a(iw(j)) + scal + endif + 1 continue +c +c if no diagonal elements to insert in data structure return. +c + if (icount .eq. 0) return +c +c shift the nonzero elements if needed, to allow for created +c diagonal elements. +c + ko = ia(nrow+1)+icount +c +c copy rows backward +c + do 5 ii=nrow, 1, -1 +c +c go through row ii +c + k1 = ia(ii) + k2 = ia(ii+1)-1 + ia(ii+1) = ko + test = (iw(ii) .eq. 0) + do 4 k = k2,k1,-1 + j = ja(k) + if (test .and. (j .lt. ii)) then + test = .false. + ko = ko - 1 + a(ko) = scal + ja(ko) = ii + iw(ii) = ko + endif + ko = ko-1 + a(ko) = a(k) + ja(ko) = j + 4 continue +c diagonal element has not been added yet. + if (test) then + ko = ko-1 + a(ko) = scal + ja(ko) = ii + iw(ii) = ko + endif + 5 continue + ia(1) = ko + return +c----------------------------------------------------------------------- +c----------end-of-aplsca------------------------------------------------ + end +c----------------------------------------------------------------------- + subroutine apldia (nrow, job, a, ja, ia, diag, b, jb, ib, iw) + real*8 a(*), b(*), diag(nrow) + integer ja(*),jb(*), ia(nrow+1),ib(nrow+1), iw(*) +c----------------------------------------------------------------------- +c Adds a diagonal matrix to a general sparse matrix: B = A + Diag +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A +c +c job = integer. job indicator. Job=0 means get array b only +c (i.e. assume that a has already been copied into array b, +c or that algorithm is used in place. ) For all practical +c purposes enter job=0 for an in-place call and job=1 otherwise +c +c Note: in case there are missing diagonal elements in A, +c then the option job =0 will be ignored, since the algorithm +c must modify the data structure (i.e. jb, ib) in this +c situation. +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format. +c +c diag = diagonal matrix stored as a vector dig(1:n) +c +c on return: +c---------- +c +c b, +c jb, +c ib = resulting matrix B in compressed sparse row sparse format. +c +c +c iw = integer work array of length n. On return iw will +c contain the positions of the diagonal entries in the +c output matrix. (i.e., a(iw(k)), ja(iw(k)), k=1,...n, +c are the values/column indices of the diagonal elements +c of the output matrix. ). +c +c Notes: +c------- +c 1) The column dimension of A is not needed. +c 2) algorithm in place (b, jb, ib, can be the same as +c a, ja, ia, on entry). See comments for parameter job. +c +c coded by Y. Saad. Latest version July, 19, 1990 +c----------------------------------------------------------------- + logical test +c +c copy integer arrays into b's data structure if required +c + if (job .ne. 0) then + nnz = ia(nrow+1)-1 + do 2 k=1, nnz + jb(k) = ja(k) + b(k) = a(k) + 2 continue + do 3 k=1, nrow+1 + ib(k) = ia(k) + 3 continue + endif +c +c get positions of diagonal elements in data structure. +c + call diapos (nrow,ja,ia,iw) +c +c count number of holes in diagonal and add diag(*) elements to +c valid diagonal entries. +c + icount = 0 + do 1 j=1, nrow + if (iw(j) .eq. 0) then + icount = icount+1 + else + b(iw(j)) = a(iw(j)) + diag(j) + endif + 1 continue +c +c if no diagonal elements to insert return +c + if (icount .eq. 0) return +c +c shift the nonzero elements if needed, to allow for created +c diagonal elements. +c + ko = ib(nrow+1)+icount +c +c copy rows backward +c + do 5 ii=nrow, 1, -1 +c +c go through row ii +c + k1 = ib(ii) + k2 = ib(ii+1)-1 + ib(ii+1) = ko + test = (iw(ii) .eq. 0) + do 4 k = k2,k1,-1 + j = jb(k) + if (test .and. (j .lt. ii)) then + test = .false. + ko = ko - 1 + b(ko) = diag(ii) + jb(ko) = ii + iw(ii) = ko + endif + ko = ko-1 + b(ko) = a(k) + jb(ko) = j + 4 continue +c diagonal element has not been added yet. + if (test) then + ko = ko-1 + b(ko) = diag(ii) + jb(ko) = ii + iw(ii) = ko + endif + 5 continue + ib(1) = ko + return +c----------------------------------------------------------------------- +c------------end-of-apldiag--------------------------------------------- + end diff --git a/BLASSM/makefile b/BLASSM/makefile new file mode 100644 index 0000000..7fa9ff7 --- /dev/null +++ b/BLASSM/makefile @@ -0,0 +1,21 @@ +FFLAGS = +F77 = f77 + +#F77 = cf77 +#FFLAGS = -Wf"-dp" + +mvec.ex: rmatvec.o ../MATGEN/FDIF/functns.o ../libskit.a + $(F77) $(FFLAGS) -o mvec.ex rmatvec.o ../MATGEN/FDIF/functns.o ../libskit.a + +tester.ex: tester.o ../MATGEN/FDIF/functns.o ../libskit.a + $(F77) $(FFLAGS) -o tester.ex tester.o ../MATGEN/FDIF/functns.o ../libskit.a + +clean: + rm -f *.o *.ex core *.trace fort.* ftn?? + +../MATGEN/FDIF/functns.o: + (cd ../MATGEN/FDIF; $(F77) $(FFLAGS) -c functns.f) + +../libskit.a: + (cd ..; $(MAKE) $(MAKEFLAGS) libskit.a) + diff --git a/BLASSM/matvec.f b/BLASSM/matvec.f new file mode 100644 index 0000000..60cbb9f --- /dev/null +++ b/BLASSM/matvec.f @@ -0,0 +1,830 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c BASIC MATRIX-VECTOR OPERATIONS - MATVEC MODULE c +c Matrix-vector Mulitiplications and Triang. Solves c +c----------------------------------------------------------------------c +c contents: (as of Nov 18, 1991) c +c---------- c +c 1) Matrix-vector products: c +c--------------------------- c +c amux : A times a vector. Compressed Sparse Row (CSR) format. c +c amuxms: A times a vector. Modified Compress Sparse Row format. c +c atmux : Transp(A) times a vector. CSR format. c +c atmuxr: Transp(A) times a vector. CSR format. A rectangular. c +c amuxe : A times a vector. Ellpack/Itpack (ELL) format. c +c amuxd : A times a vector. Diagonal (DIA) format. c +c amuxj : A times a vector. Jagged Diagonal (JAD) format. c +c vbrmv : Sparse matrix-full vector product, in VBR format c +c c +c 2) Triangular system solutions: c +c------------------------------- c +c lsol : Unit Lower Triang. solve. Compressed Sparse Row (CSR) format.c +c ldsol : Lower Triang. solve. Modified Sparse Row (MSR) format. c +c lsolc : Unit Lower Triang. solve. Comp. Sparse Column (CSC) format. c +c ldsolc: Lower Triang. solve. Modified Sparse Column (MSC) format. c +c ldsoll: Lower Triang. solve with level scheduling. MSR format. c +c usol : Unit Upper Triang. solve. Compressed Sparse Row (CSR) format.c +c udsol : Upper Triang. solve. Modified Sparse Row (MSR) format. c +c usolc : Unit Upper Triang. solve. Comp. Sparse Column (CSC) format. c +c udsolc: Upper Triang. solve. Modified Sparse Column (MSC) format. c +c----------------------------------------------------------------------c +c 1) M A T R I X B Y V E C T O R P R O D U C T S c +c----------------------------------------------------------------------c + subroutine amux (n, x, y, a,ja,ia) + real*8 x(*), y(*), a(*) + integer n, ja(*), ia(*) +c----------------------------------------------------------------------- +c A times a vector +c----------------------------------------------------------------------- +c multiplies a matrix by a vector using the dot product form +c Matrix A is stored in compressed sparse row storage. +c +c on entry: +c---------- +c n = row dimension of A +c x = real array of length equal to the column dimension of +c the A matrix. +c a, ja, +c ia = input matrix in compressed sparse row format. +c +c on return: +c----------- +c y = real array of length n, containing the product y=Ax +c +c----------------------------------------------------------------------- +c local variables +c + real*8 t + integer i, k +c----------------------------------------------------------------------- + do 100 i = 1,n +c +c compute the inner product of row i with vector x +c + t = 0.0d0 + do 99 k=ia(i), ia(i+1)-1 + t = t + a(k)*x(ja(k)) + 99 continue +c +c store result in y(i) +c + y(i) = t + 100 continue +c + return +c---------end-of-amux--------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine amuxms (n, x, y, a,ja) + real*8 x(*), y(*), a(*) + integer n, ja(*) +c----------------------------------------------------------------------- +c A times a vector in MSR format +c----------------------------------------------------------------------- +c multiplies a matrix by a vector using the dot product form +c Matrix A is stored in Modified Sparse Row storage. +c +c on entry: +c---------- +c n = row dimension of A +c x = real array of length equal to the column dimension of +c the A matrix. +c a, ja,= input matrix in modified compressed sparse row format. +c +c on return: +c----------- +c y = real array of length n, containing the product y=Ax +c +c----------------------------------------------------------------------- +c local variables +c + integer i, k +c----------------------------------------------------------------------- + do 10 i=1, n + y(i) = a(i)*x(i) + 10 continue + do 100 i = 1,n +c +c compute the inner product of row i with vector x +c + do 99 k=ja(i), ja(i+1)-1 + y(i) = y(i) + a(k) *x(ja(k)) + 99 continue + 100 continue +c + return +c---------end-of-amuxm-------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine atmux (n, x, y, a, ja, ia) + real*8 x(*), y(*), a(*) + integer n, ia(*), ja(*) +c----------------------------------------------------------------------- +c transp( A ) times a vector +c----------------------------------------------------------------------- +c multiplies the transpose of a matrix by a vector when the original +c matrix is stored in compressed sparse row storage. Can also be +c viewed as the product of a matrix by a vector when the original +c matrix is stored in the compressed sparse column format. +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c n = row dimension of A +c x = real array of length equal to the column dimension of +c the A matrix. +c a, ja, +c ia = input matrix in compressed sparse row format. +c +c on return: +c----------- +c y = real array of length n, containing the product y=transp(A)*x +c +c----------------------------------------------------------------------- +c local variables +c + integer i, k +c----------------------------------------------------------------------- +c +c zero out output vector +c + do 1 i=1,n + y(i) = 0.0 + 1 continue +c +c loop over the rows +c + do 100 i = 1,n + do 99 k=ia(i), ia(i+1)-1 + y(ja(k)) = y(ja(k)) + x(i)*a(k) + 99 continue + 100 continue +c + return +c-------------end-of-atmux---------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine atmuxr (m, n, x, y, a, ja, ia) + real*8 x(*), y(*), a(*) + integer m, n, ia(*), ja(*) +c----------------------------------------------------------------------- +c transp( A ) times a vector, A can be rectangular +c----------------------------------------------------------------------- +c See also atmux. The essential difference is how the solution vector +c is initially zeroed. If using this to multiply rectangular CSC +c matrices by a vector, m number of rows, n is number of columns. +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c m = column dimension of A +c n = row dimension of A +c x = real array of length equal to the column dimension of +c the A matrix. +c a, ja, +c ia = input matrix in compressed sparse row format. +c +c on return: +c----------- +c y = real array of length n, containing the product y=transp(A)*x +c +c----------------------------------------------------------------------- +c local variables +c + integer i, k +c----------------------------------------------------------------------- +c +c zero out output vector +c + do 1 i=1,m + y(i) = 0.0 + 1 continue +c +c loop over the rows +c + do 100 i = 1,n + do 99 k=ia(i), ia(i+1)-1 + y(ja(k)) = y(ja(k)) + x(i)*a(k) + 99 continue + 100 continue +c + return +c-------------end-of-atmuxr--------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine amuxe (n,x,y,na,ncol,a,ja) + real*8 x(n), y(n), a(na,*) + integer n, na, ncol, ja(na,*) +c----------------------------------------------------------------------- +c A times a vector in Ellpack Itpack format (ELL) +c----------------------------------------------------------------------- +c multiplies a matrix by a vector when the original matrix is stored +c in the ellpack-itpack sparse format. +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c n = row dimension of A +c x = real array of length equal to the column dimension of +c the A matrix. +c na = integer. The first dimension of arrays a and ja +c as declared by the calling program. +c ncol = integer. The number of active columns in array a. +c (i.e., the number of generalized diagonals in matrix.) +c a, ja = the real and integer arrays of the itpack format +c (a(i,k),k=1,ncol contains the elements of row i in matrix +c ja(i,k),k=1,ncol contains their column numbers) +c +c on return: +c----------- +c y = real array of length n, containing the product y=y=A*x +c +c----------------------------------------------------------------------- +c local variables +c + integer i, j +c----------------------------------------------------------------------- + do 1 i=1, n + y(i) = 0.0 + 1 continue + do 10 j=1,ncol + do 25 i = 1,n + y(i) = y(i)+a(i,j)*x(ja(i,j)) + 25 continue + 10 continue +c + return +c--------end-of-amuxe--------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine amuxd (n,x,y,diag,ndiag,idiag,ioff) + integer n, ndiag, idiag, ioff(idiag) + real*8 x(n), y(n), diag(ndiag,idiag) +c----------------------------------------------------------------------- +c A times a vector in Diagonal storage format (DIA) +c----------------------------------------------------------------------- +c multiplies a matrix by a vector when the original matrix is stored +c in the diagonal storage format. +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c n = row dimension of A +c x = real array of length equal to the column dimension of +c the A matrix. +c ndiag = integer. The first dimension of array adiag as declared in +c the calling program. +c idiag = integer. The number of diagonals in the matrix. +c diag = real array containing the diagonals stored of A. +c idiag = number of diagonals in matrix. +c diag = real array of size (ndiag x idiag) containing the diagonals +c +c ioff = integer array of length idiag, containing the offsets of the +c diagonals of the matrix: +c diag(i,k) contains the element a(i,i+ioff(k)) of the matrix. +c +c on return: +c----------- +c y = real array of length n, containing the product y=A*x +c +c----------------------------------------------------------------------- +c local variables +c + integer j, k, io, i1, i2 +c----------------------------------------------------------------------- + do 1 j=1, n + y(j) = 0.0d0 + 1 continue + do 10 j=1, idiag + io = ioff(j) + i1 = max0(1,1-io) + i2 = min0(n,n-io) + do 9 k=i1, i2 + y(k) = y(k)+diag(k,j)*x(k+io) + 9 continue + 10 continue +c + return +c----------end-of-amuxd------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine amuxj (n, x, y, jdiag, a, ja, ia) + integer n, jdiag, ja(*), ia(*) + real*8 x(n), y(n), a(*) +c----------------------------------------------------------------------- +c A times a vector in Jagged-Diagonal storage format (JAD) +c----------------------------------------------------------------------- +c multiplies a matrix by a vector when the original matrix is stored +c in the jagged diagonal storage format. +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c n = row dimension of A +c x = real array of length equal to the column dimension of +c the A matrix. +c jdiag = integer. The number of jadded-diagonals in the data-structure. +c a = real array containing the jadded diagonals of A stored +c in succession (in decreasing lengths) +c j = integer array containing the colum indices of the +c corresponding elements in a. +c ia = integer array containing the lengths of the jagged diagonals +c +c on return: +c----------- +c y = real array of length n, containing the product y=A*x +c +c Note: +c------- +c Permutation related to the JAD format is not performed. +c this can be done by: +c call permvec (n,y,y,iperm) +c after the call to amuxj, where iperm is the permutation produced +c by csrjad. +c----------------------------------------------------------------------- +c local variables +c + integer i, ii, k1, len, j +c----------------------------------------------------------------------- + do 1 i=1, n + y(i) = 0.0d0 + 1 continue + do 70 ii=1, jdiag + k1 = ia(ii)-1 + len = ia(ii+1)-k1-1 + do 60 j=1,len + y(j)= y(j)+a(k1+j)*x(ja(k1+j)) + 60 continue + 70 continue +c + return +c----------end-of-amuxj------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine vbrmv(nr, nc, ia, ja, ka, a, kvstr, kvstc, x, b) +c----------------------------------------------------------------------- + integer nr, nc, ia(nr+1), ja(*), ka(*), kvstr(nr+1), kvstc(*) + real*8 a(*), x(*), b(*) +c----------------------------------------------------------------------- +c Sparse matrix-full vector product, in VBR format. +c----------------------------------------------------------------------- +c On entry: +c-------------- +c nr, nc = number of block rows and columns in matrix A +c ia,ja,ka,a,kvstr,kvstc = matrix A in variable block row format +c x = multiplier vector in full format +c +c On return: +c--------------- +c b = product of matrix A times vector x in full format +c +c Algorithm: +c--------------- +c Perform multiplication by traversing a in order. +c +c----------------------------------------------------------------------- +c-----local variables + integer n, i, j, ii, jj, k, istart, istop + real*8 xjj +c--------------------------------- + n = kvstc(nc+1)-1 + do i = 1, n + b(i) = 0.d0 + enddo +c--------------------------------- + k = 1 + do i = 1, nr + istart = kvstr(i) + istop = kvstr(i+1)-1 + do j = ia(i), ia(i+1)-1 + do jj = kvstc(ja(j)), kvstc(ja(j)+1)-1 + xjj = x(jj) + do ii = istart, istop + b(ii) = b(ii) + xjj*a(k) + k = k + 1 + enddo + enddo + enddo + enddo +c--------------------------------- + return + end +c----------------------------------------------------------------------- +c----------------------end-of-vbrmv------------------------------------- +c----------------------------------------------------------------------- +c----------------------------------------------------------------------c +c 2) T R I A N G U L A R S Y S T E M S O L U T I O N S c +c----------------------------------------------------------------------c + subroutine lsol (n,x,y,al,jal,ial) + integer n, jal(*),ial(n+1) + real*8 x(n), y(n), al(*) +c----------------------------------------------------------------------- +c solves L x = y ; L = lower unit triang. / CSR format +c----------------------------------------------------------------------- +c solves a unit lower triangular system by standard (sequential ) +c forward elimination - matrix stored in CSR format. +c----------------------------------------------------------------------- +c +c On entry: +c---------- +c n = integer. dimension of problem. +c y = real array containg the right side. +c +c al, +c jal, +c ial, = Lower triangular matrix stored in compressed sparse row +c format. +c +c On return: +c----------- +c x = The solution of L x = y. +c-------------------------------------------------------------------- +c local variables +c + integer k, j + real*8 t +c----------------------------------------------------------------------- + x(1) = y(1) + do 150 k = 2, n + t = y(k) + do 100 j = ial(k), ial(k+1)-1 + t = t-al(j)*x(jal(j)) + 100 continue + x(k) = t + 150 continue +c + return +c----------end-of-lsol-------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine ldsol (n,x,y,al,jal) + integer n, jal(*) + real*8 x(n), y(n), al(*) +c----------------------------------------------------------------------- +c Solves L x = y L = triangular. MSR format +c----------------------------------------------------------------------- +c solves a (non-unit) lower triangular system by standard (sequential) +c forward elimination - matrix stored in MSR format +c with diagonal elements already inverted (otherwise do inversion, +c al(1:n) = 1.0/al(1:n), before calling ldsol). +c----------------------------------------------------------------------- +c +c On entry: +c---------- +c n = integer. dimension of problem. +c y = real array containg the right hand side. +c +c al, +c jal, = Lower triangular matrix stored in Modified Sparse Row +c format. +c +c On return: +c----------- +c x = The solution of L x = y . +c-------------------------------------------------------------------- +c local variables +c + integer k, j + real*8 t +c----------------------------------------------------------------------- + x(1) = y(1)*al(1) + do 150 k = 2, n + t = y(k) + do 100 j = jal(k), jal(k+1)-1 + t = t - al(j)*x(jal(j)) + 100 continue + x(k) = al(k)*t + 150 continue + return +c----------end-of-ldsol------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine lsolc (n,x,y,al,jal,ial) + integer n, jal(*),ial(*) + real*8 x(n), y(n), al(*) +c----------------------------------------------------------------------- +c SOLVES L x = y ; where L = unit lower trang. CSC format +c----------------------------------------------------------------------- +c solves a unit lower triangular system by standard (sequential ) +c forward elimination - matrix stored in CSC format. +c----------------------------------------------------------------------- +c +c On entry: +c---------- +c n = integer. dimension of problem. +c y = real*8 array containg the right side. +c +c al, +c jal, +c ial, = Lower triangular matrix stored in compressed sparse column +c format. +c +c On return: +c----------- +c x = The solution of L x = y. +c----------------------------------------------------------------------- +c local variables +c + integer k, j + real*8 t +c----------------------------------------------------------------------- + do 140 k=1,n + x(k) = y(k) + 140 continue + do 150 k = 1, n-1 + t = x(k) + do 100 j = ial(k), ial(k+1)-1 + x(jal(j)) = x(jal(j)) - t*al(j) + 100 continue + 150 continue +c + return +c----------end-of-lsolc------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine ldsolc (n,x,y,al,jal) + integer n, jal(*) + real*8 x(n), y(n), al(*) +c----------------------------------------------------------------------- +c Solves L x = y ; L = nonunit Low. Triang. MSC format +c----------------------------------------------------------------------- +c solves a (non-unit) lower triangular system by standard (sequential) +c forward elimination - matrix stored in Modified Sparse Column format +c with diagonal elements already inverted (otherwise do inversion, +c al(1:n) = 1.0/al(1:n), before calling ldsol). +c----------------------------------------------------------------------- +c +c On entry: +c---------- +c n = integer. dimension of problem. +c y = real array containg the right hand side. +c +c al, +c jal, +c ial, = Lower triangular matrix stored in Modified Sparse Column +c format. +c +c On return: +c----------- +c x = The solution of L x = y . +c-------------------------------------------------------------------- +c local variables +c + integer k, j + real*8 t +c----------------------------------------------------------------------- + do 140 k=1,n + x(k) = y(k) + 140 continue + do 150 k = 1, n + x(k) = x(k)*al(k) + t = x(k) + do 100 j = jal(k), jal(k+1)-1 + x(jal(j)) = x(jal(j)) - t*al(j) + 100 continue + 150 continue +c + return +c----------end-of-lsolc------------------------------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine ldsoll (n,x,y,al,jal,nlev,lev,ilev) + integer n, nlev, jal(*), ilev(nlev+1), lev(n) + real*8 x(n), y(n), al(*) +c----------------------------------------------------------------------- +c Solves L x = y L = triangular. Uses LEVEL SCHEDULING/MSR format +c----------------------------------------------------------------------- +c +c On entry: +c---------- +c n = integer. dimension of problem. +c y = real array containg the right hand side. +c +c al, +c jal, = Lower triangular matrix stored in Modified Sparse Row +c format. +c nlev = number of levels in matrix +c lev = integer array of length n, containing the permutation +c that defines the levels in the level scheduling ordering. +c ilev = pointer to beginning of levels in lev. +c the numbers lev(i) to lev(i+1)-1 contain the row numbers +c that belong to level number i, in the level shcheduling +c ordering. +c +c On return: +c----------- +c x = The solution of L x = y . +c-------------------------------------------------------------------- + integer ii, jrow, i + real*8 t +c +c outer loop goes through the levels. (SEQUENTIAL loop) +c + do 150 ii=1, nlev +c +c next loop executes within the same level. PARALLEL loop +c + do 100 i=ilev(ii), ilev(ii+1)-1 + jrow = lev(i) +c +c compute inner product of row jrow with x +c + t = y(jrow) + do 130 k=jal(jrow), jal(jrow+1)-1 + t = t - al(k)*x(jal(k)) + 130 continue + x(jrow) = t*al(jrow) + 100 continue + 150 continue + return +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine usol (n,x,y,au,jau,iau) + integer n, jau(*),iau(n+1) + real*8 x(n), y(n), au(*) +c----------------------------------------------------------------------- +c Solves U x = y U = unit upper triangular. +c----------------------------------------------------------------------- +c solves a unit upper triangular system by standard (sequential ) +c backward elimination - matrix stored in CSR format. +c----------------------------------------------------------------------- +c +c On entry: +c---------- +c n = integer. dimension of problem. +c y = real array containg the right side. +c +c au, +c jau, +c iau, = Lower triangular matrix stored in compressed sparse row +c format. +c +c On return: +c----------- +c x = The solution of U x = y . +c-------------------------------------------------------------------- +c local variables +c + integer k, j + real*8 t +c----------------------------------------------------------------------- + x(n) = y(n) + do 150 k = n-1,1,-1 + t = y(k) + do 100 j = iau(k), iau(k+1)-1 + t = t - au(j)*x(jau(j)) + 100 continue + x(k) = t + 150 continue +c + return +c----------end-of-usol-------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine udsol (n,x,y,au,jau) + integer n, jau(*) + real*8 x(n), y(n),au(*) +c----------------------------------------------------------------------- +c Solves U x = y ; U = upper triangular in MSR format +c----------------------------------------------------------------------- +c solves a non-unit upper triangular matrix by standard (sequential ) +c backward elimination - matrix stored in MSR format. +c with diagonal elements already inverted (otherwise do inversion, +c au(1:n) = 1.0/au(1:n), before calling). +c----------------------------------------------------------------------- +c +c On entry: +c---------- +c n = integer. dimension of problem. +c y = real array containg the right side. +c +c au, +c jau, = Lower triangular matrix stored in modified sparse row +c format. +c +c On return: +c----------- +c x = The solution of U x = y . +c-------------------------------------------------------------------- +c local variables +c + integer k, j + real*8 t +c----------------------------------------------------------------------- + x(n) = y(n)*au(n) + do 150 k = n-1,1,-1 + t = y(k) + do 100 j = jau(k), jau(k+1)-1 + t = t - au(j)*x(jau(j)) + 100 continue + x(k) = au(k)*t + 150 continue +c + return +c----------end-of-udsol------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine usolc (n,x,y,au,jau,iau) + real*8 x(*), y(*), au(*) + integer n, jau(*),iau(*) +c----------------------------------------------------------------------- +c SOUVES U x = y ; where U = unit upper trang. CSC format +c----------------------------------------------------------------------- +c solves a unit upper triangular system by standard (sequential ) +c forward elimination - matrix stored in CSC format. +c----------------------------------------------------------------------- +c +c On entry: +c---------- +c n = integer. dimension of problem. +c y = real*8 array containg the right side. +c +c au, +c jau, +c iau, = Uower triangular matrix stored in compressed sparse column +c format. +c +c On return: +c----------- +c x = The solution of U x = y. +c----------------------------------------------------------------------- +c local variables +c + integer k, j + real*8 t +c----------------------------------------------------------------------- + do 140 k=1,n + x(k) = y(k) + 140 continue + do 150 k = n,1,-1 + t = x(k) + do 100 j = iau(k), iau(k+1)-1 + x(jau(j)) = x(jau(j)) - t*au(j) + 100 continue + 150 continue +c + return +c----------end-of-usolc------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine udsolc (n,x,y,au,jau) + integer n, jau(*) + real*8 x(n), y(n), au(*) +c----------------------------------------------------------------------- +c Solves U x = y ; U = nonunit Up. Triang. MSC format +c----------------------------------------------------------------------- +c solves a (non-unit) upper triangular system by standard (sequential) +c forward elimination - matrix stored in Modified Sparse Column format +c with diagonal elements already inverted (otherwise do inversion, +c auuuul(1:n) = 1.0/au(1:n), before calling ldsol). +c----------------------------------------------------------------------- +c +c On entry: +c---------- +c n = integer. dimension of problem. +c y = real*8 array containg the right hand side. +c +c au, +c jau, = Upper triangular matrix stored in Modified Sparse Column +c format. +c +c On return: +c----------- +c x = The solution of U x = y . +c-------------------------------------------------------------------- +c local variables +c + integer k, j + real*8 t +c----------------------------------------------------------------------- + do 140 k=1,n + x(k) = y(k) + 140 continue + do 150 k = n,1,-1 + x(k) = x(k)*au(k) + t = x(k) + do 100 j = jau(k), jau(k+1)-1 + x(jau(j)) = x(jau(j)) - t*au(j) + 100 continue + 150 continue +c + return +c----------end-of-udsolc------------------------------------------------ +c----------------------------------------------------------------------- + end diff --git a/BLASSM/rmatvec.f b/BLASSM/rmatvec.f new file mode 100644 index 0000000..c34cbf9 --- /dev/null +++ b/BLASSM/rmatvec.f @@ -0,0 +1,202 @@ + program rmatvec + parameter (nmax=10000, nzmax=80000) + implicit real*8 (a-h,o-z) +c----------------------------------------------------------------------- +c This test program tests all the subroutines in matvec. +c it generates matrices and transforms them in appropriate formats +c and then call the appropriate routines. +c----------------------------------------------------------------------- + integer ia1(nmax), ia2(nmax), ja1(nzmax), ja2(nzmax), + * jad(nzmax), iwk1(nmax), iwk2(nmax), idim(11), ioff(10) + real*8 a1(nzmax), a2(nzmax), + * x(nmax), y(nmax), y0(nmax), y1(nmax), stencil(100) +c common used only to generate nonsymmetric matrices +c common /gam/ gamma, gamma1, cvar + data idim /4, 10, 15, 40, 50, 60, 70, 80, 90, 100, 200 / + data iout /6/ +c +c initialize common gam +c +c gamma = 0.5 +c gamma1 = 1.0 +c cvar = 1.0 +c----------------------------------------------------------------------- +c ii loop corresponds to size of problem +c----------------------------------------------------------------------- + do 100 ii = 1, 3 + write (iout,*) '---------------- ii ',ii,'--------------------' + nfree = 1 + nx = idim(ii) + ny = nx +c----------------------------------------------------------------------- +c jj loop corresponds to 2-D and 3-D problems. +c----------------------------------------------------------------------- + do 150 jj=1, 2 + write (iout,*) ' ----------- jj ',jj,' -------------' + nz = 1 + if (jj .eq. 2) nz = 10 +c +c call matrix generation routine -- +c (strange to use block version to generate 1 x 1 blocks...) +c + call gen57bl (nx,ny,nz,1,1,n,a1,ja1,ia1,ia2,stencil) +c +c initialize x +c + do 1 j=1, n + x(j) = real(j) + 1 continue +c +c initial call to get `` exact '' answer in y0 +c + call amux(n,x,y0, a1, ja1, ia1) +c----------------------------------------------------------------------- +c TESTING AMUXE +c----------------------------------------------------------------------- +c +c convert to itpack format ----- +c + call csrell (n,a1,ja1,ia1,7,a2,jad,n,ndiag,ierr) + call amuxe (n, x, y, n, ndiag, a2,jad) + call errpr (n, y, y0,iout,'amuxe ') +c----------------------------------------------------------------------- +c TESTING AMUXD +c----------------------------------------------------------------------- +c +c convert to diagonal format +c + idiag = 7 + call csrdia (n, idiag,10,a1, ja1, ia1, nmax, a2, + * ioff, a2, ja2, ia2, jad) + call amuxd (n,x,y,a2,nmax,idiag,ioff) + call errpr (n, y, y0,iout,'amuxd ') +c----------------------------------------------------------------------- +c TESTING ATMUX +c----------------------------------------------------------------------- +c +c convert to csc format (transpose) +c + call csrcsc (n,1,1,a1,ja1,ia1,a2,ja2,ia2) + call atmux (n, x, y, a2, ja2, ia2) + call errpr (n, y, y0,iout,'atmux ') +c----------------------------------------------------------------------- +c TESTING AMUXJ +c----------------------------------------------------------------------- +c +c convert to jagged diagonal format +c + call csrjad (n,a1,ja1,ia1, jdiag, jad, a2, ja2, ia2) + call amuxj (n, x, y, jdiag, a2, ja2, ia2) + call dvperm (n, y, jad) + call errpr (n, y, y0,iout,'amuxj ') +c +c convert back + + call jadcsr (n, jdiag, a2, ja2, ia2, jad, a1, ja1, ia1) + call amux (n, x, y, a1, ja1, ia1) + call errpr (n, y, y0,iout,'jadcsr') +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c triangular systems solutions +c----------------------------------------------------------------------- +c TESTING LDSOL +c----------------------------------------------------------------------- + call getl (n, a1, ja1, ia1, a2, ja2, ia2) + call amux (n,x,y0, a2, ja2, ia2) + call atmux(n,x,y1, a2, ja2, ia2) + call csrmsr (n, a2, ja2, ia2, a2, ja2, y, iwk2) + do 2 k=1,n + a2(k) = 1.0d0/ a2(k) + 2 continue + call ldsol (n, y, y0, a2, ja2) + call errpr (n, x, y, iout,'ldsol ') +c----------------------------------------------------------------------- +c TESTING LDSOLL +c----------------------------------------------------------------------- + call levels (n, ja2, ja2, nlev, jad, iwk1, iwk2) + call ldsoll (n, y, y0, a2, ja2, nlev, jad, iwk1) + call errpr (n, x, y, iout,'ldsoll') +c----------------------------------------------------------------------- +c TESTING UDSOLC +c----------------------------------------------------------------------- +c here we take advantage of the fact that the MSR format for U +c is the MSC format for L +c + call udsolc (n, y, y1, a2, ja2) + call errpr (n, x, y, iout,'udsolc') +c----------------------------------------------------------------------- +c TESTING LSOL +c----------------------------------------------------------------------- +c here we exploit the fact that with MSR format a, ja, ja is actually +c the correct data structure for the strict lower triangular part of +c the CSR format. First rescale matrix. +c + scal = 0.1 + do 3 k=ja2(1), ja2(n+1)-1 + a2(k)=a2(k)*scal + 3 continue + call amux(n, x, y0, a2, ja2, ja2) + do 4 j=1,n + y0(j) = x(j) + y0(j) + 4 continue + call lsol (n, y, y0, a2, ja2, ja2) + call errpr (n, x, y, iout,'lsol ') +c----------------------------------------------------------------------- +c TESTING UDSOL +c----------------------------------------------------------------------- + call getu (n, a1, ja1, ia1, a2, ja2, ia2) + call amux (n,x,y0, a2, ja2, ia2) + call atmux(n,x,y1, a2, ja2, ia2) + call csrmsr (n, a2, ja2, ia2, a2, ja2, y, jad) + do 5 k=1,n + a2(k) = 1.0d0/ a2(k) + 5 continue + call udsol (n, y, y0, a2, ja2) + call errpr (n, x, y, iout,'udsol ') +c----------------------------------------------------------------------- +c TESTING LDSOLC +c----------------------------------------------------------------------- +c here we take advantage of the fact that the MSR format for L +c is the MSC format for U +c + call ldsolc (n, y, y1, a2, ja2) + call errpr (n, x, y, iout,'ldsolc') +c----------------------------------------------------------------------- +c TESTING USOL +c----------------------------------------------------------------------- +c here we exploit the fact that with MSR format a, ja, ja is actually +c the correct data structure for the strict lower triangular part of +c the CSR format. First rescale matrix. +c + scal = 0.1 + do 6 k=ja2(1), ja2(n+1)-1 + a2(k)=a2(k)*scal + 6 continue + call amux(n, x, y1, a2, ja2, ja2) + do 7 j=1,n + y1(j) = x(j) + y1(j) + 7 continue + call usol (n, y, y1, a2, ja2, ja2) + call errpr (n, x, y, iout,'usol ') +c----------------------------------------------------------------------- +c -- END -- +c----------------------------------------------------------------------- + 150 continue + 100 continue + stop +c---------------end-of-main--------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine errpr (n, y, y1,iout,msg) + real*8 y(*), y1(*), t, sqrt + character*6 msg + t = 0.0d0 + do 1 k=1,n + t = t+(y(k)-y1(k))**2 + 1 continue + t = sqrt(t) + write (iout,*) ' 2-norm of difference in ',msg,' =', t + return + end + diff --git a/BLASSM/tester.f b/BLASSM/tester.f new file mode 100644 index 0000000..5b28fe7 --- /dev/null +++ b/BLASSM/tester.f @@ -0,0 +1,172 @@ + program matprod +c----------------------------------------------------------------------- +c test program for some routines in BLASSM.f +c----------------------------------------------------------------------- +c Last update: May 2, 1994 +c----------------------------------------------------------------------- + implicit real*8 (a-h,o-z) + parameter (nxmax = 30,nmx = nxmax*nxmax,nzmax=7*nmx) + integer ia(nmx+1),ib(nmx+1),ic(nzmax), + * ja(nzmax),jb(nzmax),jc(nzmax),iw(nmx) +c----------------------------------------------------------------------- + real*8 a(nzmax),b(nzmax),c(nzmax), + * x(nmx),y(nmx),y1(nmx),rhs(nmx), al(6) + character title*71,key*8,type*3 + + nx = 20 + ny = 20 + nz = 1 + al(1) = 1.0D0 + al(2) = 0.0D0 + al(3) = 2.3D1 + al(4) = 0.4D0 + al(5) = 0.0D0 + al(6) = 8.2D-2 + iout = 8 +c----------------------------------------------------------------------- + call gen57pt (nx,ny,nz,al,0,n,a,ja,ia,iw,rhs) + call gen57pt (ny,nx,nz,al,0,n,b,jb,ib,iw,rhs) +c + s = 3.812 +c + call aplsb1(n,n,a,ja,ia,s,b,jb,ib,c,jc,ic,nzmax,ierr) + if (ierr .ne. 0) print *,' ierr = ',ierr +c +c call dump (1,n,.true.,c,jc,ic,9) +c + do 1 k=1,n + x(k) = real(k)/real(n) + 1 continue +c + call ope (n,x,y1,a,ja,ia) + call ope (n,x,y,b,jb,ib) + do 2 j=1, n + y1(j) = s*y(j) + y1(j) + 2 continue +c + call ope (n,x,y,c,jc,ic) +c------------------------------------------------------ + write (6,*) ' ------------ checking APLSB --------------' + call ydfnorm(n,y1,y,6) +c------------------------------------------------------ + + type = '--------' + title=' test matrix for blassm c = a+b ' + key = 'rua' +c + ifmt = 103 +c + job = -1 +c-------- + do 121 jj=1,2 + write (9,*) 'DUMP A____________________________' + call dump (1,n,.true.,a,ja,ia,9) + write (9,*) 'DUMP B____________________________' + call dump (1,n,.true.,b,jb,ib,9) + call apmbt(n,n,job,a,ja,ia,b,jb,ib,c,jc,ic,nzmax,iw,ierr) + write (9,*) 'DUMP C____________________________' + call dump (1,n,.true.,c,jc,ic,9) + if (ierr .ne. 0) print *,' ierr = ',ierr + call ope (n,x,y1,a,ja,ia) + call opet (n,x,y,b,jb,ib) + s = real(job) + do 3 j=1, n + 3 y1(j) = y1(j) + s*y(j) +c + call ope (n,x,y,c,jc,ic) +c------------xs------------------------------------------ + write (6,*) ' ' + write (6,*) ' ------------ checking APMBT---------------' + write (6,*) ' ------------ with JOB = ',job,' -------------' + call ydfnorm(n,y1,y,6) +c------------------------------------------------------ + job = job + 2 + 121 continue +c + type = '--------' + title=' test matrix for blassm c = a+b^T ' +c +c +c + s = 0.1232445 + call aplsbt(n,n,a,ja,ia,s,b,jb,ib,c,jc,ic,nzmax,iw,ierr) +c + if (ierr .ne. 0) print *,' ierr = ',ierr + call ope (n,x,y1,a,ja,ia) + call opet (n,x,y,b,jb,ib) + do 4 j=1, n + 4 y1(j) = y1(j) + s*y(j) +c + call ope (n,x,y,c,jc,ic) +c------------------------------------------------------ +c------------------------------------------------------ + write (6,*) ' ' + write (6,*) ' ------------ checking APLSBT---------------' + call ydfnorm(n,y1,y,6) +c----------------------------------------------------------------------- +c testing products +c----------------------------------------------------------------------- + job = 1 + call amub (n,n,job,a,ja,ia,b,jb,ib,c,jc,ic,nzmax,iw,ierr) +c + if (ierr .ne. 0) print *,' ierr = ',ierr + call ope (n,x,y,b,jb,ib) + call ope (n,y,y1,a,ja,ia) +c + call ope (n,x,y,c,jc,ic) +c----------------------------------------------------------------------- + write (6,*) ' ' + write (6,*) ' ------------ checking AMUB ---------------' + call ydfnorm(n,y1,y,6) +c + stop + end +c +c + subroutine ope (n,x,y,a,ja,ia) + implicit real*8 (a-h,o-z) + real*8 x(1),y(1),a(1) + integer ia(*),ja(*) +c sparse matrix * vector multiplication +c + do 100 i=1,n + k1 = ia(i) + k2 = ia(i+1) -1 + y(i) = 0.0 + do 99 k=k1,k2 + y(i) = y(i) + a(k)*x(ja(k)) + 99 continue + 100 continue + return + end +c + subroutine opet (n,x,y,a,ja,ia) + implicit real*8 (a-h,o-z) + real*8 x(1),y(1),a(1) + integer ia(*),ja(*) +c sparse matrix * vector multiplication +c + do 1 j=1, n + 1 y(j) = 0.0d0 +c + do 100 i=1,n + do 99 k=ia(i), ia(i+1)-1 + y(ja(k)) = y(ja(k)) + x(i)*a(k) + 99 continue + 100 continue + return + end +c + subroutine ydfnorm(n,y1,y,iout) + implicit real*8 (a-h,o-z) + real*8 y(*),y1(*) +c + t = 0.0d0 + do 21 k=1,n + t = t+(y(k)-y1(k))**2 + 21 continue + t = sqrt(t) + write(iout,*) '2-norm of error (exact answer-tested answer)=',t +c----------------------------------------------------------------------- + return + end diff --git a/DOC/QUICK_REF b/DOC/QUICK_REF new file mode 100644 index 0000000..20a30cf --- /dev/null +++ b/DOC/QUICK_REF @@ -0,0 +1,200 @@ +c-------------------------------------------------------------------------------c +c c +c QUICK REFERENCE c +c c +c-------------------------------------------------------------------------------c +c For convenience we list here the most important subroutines c +c in the various modules of SPARSKIT. More detailed information can be c +c found either in the body of the paper or in the documentation of the package.c +c c +c-------------------------------------------------------------------------------c +c===============================================================================c +c FORMATS Module c +c===============================================================================c +c c +c CSRDNS : converts a row-stored sparse matrix into the dense format. c +c DNSCSR : converts a dense matrix to a sparse storage format. c +c COOCSR : converts coordinate to to csr format c +c COICSR : in-place conversion of coordinate to csr format c +c CSRCOO : converts compressed sparse row to coordinate format. c +c CSRSSR : converts compressed sparse row to symmetric sparse row format. c +c SSRCSR : converts symmetric sparse row to compressed sparse row format. c +c CSRELL : converts compressed sparse row to Ellpack format c +c ELLCSR : converts Ellpack format to compressed sparse row format. c +c CSRMSR : converts compressed sparse row format to modified sparse c +c row format. c +c MSRCSR : converts modified sparse row format to compressed sparse c +c row format. c +c CSRCSC : converts compressed sparse row format to compressed sparse c +c column format (transposition). c +c CSRDIA : converts the compressed sparse row format into the diagonal c +c format. c +c DIACSR : converts the diagonal format into the compressed sparse row c +c format. c +c BSRCSR : converts the block-row sparse format into the compressed c +c sparse row format. c +c CSRBSR : converts the compressed sparse row format into the block-row c +c sparse format. c +c CSRBND : converts the compressed sparse row format into the banded c +c format (Linpack style). c +c BNDCSR : converts the banded format (Linpack style) into the compressed c +c sparse row storage. c +c CSRSSK : converts the compressed sparse row format to the symmetric c +c skyline format c +c SSKSSR : converts symmetric skyline format to symmetric sparse row format. c +c CSRJAD : converts the csr format into the jagged diagonal format c +c JADCSR : converts the jagged-diagonal format into the csr format c +c COOELL : converts the coordinate format into the Ellpack/Itpack format. c +c CSRVBR : converts the compressed sparse row format into the c +c variable block row format. c +c VBRCSR : converts the variable block row format into the c +c compressed sparse row format. c +c CSORTED : Checks if matrix in CSR format is sorted by columns. c +c c +c-------------------------------------------------------------------------------c +c===============================================================================c +c UNARY Module c +c===============================================================================c +c c +c SUBMAT : extracts a submatrix from a sparse matrix. c +c FILTER : filters elements from a matrix according to their magnitude. c +c FILTERM: Same as above, but for the MSR format. c +c TRANSP : in-place transposition routine (see also CSRCSC in formats) c +c GETELM : returns a(i,j) for any (i,j) from a CSR-stored matrix. c +c COPMAT : copies a matrix into another matrix (both stored csr). c +c MSRCOP : copies a matrix in MSR format into a matrix in MSR format. c +c GETELM : returns a(i,j) for any (i,j) from a CSR-stored matrix. c +c GETDIA : extracts a specified diagonal from a matrix. c +c GETL : extracts lower triangular part. c +c GETU : extracts upper triangular part. c +c LEVELS : gets the level scheduling structure for lower triangular matrices. c +c AMASK : extracts C = A * M c +c RPERM : permutes the rows of a matrix (B = P A) c +c CPERM : permutes the columns of a matrix (B = A Q) c +c DPERM : permutes a matrix (B = P A Q) given two permutations P, Q c +c DPERM2 : general submatrix permutation/extraction routine. c +c DMPERM : symmetric permutation of row and column (B=PAP') in MSR fmt. c +c DVPERM : permutes a vector (in-place). c +c IVPERM : permutes an integer vector (in-place). c +c RETMX : returns the max absolute value in each row of the matrix. c +c DIAPOS : returns the positions of the diagonal elements in A. c +c EXTBDG : extracts the main diagonal blocks of a matrix. c +c GETBWD : returns the bandwidth information on a matrix. c +c BLKFND : finds the block-size of a matrix. c +c BLKCHK : checks whether a given integer is the block size of A. c +c INFDIA : obtains information on the diagonals of A. c +c AMUBDG : computes the number of nonzero elements in each row of A*B. c +c APLBDG : computes the number of nonzero elements in each row of A+B. c +c RNRMS : computes the norms of the rows of A. c +c CNRMS : computes the norms of the columns of A. c +c ROSCAL : scales the rows of a matrix by their norms. c +c COSCAL : scales the columns of a matrix by their norms. c +c ADDBLK : adds a matrix B into a block of A. c +c GET1UP : collects the first elements of each row of the upper c +c triangular portion of the matrix. c +c XTROWS : extracts given rows from a matrix in CSR format. c +c CSRKVSTR : Finds block row partitioning of matrix in CSR format c +c CSRKVSTC : Finds block column partitioning of matrix in CSR format c +c KVSTMERGE: Merges block partitionings, for conformal row/col pattern c +c c +c-------------------------------------------------------------------------------c +c===============================================================================c +c INOUT Module c +c===============================================================================c +c c +c READMT : reads matrices in the boeing/Harewell format. c +c PRTMT : prints matrices in the boeing/Harewell format. c +c DUMP : prints rows of a matrix, in a readable format. c +c PLTMT : produces a 'pic' file for plotting a sparse matrix. c +c PSPLTM : Generates a post-script plot of the non-zero pattern of A. c +c SMMS : Write the matrx in a format used in SMMS package. c +c READSM : Reads matrices in coordinate format (as in SMMS package). c +c READSK : Reads matrices in CSR format (simplified H/B formate). c +c SKIT : Writes matrices to a file, format same as above. c +c PRTUNF : Writes matrices (in CSR format) unformatted. c +c READUNF : Reads unformatted data of matrices (in CSR format). c +c c +c-------------------------------------------------------------------------------c +c===============================================================================c +c INFO Module c +c===============================================================================c +c c +c DINFO1 : obtains a number of statistics on a sparse matrix. c +c VBRINFO: Print info on matrix in variable block row format c +c c +c-------------------------------------------------------------------------------c +c===============================================================================c +c MATGEN Module c +c===============================================================================c +c c +c GEN57PT : generates 5-point and 7-point matrices. c +c GEN57BL : generates block 5-point and 7-point matrices. c +c GENFEA : generates finite element matrices in assembled form. c +c GENFEU : generates finite element matrices in unassembled form. c +c ASSMB1 : assembles an unassembled matrix (as produced by genfeu). c +c MATRF2 : Routines for generating sparse matrices by Zlatev et al. c +c DCN : Routines for generating sparse matrices by Zlatev et al. c +c ECN : Routines for generating sparse matrices by Zlatev et al. c +c MARKGEN : subroutine to produce a Markov chain matrix for a random walk. c +c c +c-------------------------------------------------------------------------------c +c===============================================================================c +c BLASSM Module c +c===============================================================================c +c c +c AMUB : computes C = A*B c +c APLB : computes C = A+B c +c APLSB : computes C = A + s B c +c APMBT : Computes C = A +(-) B^T c +c APLSBT : Computes C = A + s * B^T c +c DIAMUA : Computes C = Diag * A c +c AMUDIA : Computes C = A* Diag c +c APLDIA : Computes C = A + Diag c +c APLSCA : Computes A:= A + s I (s = scalar) c +c c +c-------------------------------------------------------------------------------c +c===============================================================================c +c MATVEC Module c +c===============================================================================c +c c +c AMUX : A times a vector. Compressed Sparse Row (CSR) format. c +c ATMUX : A^T times a vector. CSR format. c +c AMUXE : A times a vector. Ellpack/Itpack (ELL) format. c +c AMUXD : A times a vector. Diagonal (DIA) format. c +c AMUXJ : A times a vector. Jagged Diagonal (JAD) format. c +c VBRMV : Sparse matrix-full vector product, in VBR format c +c c +c LSOL : Unit lower triangular system solution. Compressed Sparse Row c +c (CSR) format. c +c LDSOL : Lower triangular system solution. Modified Sparse Row (MSR) format. c +c LSOL : Unit lower triangular system solution. Compressed Sparse Column c +c (CSC) format. c +c LDSOLC: Lower triangular system solution. Modif. Sparse Column (MSC) format c +c LDSOLL: Lower triangular system solution with level scheduling. MSR format. c +c USOL : Unit upper triangular system solution. Compressed Sparse Row c +c (CSR) format. c +c UDSOL : Upper triangular system solution. Modified Sparse Row (MSR) format. c +c USOLC : Unit upper triangular system solution. Compressed Sparse c +c Column (CSC) format. c +c UDSOLC: Upper triangular system solution. Modif. Sparse Column (MSC) format c +c c +c-------------------------------------------------------------------------------c +c===============================================================================c +c ORDERINGS Module c +c===============================================================================c +c c +c LEVSET : The standard Cuthill-McKee ordering algorithm. c +c COLOR : A greedy algorithm for multicoloring ordering. c +c CCN : Strongly connected components. c +c c +c-------------------------------------------------------------------------------c +c===============================================================================c +c ITSOL Module c +c===============================================================================c +c c +c ILUT : ILUT(k) preconditioned GMRES mini package. c +c ITERS : Nine Krylov iterative solvers with reverse communication. c +c c +c-------------------------------------------------------------------------------c +c===============================================================================c + diff --git a/DOC/README b/DOC/README new file mode 100644 index 0000000..7f2f99a --- /dev/null +++ b/DOC/README @@ -0,0 +1,14 @@ + + This directory contains some documentation on the package. + + paper.tex is the tex-file of the documentation. + paper.ps is the post-script file + QUICK_REF is a quick-reference file that contains all existing routines + listed by module. * may need updating* + + all other files are pictures used by paper.tex. + + *THANKS: to Daniel Heiserer (BMW, germany) for a the recent update to + the files (latex, figures..) in this directory + +----------------------------------------------------------------------- diff --git a/DOC/dir.eps b/DOC/dir.eps new file mode 100644 index 0000000..a3b7c1d --- /dev/null +++ b/DOC/dir.eps @@ -0,0 +1,115 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /tmp/xfig-fig024490 +%%Creator: fig2dev +%%CreationDate: Thu Aug 19 20:24:55 1993 +%%For: dsu@unity (Dongli Su,2-209 EECS,626-7512,378-3764) +%%BoundingBox: 0 0 567 259 +%%Pages: 0 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/l {lineto} bind def +/m {moveto} bind def +/s {stroke} bind def +/n {newpath} bind def +/gs {gsave} bind def +/gr {grestore} bind def +/clp {closepath} bind def +/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul +4 -2 roll mul setrgbcolor} bind def +/col-1 {} def +/col0 {0 0 0 setrgbcolor} bind def +/col1 {0 0 1 setrgbcolor} bind def +/col2 {0 1 0 setrgbcolor} bind def +/col3 {0 1 1 setrgbcolor} bind def +/col4 {1 0 0 setrgbcolor} bind def +/col5 {1 0 1 setrgbcolor} bind def +/col6 {1 1 0 setrgbcolor} bind def +/col7 {1 1 1 setrgbcolor} bind def + end +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +0 setlinecap 0 setlinejoin +-18.0 328.0 translate 0.900 -0.900 scale +0.500 setlinewidth +% Polyline +n 49 244 m 319 99 l gs col-1 s gr +% Polyline +n 319 99 m 134 244 l gs col-1 s gr +% Polyline +n 319 99 m 204 244 l gs col-1 s gr +% Polyline +n 319 99 m 264 244 l gs col-1 s gr +% Polyline +n 319 99 m 324 244 l gs col-1 s gr +% Polyline +n 319 99 m 394 244 l gs col-1 s gr +% Polyline +n 319 99 m 484 244 l gs col-1 s gr +% Polyline +n 319 99 m 569 244 l gs col-1 s gr +% Polyline +n 544 304 m 564 264 l gs col-1 s gr +% Polyline +n 564 264 m 614 304 l gs col-1 s gr +% Polyline +n 344 304 m 389 264 l gs col-1 s gr +% Polyline +n 389 264 m 399 304 l gs col-1 s gr +% Polyline +n 389 264 m 454 304 l gs col-1 s gr +% Polyline +n 319 99 m 319 99 l 634 244 l 634 244 l gs col-1 s gr +/Times-Roman findfont 14.00 scalefont setfont +19 259 m +gs 1 -1 scale (BLASSM) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +99 259 m +gs 1 -1 scale (FORMATS) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +189 259 m +gs 1 -1 scale (INFO) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 259 m +gs 1 -1 scale (INOUT) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +304 259 m +gs 1 -1 scale (ITSOL) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +359 259 m +gs 1 -1 scale (MATGEN) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +439 259 m +gs 1 -1 scale (ORDERINGS) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +539 259 m +gs 1 -1 scale (UNSUPP) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +519 319 m +gs 1 -1 scale (MATEXP) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +329 319 m +gs 1 -1 scale (FDIF) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +384 319 m +gs 1 -1 scale (FEM) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +439 319 m +gs 1 -1 scale (MISC) col-1 show gr +/Times-Roman findfont 18.00 scalefont setfont +279 89 m +gs 1 -1 scale (SPARSKIT) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +599 319 m +gs 1 -1 scale (PLOTS) col-1 show gr +%%/Times-Roman findfont 20.00 scalefont setfont +%%199 364 m +%%gs 1 -1 scale (General organization of SPARSKIT) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +619 259 m +gs 1 -1 scale (DOC) col-1 show gr +$F2psEnd diff --git a/DOC/dir.fig b/DOC/dir.fig new file mode 100644 index 0000000..5b7e5c5 --- /dev/null +++ b/DOC/dir.fig @@ -0,0 +1,46 @@ +#FIG 2.1 +80 2 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 49 244 319 99 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 319 99 134 244 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 319 99 204 244 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 319 99 264 244 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 319 99 324 244 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 319 99 394 244 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 319 99 484 244 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 319 99 569 244 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 544 304 564 264 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 564 264 614 304 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 344 304 389 264 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 389 264 399 304 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 389 264 454 304 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 319 99 319 99 634 244 634 244 9999 9999 +4 0 0 14 0 -1 0 0.00000 4 10 58 19 259 BLASSM +4 0 0 14 0 -1 0 0.00000 4 10 68 99 259 FORMATS +4 0 0 14 0 -1 0 0.00000 4 10 34 189 259 INFO +4 0 0 14 0 -1 0 0.00000 4 10 45 239 259 INOUT +4 0 0 14 0 -1 0 0.00000 4 10 41 304 259 ITSOL +4 0 0 14 0 -1 0 0.00000 4 10 64 359 259 MATGEN +4 0 0 14 0 -1 0 0.00000 4 10 82 439 259 ORDERINGS +4 0 0 14 0 -1 0 0.00000 4 10 55 539 259 UNSUPP +4 0 0 12 0 -1 0 0.00000 4 9 50 519 319 MATEXP +4 0 0 12 0 -1 0 0.00000 4 9 29 329 319 FDIF +4 0 0 12 0 -1 0 0.00000 4 9 27 384 319 FEM +4 0 0 12 0 -1 0 0.00000 4 9 30 439 319 MISC +4 0 0 18 0 -1 0 0.00000 4 13 88 279 89 SPARSKIT +4 0 0 12 0 -1 0 0.00000 4 9 37 599 319 PLOTS +4 0 0 20 0 -1 0 0.00000 4 17 279 199 364 General organization of SPARSKIT +4 0 0 14 0 -1 0 0.00000 4 10 30 619 259 DOC diff --git a/DOC/dir.pdf b/DOC/dir.pdf new file mode 100644 index 0000000..565d9f6 Binary files /dev/null and b/DOC/dir.pdf differ diff --git a/DOC/doc_data.txt b/DOC/doc_data.txt new file mode 100644 index 0000000..652b682 --- /dev/null +++ b/DOC/doc_data.txt @@ -0,0 +1,15 @@ +InfoKey: Creator +InfoValue: fig2dev Version 3.2 Patchlevel 3c +InfoKey: Title +InfoValue: dir.pdf +InfoKey: Author +InfoValue: q127038@caek315 (Daniel Heiserer, EK-213, +49-89-382-21187) +InfoKey: Producer +InfoValue: GPL Ghostscript 8.15 +InfoKey: ModDate +InfoValue: D:20050308101430 +InfoKey: CreationDate +InfoValue: D:20050308101430 +PdfID0: 5eca9773bba4d12b8b37b446c3226559 +PdfID1: 5eca9773bba4d12b8b37b446c3226559 +NumberOfPages: 2 diff --git a/DOC/jpwh.pdf b/DOC/jpwh.pdf new file mode 100644 index 0000000..bbdaccf Binary files /dev/null and b/DOC/jpwh.pdf differ diff --git a/DOC/jpwh.ps b/DOC/jpwh.ps new file mode 100644 index 0000000..4788a7a --- /dev/null +++ b/DOC/jpwh.ps @@ -0,0 +1,6057 @@ +%! +%%Creator: PSPLTM routine +%%309.92 133.88 1244.56 1165.72 +%%74 94 527 454 +%%BoundingBox: 0 0 527 454 +%%EndComments +/cm {72 mul 2.54 div} def +/mc {72 div 2.54 mul} def +/pnum { 72 div 2.54 mul 20 string +cvs print ( ) print} def +/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def +gsave +/Helvetica findfont 0.500000 cm scalefont setfont + 10.7950 cm 2.15000 cm moveto +(AN UNSYMMETRIC MATRIX FROM PHILIPS LTD, J.P.WHELAN,1978.) Cshow + 4.44500 cm 3.35000 cm translate + 12.7000 cm 992 div dup scale + 0.250000 setlinewidth +newpath + 0 0 moveto + 992 0 lineto + 992 992 lineto + 0 992 lineto +closepath stroke + 0.2 setlinewidth +1 1 translate +0.8 setlinewidth +/p {moveto 0 -.40 rmoveto + 0 .80 rlineto stroke} def + 0 990 p + 83 990 p + 1 989 p + 84 989 p + 121 989 p + 146 989 p + 164 989 p + 2 988 p + 121 988 p + 3 987 p + 121 987 p + 122 987 p + 140 987 p + 4 986 p + 84 986 p + 122 986 p + 5 985 p + 6 984 p + 100 984 p + 123 984 p + 7 983 p + 106 983 p + 123 983 p + 124 983 p + 8 982 p + 106 982 p + 111 982 p + 123 982 p + 9 981 p + 10 980 p + 95 980 p + 11 979 p + 106 979 p + 125 979 p + 138 979 p + 152 979 p + 12 978 p + 85 978 p + 95 978 p + 125 978 p + 13 977 p + 119 977 p + 14 976 p + 119 976 p + 126 976 p + 15 975 p + 119 975 p + 158 975 p + 16 974 p + 93 974 p + 126 974 p + 17 973 p + 93 973 p + 18 972 p + 93 972 p + 19 971 p + 101 971 p + 113 971 p + 20 970 p + 101 970 p + 139 970 p + 21 969 p + 82 969 p + 98 969 p + 101 969 p + 22 968 p + 98 968 p + 23 967 p + 98 967 p + 24 966 p + 25 965 p + 114 965 p + 139 965 p + 141 965 p + 153 965 p + 163 965 p + 26 964 p + 127 964 p + 139 964 p + 141 964 p + 27 963 p + 114 963 p + 28 962 p + 115 962 p + 143 962 p + 155 962 p + 165 962 p + 194 962 p + 29 961 p + 114 961 p + 143 961 p + 30 960 p + 128 960 p + 143 960 p + 31 959 p + 105 959 p + 117 959 p + 129 959 p + 166 959 p + 32 958 p + 105 958 p + 33 957 p + 83 957 p + 105 957 p + 34 956 p + 83 956 p + 94 956 p + 35 955 p + 94 955 p + 102 955 p + 36 954 p + 94 954 p + 37 953 p + 91 953 p + 128 953 p + 38 952 p + 39 951 p + 103 951 p + 112 951 p + 116 951 p + 128 951 p + 154 951 p + 156 951 p + 159 951 p + 167 951 p + 40 950 p + 91 950 p + 104 950 p + 41 949 p + 92 949 p + 103 949 p + 42 948 p + 104 948 p + 43 947 p + 44 946 p + 92 946 p + 108 946 p + 130 946 p + 45 945 p + 92 945 p + 130 945 p + 46 944 p + 47 943 p + 102 943 p + 131 943 p + 48 942 p + 102 942 p + 107 942 p + 132 942 p + 49 941 p + 108 941 p + 132 941 p + 50 940 p + 107 940 p + 51 939 p + 111 939 p + 161 939 p + 168 939 p + 180 939 p + 52 938 p + 107 938 p + 53 937 p + 54 936 p + 100 936 p + 110 936 p + 111 936 p + 55 935 p + 82 935 p + 56 934 p + 84 934 p + 100 934 p + 110 934 p + 57 933 p + 95 933 p + 58 932 p + 85 932 p + 108 932 p + 59 931 p + 85 931 p + 109 931 p + 60 930 p + 91 930 p + 109 930 p + 61 929 p + 99 929 p + 131 929 p + 133 929 p + 62 928 p + 131 928 p + 63 927 p + 103 927 p + 64 926 p + 99 926 p + 65 925 p + 127 925 p + 66 924 p + 109 924 p + 126 924 p + 67 923 p + 115 923 p + 68 922 p + 82 922 p + 113 922 p + 118 922 p + 69 921 p + 113 921 p + 134 921 p + 158 921 p + 169 921 p + 178 921 p + 188 921 p + 212 921 p + 70 920 p + 134 920 p + 71 919 p + 134 919 p + 72 918 p + 73 917 p + 135 917 p + 74 916 p + 117 916 p + 75 915 p + 117 915 p + 136 915 p + 76 914 p + 136 914 p + 77 913 p + 116 913 p + 136 913 p + 144 913 p + 147 913 p + 78 912 p + 96 912 p + 79 911 p + 112 911 p + 116 911 p + 144 911 p + 145 911 p + 187 911 p + 80 910 p + 96 910 p + 124 910 p + 81 909 p + 112 909 p + 124 909 p + 140 909 p + 145 909 p + 170 909 p + 82 908 p + 118 908 p + 168 908 p + 181 908 p + 195 908 p + 83 907 p + 171 907 p + 182 907 p + 190 907 p + 84 906 p + 146 906 p + 151 906 p + 172 906 p + 213 906 p + 85 905 p + 120 905 p + 160 905 p + 173 905 p + 197 905 p + 86 904 p + 99 904 p + 159 904 p + 82 903 p + 87 903 p + 118 903 p + 88 902 p + 164 902 p + 174 902 p + 89 901 p + 129 901 p + 90 900 p + 96 900 p + 138 900 p + 158 900 p + 175 900 p + 91 899 p + 104 899 p + 115 899 p + 154 899 p + 155 899 p + 176 899 p + 92 898 p + 133 898 p + 177 898 p + 93 897 p + 127 897 p + 178 897 p + 193 897 p + 220 897 p + 94 896 p + 179 896 p + 189 896 p + 95 895 p + 125 895 p + 173 895 p + 180 895 p + 183 895 p + 96 894 p + 144 894 p + 152 894 p + 175 894 p + 203 894 p + 97 893 p + 122 893 p + 140 893 p + 98 892 p + 153 892 p + 184 892 p + 195 892 p + 99 891 p + 150 891 p + 170 891 p + 221 891 p + 100 890 p + 110 890 p + 172 890 p + 186 890 p + 101 889 p + 181 889 p + 209 889 p + 264 889 p + 102 888 p + 148 888 p + 157 888 p + 163 888 p + 179 888 p + 198 888 p + 214 888 p + 103 887 p + 133 887 p + 159 887 p + 162 887 p + 200 887 p + 91 886 p + 104 886 p + 120 886 p + 154 886 p + 162 886 p + 176 886 p + 105 885 p + 129 885 p + 149 885 p + 182 885 p + 106 884 p + 183 884 p + 192 884 p + 107 883 p + 157 883 p + 184 883 p + 108 882 p + 120 882 p + 130 882 p + 161 882 p + 173 882 p + 177 882 p + 222 882 p + 109 881 p + 176 881 p + 100 880 p + 110 880 p + 172 880 p + 185 880 p + 111 879 p + 168 879 p + 180 879 p + 183 879 p + 186 879 p + 223 879 p + 247 879 p + 112 878 p + 145 878 p + 167 878 p + 170 878 p + 187 878 p + 113 877 p + 178 877 p + 181 877 p + 188 877 p + 114 876 p + 141 876 p + 149 876 p + 189 876 p + 91 875 p + 115 875 p + 142 875 p + 116 874 p + 147 874 p + 187 874 p + 207 874 p + 117 873 p + 135 873 p + 147 873 p + 169 873 p + 224 873 p + 82 872 p + 118 872 p + 151 872 p + 188 872 p + 225 872 p + 119 871 p + 138 871 p + 160 871 p + 226 871 p + 85 870 p + 104 870 p + 108 870 p + 120 870 p + 197 870 p + 199 870 p + 121 869 p + 150 869 p + 171 869 p + 190 869 p + 191 869 p + 227 869 p + 122 868 p + 146 868 p + 186 868 p + 191 868 p + 210 868 p + 219 868 p + 227 868 p + 123 867 p + 192 867 p + 124 866 p + 152 866 p + 192 866 p + 203 866 p + 219 866 p + 228 866 p + 95 865 p + 125 865 p + 196 865 p + 217 865 p + 229 865 p + 126 864 p + 142 864 p + 160 864 p + 193 864 p + 93 863 p + 127 863 p + 142 863 p + 194 863 p + 209 863 p + 218 863 p + 220 863 p + 230 863 p + 128 862 p + 155 862 p + 156 862 p + 208 862 p + 211 862 p + 105 861 p + 129 861 p + 166 861 p + 174 861 p + 224 861 p + 231 861 p + 108 860 p + 130 860 p + 132 860 p + 148 860 p + 177 860 p + 232 860 p + 131 859 p + 171 859 p + 215 859 p + 232 859 p + 233 859 p + 130 858 p + 132 858 p + 148 858 p + 161 858 p + 92 857 p + 103 857 p + 133 857 p + 200 857 p + 221 857 p + 234 857 p + 134 856 p + 135 856 p + 151 856 p + 235 856 p + 117 855 p + 134 855 p + 135 855 p + 169 855 p + 174 855 p + 235 855 p + 136 854 p + 175 854 p + 212 854 p + 121 853 p + 137 853 p + 150 853 p + 119 852 p + 138 852 p + 196 852 p + 139 851 p + 153 851 p + 140 850 p + 191 850 p + 114 849 p + 141 849 p + 165 849 p + 218 849 p + 115 848 p + 126 848 p + 127 848 p + 142 848 p + 194 848 p + 206 848 p + 283 848 p + 143 847 p + 149 847 p + 165 847 p + 201 847 p + 211 847 p + 96 846 p + 144 846 p + 207 846 p + 236 846 p + 112 845 p + 145 845 p + 203 845 p + 84 844 p + 122 844 p + 146 844 p + 164 844 p + 227 844 p + 116 843 p + 117 843 p + 147 843 p + 236 843 p + 237 843 p + 244 843 p + 265 843 p + 102 842 p + 130 842 p + 132 842 p + 148 842 p + 157 842 p + 238 842 p + 105 841 p + 114 841 p + 143 841 p + 149 841 p + 166 841 p + 99 840 p + 121 840 p + 150 840 p + 215 840 p + 84 839 p + 118 839 p + 134 839 p + 151 839 p + 185 839 p + 213 839 p + 225 839 p + 266 839 p + 96 838 p + 124 838 p + 152 838 p + 196 838 p + 98 837 p + 139 837 p + 153 837 p + 163 837 p + 205 837 p + 209 837 p + 251 837 p + 267 837 p + 91 836 p + 104 836 p + 154 836 p + 156 836 p + 162 836 p + 91 835 p + 128 835 p + 155 835 p + 204 835 p + 211 835 p + 239 835 p + 256 835 p + 263 835 p + 273 835 p + 128 834 p + 154 834 p + 156 834 p + 208 834 p + 250 834 p + 256 834 p + 257 834 p + 102 833 p + 107 833 p + 148 833 p + 157 833 p + 184 833 p + 158 832 p + 252 832 p + 268 832 p + 103 831 p + 159 831 p + 167 831 p + 250 831 p + 85 830 p + 119 830 p + 126 830 p + 160 830 p + 193 830 p + 206 830 p + 217 830 p + 242 830 p + 108 829 p + 132 829 p + 161 829 p + 222 829 p + 241 829 p + 245 829 p + 269 829 p + 103 828 p + 104 828 p + 154 828 p + 162 828 p + 200 828 p + 102 827 p + 153 827 p + 163 827 p + 179 827 p + 189 827 p + 198 827 p + 214 827 p + 251 827 p + 146 826 p + 164 826 p + 190 826 p + 213 826 p + 141 825 p + 143 825 p + 165 825 p + 218 825 p + 239 825 p + 240 825 p + 129 824 p + 149 824 p + 166 824 p + 201 824 p + 237 824 p + 258 824 p + 270 824 p + 288 824 p + 112 823 p + 159 823 p + 167 823 p + 208 823 p + 216 823 p + 82 822 p + 111 822 p + 168 822 p + 202 822 p + 247 822 p + 269 822 p + 271 822 p + 117 821 p + 135 821 p + 169 821 p + 212 821 p + 99 820 p + 112 820 p + 170 820 p + 216 820 p + 259 820 p + 262 820 p + 83 819 p + 121 819 p + 131 819 p + 171 819 p + 215 819 p + 84 818 p + 100 818 p + 110 818 p + 172 818 p + 185 818 p + 202 818 p + 210 818 p + 85 817 p + 95 817 p + 108 817 p + 173 817 p + 197 817 p + 217 817 p + 241 817 p + 129 816 p + 135 816 p + 174 816 p + 224 816 p + 231 816 p + 272 816 p + 96 815 p + 136 815 p + 175 815 p + 236 815 p + 252 815 p + 91 814 p + 104 814 p + 109 814 p + 176 814 p + 199 814 p + 204 814 p + 206 814 p + 263 814 p + 273 814 p + 297 814 p + 310 814 p + 92 813 p + 108 813 p + 130 813 p + 177 813 p + 199 813 p + 222 813 p + 93 812 p + 113 812 p + 178 812 p + 264 812 p + 268 812 p + 274 812 p + 285 812 p + 94 811 p + 102 811 p + 163 811 p + 179 811 p + 182 811 p + 198 811 p + 95 810 p + 111 810 p + 180 810 p + 223 810 p + 241 810 p + 82 809 p + 101 809 p + 113 809 p + 181 809 p + 195 809 p + 261 809 p + 264 809 p + 275 809 p + 83 808 p + 105 808 p + 179 808 p + 182 808 p + 233 808 p + 249 808 p + 276 808 p + 95 807 p + 106 807 p + 111 807 p + 183 807 p + 223 807 p + 229 807 p + 98 806 p + 107 806 p + 157 806 p + 184 806 p + 205 806 p + 110 805 p + 151 805 p + 172 805 p + 185 805 p + 202 805 p + 100 804 p + 111 804 p + 122 804 p + 186 804 p + 210 804 p + 112 803 p + 116 803 p + 187 803 p + 207 803 p + 216 803 p + 113 802 p + 118 802 p + 188 802 p + 225 802 p + 260 802 p + 94 801 p + 114 801 p + 163 801 p + 189 801 p + 201 801 p + 249 801 p + 83 800 p + 121 800 p + 164 800 p + 190 800 p + 254 800 p + 277 800 p + 121 799 p + 122 799 p + 140 799 p + 191 799 p + 219 799 p + 278 799 p + 106 798 p + 123 798 p + 124 798 p + 192 798 p + 228 798 p + 243 798 p + 93 797 p + 126 797 p + 160 797 p + 193 797 p + 220 797 p + 242 797 p + 127 796 p + 142 796 p + 194 796 p + 204 796 p + 230 796 p + 82 795 p + 98 795 p + 181 795 p + 195 795 p + 205 795 p + 275 795 p + 125 794 p + 138 794 p + 152 794 p + 196 794 p + 226 794 p + 228 794 p + 252 794 p + 255 794 p + 279 794 p + 85 793 p + 120 793 p + 173 793 p + 197 793 p + 248 793 p + 280 793 p + 311 793 p + 326 793 p + 102 792 p + 163 792 p + 179 792 p + 198 792 p + 214 792 p + 233 792 p + 281 792 p + 294 792 p + 302 792 p + 120 791 p + 176 791 p + 177 791 p + 199 791 p + 234 791 p + 248 791 p + 310 791 p + 103 790 p + 133 790 p + 162 790 p + 200 790 p + 234 790 p + 143 789 p + 166 789 p + 189 789 p + 201 789 p + 249 789 p + 258 789 p + 270 789 p + 300 789 p + 303 789 p + 331 789 p + 168 788 p + 172 788 p + 185 788 p + 202 788 p + 247 788 p + 261 788 p + 304 788 p + 333 788 p + 96 787 p + 124 787 p + 145 787 p + 203 787 p + 259 787 p + 279 787 p + 282 787 p + 155 786 p + 176 786 p + 194 786 p + 204 786 p + 239 786 p + 283 786 p + 153 785 p + 184 785 p + 195 785 p + 205 785 p + 238 785 p + 267 785 p + 271 785 p + 294 785 p + 307 785 p + 142 784 p + 160 784 p + 176 784 p + 206 784 p + 280 784 p + 297 784 p + 116 783 p + 144 783 p + 187 783 p + 207 783 p + 257 783 p + 282 783 p + 128 782 p + 156 782 p + 167 782 p + 208 782 p + 101 781 p + 127 781 p + 153 781 p + 209 781 p + 267 781 p + 122 780 p + 172 780 p + 186 780 p + 210 780 p + 284 780 p + 289 780 p + 308 780 p + 128 779 p + 143 779 p + 155 779 p + 211 779 p + 256 779 p + 270 779 p + 136 778 p + 169 778 p + 212 778 p + 244 778 p + 285 778 p + 293 778 p + 298 778 p + 312 778 p + 84 777 p + 151 777 p + 164 777 p + 213 777 p + 254 777 p + 266 777 p + 102 776 p + 163 776 p + 198 776 p + 214 776 p + 238 776 p + 131 775 p + 150 775 p + 171 775 p + 215 775 p + 221 775 p + 286 775 p + 167 774 p + 170 774 p + 187 774 p + 216 774 p + 257 774 p + 125 773 p + 160 773 p + 173 773 p + 217 773 p + 226 773 p + 246 773 p + 280 773 p + 313 773 p + 127 772 p + 141 772 p + 165 772 p + 218 772 p + 230 772 p + 240 772 p + 122 771 p + 124 771 p + 191 771 p + 219 771 p + 243 771 p + 259 771 p + 287 771 p + 93 770 p + 127 770 p + 193 770 p + 220 770 p + 268 770 p + 314 770 p + 322 770 p + 334 770 p + 99 769 p + 133 769 p + 215 769 p + 221 769 p + 232 769 p + 262 769 p + 315 769 p + 108 768 p + 161 768 p + 177 768 p + 222 768 p + 245 768 p + 248 768 p + 291 768 p + 316 768 p + 111 767 p + 180 767 p + 183 767 p + 223 767 p + 117 766 p + 129 766 p + 174 766 p + 224 766 p + 231 766 p + 237 766 p + 253 766 p + 288 766 p + 118 765 p + 151 765 p + 188 765 p + 225 765 p + 235 765 p + 260 765 p + 261 765 p + 119 764 p + 196 764 p + 217 764 p + 226 764 p + 242 764 p + 255 764 p + 121 763 p + 122 763 p + 146 763 p + 227 763 p + 254 763 p + 277 763 p + 284 763 p + 289 763 p + 124 762 p + 192 762 p + 196 762 p + 228 762 p + 229 762 p + 243 762 p + 290 762 p + 296 762 p + 317 762 p + 125 761 p + 183 761 p + 228 761 p + 229 761 p + 246 761 p + 290 761 p + 325 761 p + 127 760 p + 194 760 p + 218 760 p + 230 760 p + 240 760 p + 283 760 p + 314 760 p + 129 759 p + 174 759 p + 224 759 p + 231 759 p + 276 759 p + 318 759 p + 130 758 p + 131 758 p + 221 758 p + 232 758 p + 281 758 p + 286 758 p + 291 758 p + 315 758 p + 319 758 p + 131 757 p + 182 757 p + 198 757 p + 233 757 p + 286 757 p + 292 757 p + 302 757 p + 133 756 p + 199 756 p + 200 756 p + 234 756 p + 250 756 p + 315 756 p + 320 756 p + 336 756 p + 134 755 p + 135 755 p + 225 755 p + 235 755 p + 253 755 p + 260 755 p + 272 755 p + 293 755 p + 321 755 p + 144 754 p + 147 754 p + 175 754 p + 236 754 p + 282 754 p + 312 754 p + 147 753 p + 166 753 p + 224 753 p + 237 753 p + 244 753 p + 265 753 p + 288 753 p + 148 752 p + 205 752 p + 214 752 p + 238 752 p + 245 752 p + 281 752 p + 294 752 p + 307 752 p + 155 751 p + 165 751 p + 204 751 p + 239 751 p + 263 751 p + 303 751 p + 165 750 p + 218 750 p + 230 750 p + 240 750 p + 251 750 p + 300 750 p + 314 750 p + 358 750 p + 161 749 p + 173 749 p + 180 749 p + 241 749 p + 246 749 p + 299 749 p + 311 749 p + 316 749 p + 160 748 p + 193 748 p + 226 748 p + 242 748 p + 322 748 p + 192 747 p + 219 747 p + 228 747 p + 243 747 p + 284 747 p + 290 747 p + 309 747 p + 317 747 p + 359 747 p + 147 746 p + 212 746 p + 237 746 p + 244 746 p + 253 746 p + 265 746 p + 312 746 p + 323 746 p + 161 745 p + 222 745 p + 238 745 p + 245 745 p + 269 745 p + 316 745 p + 324 745 p + 217 744 p + 229 744 p + 241 744 p + 246 744 p + 255 744 p + 299 744 p + 311 744 p + 313 744 p + 325 744 p + 342 744 p + 354 744 p + 360 744 p + 388 744 p + 403 744 p + 111 743 p + 168 743 p + 202 743 p + 247 743 p + 299 743 p + 197 742 p + 199 742 p + 222 742 p + 248 742 p + 291 742 p + 326 742 p + 357 742 p + 182 741 p + 189 741 p + 201 741 p + 249 741 p + 258 741 p + 156 740 p + 159 740 p + 234 740 p + 250 740 p + 310 740 p + 327 740 p + 347 740 p + 153 739 p + 163 739 p + 240 739 p + 251 739 p + 300 739 p + 158 738 p + 175 738 p + 196 738 p + 252 738 p + 279 738 p + 328 738 p + 335 738 p + 345 738 p + 356 738 p + 224 737 p + 235 737 p + 244 737 p + 253 737 p + 272 737 p + 323 737 p + 329 737 p + 338 737 p + 190 736 p + 213 736 p + 227 736 p + 254 736 p + 277 736 p + 289 736 p + 301 736 p + 318 736 p + 330 736 p + 196 735 p + 226 735 p + 246 735 p + 255 735 p + 296 735 p + 328 735 p + 354 735 p + 422 735 p + 155 734 p + 156 734 p + 211 734 p + 256 734 p + 327 734 p + 348 734 p + 350 734 p + 156 733 p + 207 733 p + 216 733 p + 257 733 p + 295 733 p + 332 733 p + 347 733 p + 361 733 p + 166 732 p + 201 732 p + 249 732 p + 258 732 p + 276 732 p + 306 732 p + 331 732 p + 362 732 p + 170 731 p + 203 731 p + 219 731 p + 259 731 p + 262 731 p + 295 731 p + 317 731 p + 353 731 p + 363 731 p + 188 730 p + 225 730 p + 235 730 p + 260 730 p + 274 730 p + 285 730 p + 293 730 p + 321 730 p + 181 729 p + 202 729 p + 225 729 p + 261 729 p + 266 729 p + 275 729 p + 333 729 p + 341 729 p + 364 729 p + 170 728 p + 221 728 p + 259 728 p + 262 728 p + 278 728 p + 287 728 p + 320 728 p + 361 728 p + 363 728 p + 365 728 p + 375 728 p + 155 727 p + 176 727 p + 239 727 p + 263 727 p + 273 727 p + 327 727 p + 344 727 p + 350 727 p + 366 727 p + 101 726 p + 178 726 p + 181 726 p + 264 726 p + 274 726 p + 305 726 p + 334 726 p + 147 725 p + 237 725 p + 244 725 p + 265 725 p + 323 725 p + 332 725 p + 348 725 p + 367 725 p + 151 724 p + 213 724 p + 261 724 p + 266 724 p + 301 724 p + 321 724 p + 333 724 p + 153 723 p + 205 723 p + 209 723 p + 267 723 p + 305 723 p + 358 723 p + 368 723 p + 370 723 p + 158 722 p + 178 722 p + 220 722 p + 268 722 p + 298 722 p + 328 722 p + 369 722 p + 374 722 p + 387 722 p + 405 722 p + 161 721 p + 168 721 p + 245 721 p + 269 721 p + 271 721 p + 307 721 p + 349 721 p + 166 720 p + 201 720 p + 211 720 p + 270 720 p + 303 720 p + 331 720 p + 348 720 p + 355 720 p + 168 719 p + 205 719 p + 269 719 p + 271 719 p + 304 719 p + 370 719 p + 174 718 p + 235 718 p + 253 718 p + 272 718 p + 318 718 p + 338 718 p + 155 717 p + 176 717 p + 263 717 p + 273 717 p + 178 716 p + 260 716 p + 264 716 p + 274 716 p + 334 716 p + 341 716 p + 369 716 p + 371 716 p + 181 715 p + 195 715 p + 261 715 p + 275 715 p + 305 715 p + 182 714 p + 231 714 p + 258 714 p + 276 714 p + 306 714 p + 362 714 p + 372 714 p + 190 713 p + 227 713 p + 254 713 p + 277 713 p + 278 713 p + 292 713 p + 330 713 p + 191 712 p + 262 712 p + 277 712 p + 278 712 p + 287 712 p + 337 712 p + 343 712 p + 352 712 p + 196 711 p + 203 711 p + 252 711 p + 279 711 p + 296 711 p + 335 711 p + 353 711 p + 197 710 p + 206 710 p + 217 710 p + 280 710 p + 313 710 p + 198 709 p + 232 709 p + 238 709 p + 281 709 p + 319 709 p + 324 709 p + 339 709 p + 203 708 p + 207 708 p + 236 708 p + 282 708 p + 295 708 p + 335 708 p + 353 708 p + 142 707 p + 204 707 p + 230 707 p + 283 707 p + 297 707 p + 210 706 p + 227 706 p + 243 706 p + 284 706 p + 308 706 p + 343 706 p + 359 706 p + 377 706 p + 178 705 p + 212 705 p + 260 705 p + 285 705 p + 298 705 p + 215 704 p + 232 704 p + 233 704 p + 286 704 p + 292 704 p + 302 704 p + 337 704 p + 346 704 p + 351 704 p + 219 703 p + 262 703 p + 278 703 p + 287 703 p + 343 703 p + 166 702 p + 224 702 p + 237 702 p + 288 702 p + 338 702 p + 355 702 p + 210 701 p + 227 701 p + 254 701 p + 289 701 p + 301 701 p + 308 701 p + 330 701 p + 228 700 p + 229 700 p + 243 700 p + 290 700 p + 309 700 p + 222 699 p + 232 699 p + 248 699 p + 291 699 p + 319 699 p + 336 699 p + 233 698 p + 277 698 p + 286 698 p + 292 698 p + 337 698 p + 346 698 p + 212 697 p + 235 697 p + 260 697 p + 293 697 p + 329 697 p + 198 696 p + 205 696 p + 238 696 p + 294 696 p + 370 696 p + 373 696 p + 376 696 p + 390 696 p + 257 695 p + 259 695 p + 282 695 p + 295 695 p + 228 694 p + 255 694 p + 279 694 p + 296 694 p + 325 694 p + 345 694 p + 354 694 p + 406 694 p + 427 694 p + 428 694 p + 176 693 p + 206 693 p + 283 693 p + 297 693 p + 322 693 p + 344 693 p + 407 693 p + 212 692 p + 268 692 p + 285 692 p + 298 692 p + 369 692 p + 374 692 p + 395 692 p + 241 691 p + 246 691 p + 247 691 p + 299 691 p + 304 691 p + 309 691 p + 388 691 p + 408 691 p + 201 690 p + 240 690 p + 251 690 p + 300 690 p + 306 690 p + 358 690 p + 384 690 p + 386 690 p + 393 690 p + 400 690 p + 254 689 p + 266 689 p + 289 689 p + 301 689 p + 409 689 p + 430 689 p + 198 688 p + 233 688 p + 286 688 p + 302 688 p + 373 688 p + 201 687 p + 239 687 p + 270 687 p + 303 687 p + 350 687 p + 202 686 p + 271 686 p + 299 686 p + 304 686 p + 340 686 p + 264 685 p + 267 685 p + 275 685 p + 305 685 p + 341 685 p + 368 685 p + 258 684 p + 276 684 p + 300 684 p + 306 684 p + 362 684 p + 384 684 p + 401 684 p + 205 683 p + 238 683 p + 269 683 p + 307 683 p + 349 683 p + 210 682 p + 284 682 p + 289 682 p + 308 682 p + 340 682 p + 410 682 p + 447 682 p + 243 681 p + 290 681 p + 299 681 p + 309 681 p + 388 681 p + 402 681 p + 176 680 p + 199 680 p + 250 680 p + 310 680 p + 326 680 p + 336 680 p + 344 680 p + 404 680 p + 411 680 p + 197 679 p + 241 679 p + 246 679 p + 311 679 p + 342 679 p + 212 678 p + 236 678 p + 244 678 p + 312 678 p + 329 678 p + 332 678 p + 356 678 p + 367 678 p + 394 678 p + 217 677 p + 246 677 p + 280 677 p + 313 677 p + 360 677 p + 220 676 p + 230 676 p + 240 676 p + 314 676 p + 382 676 p + 391 676 p + 412 676 p + 413 676 p + 457 676 p + 221 675 p + 232 675 p + 234 675 p + 315 675 p + 320 675 p + 351 675 p + 222 674 p + 241 674 p + 245 674 p + 316 674 p + 324 674 p + 342 674 p + 349 674 p + 228 673 p + 243 673 p + 259 673 p + 317 673 p + 359 673 p + 398 673 p + 406 673 p + 231 672 p + 254 672 p + 272 672 p + 318 672 p + 372 672 p + 232 671 p + 281 671 p + 291 671 p + 319 671 p + 339 671 p + 351 671 p + 383 671 p + 392 671 p + 399 671 p + 234 670 p + 262 670 p + 315 670 p + 320 670 p + 365 670 p + 235 669 p + 260 669 p + 266 669 p + 321 669 p + 364 669 p + 371 669 p + 378 669 p + 220 668 p + 242 668 p + 297 668 p + 322 668 p + 387 668 p + 413 668 p + 458 668 p + 244 667 p + 253 667 p + 265 667 p + 323 667 p + 367 667 p + 379 667 p + 245 666 p + 281 666 p + 316 666 p + 324 666 p + 339 666 p + 229 665 p + 246 665 p + 296 665 p + 325 665 p + 197 664 p + 248 664 p + 310 664 p + 326 664 p + 357 664 p + 407 664 p + 411 664 p + 414 664 p + 250 663 p + 256 663 p + 263 663 p + 327 663 p + 347 663 p + 366 663 p + 252 662 p + 255 662 p + 268 662 p + 328 662 p + 345 662 p + 387 662 p + 253 661 p + 293 661 p + 312 661 p + 329 661 p + 378 661 p + 379 661 p + 395 661 p + 415 661 p + 451 661 p + 254 660 p + 277 660 p + 289 660 p + 330 660 p + 352 660 p + 409 660 p + 426 660 p + 201 659 p + 258 659 p + 270 659 p + 331 659 p + 384 659 p + 386 659 p + 389 659 p + 257 658 p + 265 658 p + 312 658 p + 332 658 p + 380 658 p + 396 658 p + 416 658 p + 439 658 p + 202 657 p + 261 657 p + 266 657 p + 333 657 p + 340 657 p + 220 656 p + 264 656 p + 274 656 p + 334 656 p + 368 656 p + 405 656 p + 417 656 p + 459 656 p + 252 655 p + 279 655 p + 282 655 p + 335 655 p + 356 655 p + 380 655 p + 234 654 p + 291 654 p + 310 654 p + 336 654 p + 383 654 p + 418 654 p + 463 654 p + 278 653 p + 286 653 p + 292 653 p + 337 653 p + 346 653 p + 375 653 p + 385 653 p + 253 652 p + 272 652 p + 288 652 p + 338 652 p + 379 652 p + 381 652 p + 397 652 p + 281 651 p + 319 651 p + 324 651 p + 339 651 p + 373 651 p + 376 651 p + 392 651 p + 304 650 p + 308 650 p + 333 650 p + 340 650 p + 402 650 p + 419 650 p + 261 649 p + 274 649 p + 305 649 p + 341 649 p + 364 649 p + 417 649 p + 419 649 p + 420 649 p + 438 649 p + 246 648 p + 311 648 p + 316 648 p + 342 648 p + 357 648 p + 360 648 p + 421 648 p + 456 648 p + 278 647 p + 284 647 p + 287 647 p + 343 647 p + 352 647 p + 363 647 p + 377 647 p + 263 646 p + 297 646 p + 310 646 p + 344 646 p + 412 646 p + 443 646 p + 252 645 p + 296 645 p + 328 645 p + 345 645 p + 422 645 p + 427 645 p + 431 645 p + 435 645 p + 286 644 p + 292 644 p + 337 644 p + 346 644 p + 401 644 p + 423 644 p + 454 644 p + 250 643 p + 257 643 p + 327 643 p + 347 643 p + 361 643 p + 396 643 p + 404 643 p + 460 643 p + 256 642 p + 265 642 p + 270 642 p + 348 642 p + 355 642 p + 396 642 p + 425 642 p + 269 641 p + 307 641 p + 316 641 p + 349 641 p + 421 641 p + 424 641 p + 256 640 p + 263 640 p + 303 640 p + 350 640 p + 366 640 p + 391 640 p + 425 640 p + 461 640 p + 286 639 p + 315 639 p + 319 639 p + 351 639 p + 383 639 p + 278 638 p + 330 638 p + 343 638 p + 352 638 p + 375 638 p + 385 638 p + 426 638 p + 259 637 p + 279 637 p + 282 637 p + 353 637 p + 398 637 p + 416 637 p + 427 637 p + 246 636 p + 255 636 p + 296 636 p + 354 636 p + 403 636 p + 428 636 p + 442 636 p + 270 635 p + 288 635 p + 348 635 p + 355 635 p + 381 635 p + 389 635 p + 429 635 p + 441 635 p + 452 635 p + 462 635 p + 252 634 p + 312 634 p + 335 634 p + 356 634 p + 374 634 p + 380 634 p + 248 633 p + 326 633 p + 342 633 p + 357 633 p + 392 633 p + 411 633 p + 414 633 p + 421 633 p + 463 633 p + 478 633 p + 240 632 p + 267 632 p + 300 632 p + 358 632 p + 382 632 p + 400 632 p + 434 632 p + 464 632 p + 243 631 p + 284 631 p + 317 631 p + 359 631 p + 377 631 p + 410 631 p + 246 630 p + 313 630 p + 342 630 p + 360 630 p + 403 630 p + 414 630 p + 456 630 p + 257 629 p + 262 629 p + 347 629 p + 361 629 p + 365 629 p + 416 629 p + 446 629 p + 465 629 p + 258 628 p + 276 628 p + 306 628 p + 362 628 p + 372 628 p + 397 628 p + 437 628 p + 259 627 p + 262 627 p + 343 627 p + 363 627 p + 398 627 p + 261 626 p + 321 626 p + 341 626 p + 364 626 p + 430 626 p + 438 626 p + 262 625 p + 320 625 p + 361 625 p + 365 625 p + 418 625 p + 263 624 p + 327 624 p + 350 624 p + 366 624 p + 391 624 p + 404 624 p + 461 624 p + 474 624 p + 265 623 p + 312 623 p + 323 623 p + 367 623 p + 394 623 p + 429 623 p + 267 622 p + 305 622 p + 334 622 p + 368 622 p + 382 622 p + 420 622 p + 268 621 p + 274 621 p + 298 621 p + 369 621 p + 371 621 p + 415 621 p + 445 621 p + 267 620 p + 271 620 p + 294 620 p + 370 620 p + 420 620 p + 424 620 p + 434 620 p + 436 620 p + 274 619 p + 321 619 p + 369 619 p + 371 619 p + 378 619 p + 415 619 p + 417 619 p + 438 619 p + 445 619 p + 276 618 p + 318 618 p + 362 618 p + 372 618 p + 423 618 p + 294 617 p + 302 617 p + 339 617 p + 373 617 p + 376 617 p + 390 617 p + 399 617 p + 268 616 p + 298 616 p + 356 616 p + 374 616 p + 395 616 p + 431 616 p + 444 616 p + 488 616 p + 262 615 p + 337 615 p + 352 615 p + 375 615 p + 385 615 p + 446 615 p + 467 615 p + 487 615 p + 294 614 p + 339 614 p + 373 614 p + 376 614 p + 390 614 p + 436 614 p + 466 614 p + 471 614 p + 284 613 p + 343 613 p + 359 613 p + 377 613 p + 426 613 p + 467 613 p + 321 612 p + 329 612 p + 371 612 p + 378 612 p + 451 612 p + 455 612 p + 485 612 p + 323 611 p + 329 611 p + 338 611 p + 379 611 p + 381 611 p + 394 611 p + 449 611 p + 452 611 p + 332 610 p + 335 610 p + 356 610 p + 380 610 p + 431 610 p + 439 610 p + 338 609 p + 355 609 p + 379 609 p + 381 609 p + 397 609 p + 449 609 p + 452 609 p + 314 608 p + 358 608 p + 368 608 p + 382 608 p + 434 608 p + 457 608 p + 503 608 p + 517 608 p + 319 607 p + 336 607 p + 351 607 p + 383 607 p + 418 607 p + 468 607 p + 300 606 p + 306 606 p + 331 606 p + 384 606 p + 386 606 p + 393 606 p + 433 606 p + 437 606 p + 441 606 p + 337 605 p + 352 605 p + 375 605 p + 385 605 p + 432 605 p + 468 605 p + 487 605 p + 498 605 p + 300 604 p + 331 604 p + 384 604 p + 386 604 p + 389 604 p + 400 604 p + 268 603 p + 322 603 p + 328 603 p + 387 603 p + 405 603 p + 435 603 p + 246 602 p + 299 602 p + 309 602 p + 388 602 p + 402 602 p + 408 602 p + 442 602 p + 469 602 p + 331 601 p + 355 601 p + 386 601 p + 389 601 p + 425 601 p + 433 601 p + 462 601 p + 470 601 p + 294 600 p + 373 600 p + 376 600 p + 390 600 p + 393 600 p + 314 599 p + 350 599 p + 366 599 p + 391 599 p + 470 599 p + 496 599 p + 497 599 p + 526 599 p + 319 598 p + 339 598 p + 357 598 p + 392 598 p + 399 598 p + 466 598 p + 300 597 p + 384 597 p + 390 597 p + 393 597 p + 401 597 p + 437 597 p + 454 597 p + 464 597 p + 471 597 p + 484 597 p + 486 597 p + 312 596 p + 367 596 p + 379 596 p + 394 596 p + 444 596 p + 481 596 p + 298 595 p + 329 595 p + 374 595 p + 395 595 p + 332 594 p + 347 594 p + 348 594 p + 396 594 p + 429 594 p + 461 594 p + 465 594 p + 482 594 p + 489 594 p + 545 594 p + 338 593 p + 362 593 p + 381 593 p + 397 593 p + 409 593 p + 317 592 p + 353 592 p + 363 592 p + 398 592 p + 406 592 p + 440 592 p + 450 592 p + 494 592 p + 319 591 p + 373 591 p + 392 591 p + 399 591 p + 468 591 p + 300 590 p + 358 590 p + 386 590 p + 400 590 p + 433 590 p + 457 590 p + 493 590 p + 306 589 p + 346 589 p + 393 589 p + 401 589 p + 423 589 p + 454 589 p + 309 588 p + 340 588 p + 388 588 p + 402 588 p + 408 588 p + 410 588 p + 419 588 p + 447 588 p + 448 588 p + 469 588 p + 472 588 p + 492 588 p + 504 588 p + 546 588 p + 568 588 p + 570 588 p + 246 587 p + 354 587 p + 360 587 p + 403 587 p + 407 587 p + 422 587 p + 453 587 p + 458 587 p + 473 587 p + 505 587 p + 310 586 p + 347 586 p + 366 586 p + 404 586 p + 460 586 p + 474 586 p + 268 585 p + 334 585 p + 387 585 p + 405 585 p + 413 585 p + 458 585 p + 488 585 p + 506 585 p + 296 584 p + 317 584 p + 398 584 p + 406 584 p + 440 584 p + 442 584 p + 448 584 p + 450 584 p + 507 584 p + 297 583 p + 326 583 p + 403 583 p + 407 583 p + 412 583 p + 443 583 p + 473 583 p + 475 583 p + 299 582 p + 388 582 p + 402 582 p + 408 582 p + 301 581 p + 330 581 p + 397 581 p + 409 581 p + 430 581 p + 432 581 p + 449 581 p + 479 581 p + 508 581 p + 308 580 p + 359 580 p + 402 580 p + 410 580 p + 440 580 p + 447 580 p + 448 580 p + 500 580 p + 310 579 p + 326 579 p + 357 579 p + 411 579 p + 443 579 p + 463 579 p + 491 579 p + 314 578 p + 344 578 p + 407 578 p + 412 578 p + 475 578 p + 314 577 p + 322 577 p + 405 577 p + 413 577 p + 509 577 p + 516 577 p + 326 576 p + 357 576 p + 360 576 p + 414 576 p + 456 576 p + 473 576 p + 329 575 p + 369 575 p + 371 575 p + 415 575 p + 451 575 p + 476 575 p + 332 574 p + 353 574 p + 361 574 p + 416 574 p + 439 574 p + 465 574 p + 520 574 p + 547 574 p + 334 573 p + 341 573 p + 371 573 p + 417 573 p + 445 573 p + 459 573 p + 336 572 p + 365 572 p + 383 572 p + 418 572 p + 446 572 p + 460 572 p + 477 572 p + 499 572 p + 340 571 p + 341 571 p + 402 571 p + 419 571 p + 424 571 p + 483 571 p + 492 571 p + 510 571 p + 531 571 p + 341 570 p + 368 570 p + 370 570 p + 420 570 p + 459 570 p + 483 570 p + 511 570 p + 517 570 p + 342 569 p + 349 569 p + 357 569 p + 421 569 p + 466 569 p + 469 569 p + 478 569 p + 255 568 p + 345 568 p + 403 568 p + 422 568 p + 428 568 p + 435 568 p + 346 567 p + 372 567 p + 401 567 p + 423 567 p + 432 567 p + 349 566 p + 370 566 p + 419 566 p + 424 566 p + 483 566 p + 492 566 p + 534 566 p + 348 565 p + 350 565 p + 389 565 p + 425 565 p + 462 565 p + 470 565 p + 330 564 p + 352 564 p + 377 564 p + 426 564 p + 479 564 p + 296 563 p + 345 563 p + 353 563 p + 427 563 p + 450 563 p + 480 563 p + 296 562 p + 354 562 p + 422 562 p + 428 562 p + 453 562 p + 355 561 p + 367 561 p + 396 561 p + 429 561 p + 482 561 p + 548 561 p + 562 561 p + 301 560 p + 364 560 p + 409 560 p + 430 560 p + 472 560 p + 485 560 p + 345 559 p + 374 559 p + 380 559 p + 431 559 p + 444 559 p + 480 559 p + 490 559 p + 501 559 p + 385 558 p + 409 558 p + 423 558 p + 432 558 p + 384 557 p + 389 557 p + 400 557 p + 433 557 p + 464 557 p + 484 557 p + 493 557 p + 358 556 p + 370 556 p + 382 556 p + 434 556 p + 436 556 p + 503 556 p + 345 555 p + 387 555 p + 422 555 p + 435 555 p + 480 555 p + 490 555 p + 370 554 p + 376 554 p + 434 554 p + 436 554 p + 471 554 p + 519 554 p + 530 554 p + 362 553 p + 384 553 p + 393 553 p + 437 553 p + 441 553 p + 484 553 p + 486 553 p + 508 553 p + 341 552 p + 364 552 p + 371 552 p + 438 552 p + 455 552 p + 510 552 p + 511 552 p + 332 551 p + 380 551 p + 416 551 p + 439 551 p + 482 551 p + 398 550 p + 406 550 p + 410 550 p + 440 550 p + 512 550 p + 535 550 p + 355 549 p + 384 549 p + 437 549 p + 441 549 p + 513 549 p + 354 548 p + 388 548 p + 406 548 p + 442 548 p + 453 548 p + 502 548 p + 504 548 p + 344 547 p + 407 547 p + 411 547 p + 443 547 p + 496 547 p + 518 547 p + 374 546 p + 394 546 p + 431 546 p + 444 546 p + 476 546 p + 481 546 p + 549 546 p + 558 546 p + 369 545 p + 371 545 p + 417 545 p + 445 545 p + 455 545 p + 476 545 p + 495 545 p + 361 544 p + 375 544 p + 418 544 p + 446 544 p + 467 544 p + 494 544 p + 540 544 p + 543 544 p + 550 544 p + 308 543 p + 402 543 p + 410 543 p + 447 543 p + 472 543 p + 479 543 p + 500 543 p + 402 542 p + 406 542 p + 410 542 p + 448 542 p + 500 542 p + 514 542 p + 379 541 p + 381 541 p + 409 541 p + 449 541 p + 485 541 p + 508 541 p + 537 541 p + 398 540 p + 406 540 p + 427 540 p + 450 540 p + 501 540 p + 514 540 p + 329 539 p + 378 539 p + 415 539 p + 451 539 p + 481 539 p + 355 538 p + 379 538 p + 381 538 p + 452 538 p + 513 538 p + 548 538 p + 403 537 p + 428 537 p + 442 537 p + 453 537 p + 507 537 p + 539 537 p + 565 537 p + 346 536 p + 393 536 p + 401 536 p + 454 536 p + 378 535 p + 438 535 p + 445 535 p + 455 535 p + 515 535 p + 524 535 p + 529 535 p + 342 534 p + 360 534 p + 414 534 p + 456 534 p + 478 534 p + 502 534 p + 314 533 p + 382 533 p + 400 533 p + 457 533 p + 509 533 p + 516 533 p + 525 533 p + 541 533 p + 575 533 p + 579 533 p + 587 533 p + 322 532 p + 403 532 p + 405 532 p + 458 532 p + 475 532 p + 505 532 p + 506 532 p + 536 532 p + 557 532 p + 597 532 p + 334 531 p + 417 531 p + 420 531 p + 459 531 p + 506 531 p + 509 531 p + 511 531 p + 517 531 p + 551 531 p + 347 530 p + 404 530 p + 418 530 p + 460 530 p + 474 530 p + 518 530 p + 533 530 p + 543 530 p + 545 530 p + 350 529 p + 366 529 p + 396 529 p + 461 529 p + 489 529 p + 355 528 p + 389 528 p + 425 528 p + 462 528 p + 489 528 p + 513 528 p + 336 527 p + 357 527 p + 411 527 p + 463 527 p + 477 527 p + 491 527 p + 533 527 p + 358 526 p + 393 526 p + 433 526 p + 464 526 p + 503 526 p + 519 526 p + 532 526 p + 361 525 p + 396 525 p + 416 525 p + 465 525 p + 520 525 p + 543 525 p + 552 525 p + 376 524 p + 392 524 p + 421 524 p + 466 524 p + 530 524 p + 534 524 p + 542 524 p + 553 524 p + 559 524 p + 591 524 p + 375 523 p + 377 523 p + 446 523 p + 467 523 p + 494 523 p + 498 523 p + 512 523 p + 528 523 p + 550 523 p + 383 522 p + 385 522 p + 399 522 p + 468 522 p + 477 522 p + 487 522 p + 554 522 p + 388 521 p + 402 521 p + 421 521 p + 469 521 p + 502 521 p + 538 521 p + 568 521 p + 389 520 p + 391 520 p + 425 520 p + 470 520 p + 493 520 p + 376 519 p + 393 519 p + 436 519 p + 471 519 p + 553 519 p + 555 519 p + 582 519 p + 402 518 p + 430 518 p + 447 518 p + 472 518 p + 510 518 p + 522 518 p + 523 518 p + 546 518 p + 403 517 p + 407 517 p + 414 517 p + 473 517 p + 505 517 p + 527 517 p + 556 517 p + 602 517 p + 366 516 p + 404 516 p + 460 516 p + 474 516 p + 496 516 p + 497 516 p + 544 516 p + 407 515 p + 412 515 p + 458 515 p + 475 515 p + 516 515 p + 526 515 p + 556 515 p + 557 515 p + 592 515 p + 617 515 p + 415 514 p + 444 514 p + 445 514 p + 476 514 p + 488 514 p + 495 514 p + 558 514 p + 418 513 p + 463 513 p + 468 513 p + 477 513 p + 499 513 p + 533 513 p + 553 513 p + 559 513 p + 357 512 p + 421 512 p + 456 512 p + 478 512 p + 491 512 p + 527 512 p + 560 512 p + 409 511 p + 426 511 p + 447 511 p + 479 511 p + 521 511 p + 427 510 p + 431 510 p + 435 510 p + 480 510 p + 501 510 p + 507 510 p + 394 509 p + 444 509 p + 451 509 p + 481 509 p + 515 509 p + 537 509 p + 548 509 p + 561 509 p + 396 508 p + 429 508 p + 439 508 p + 482 508 p + 547 508 p + 549 508 p + 552 508 p + 562 508 p + 419 507 p + 420 507 p + 424 507 p + 483 507 p + 530 507 p + 531 507 p + 566 507 p + 593 507 p + 595 507 p + 604 507 p + 393 506 p + 433 506 p + 437 506 p + 484 506 p + 486 506 p + 532 506 p + 583 506 p + 378 505 p + 430 505 p + 449 505 p + 485 505 p + 515 505 p + 563 505 p + 393 504 p + 437 504 p + 484 504 p + 486 504 p + 554 504 p + 555 504 p + 594 504 p + 616 504 p + 375 503 p + 385 503 p + 468 503 p + 487 503 p + 498 503 p + 499 503 p + 540 503 p + 374 502 p + 405 502 p + 476 502 p + 488 502 p + 490 502 p + 495 502 p + 536 502 p + 558 502 p + 396 501 p + 461 501 p + 462 501 p + 489 501 p + 497 501 p + 584 501 p + 586 501 p + 431 500 p + 435 500 p + 488 500 p + 490 500 p + 539 500 p + 569 500 p + 411 499 p + 463 499 p + 478 499 p + 491 499 p + 518 499 p + 560 499 p + 402 498 p + 419 498 p + 424 498 p + 492 498 p + 546 498 p + 568 498 p + 595 498 p + 400 497 p + 433 497 p + 470 497 p + 493 497 p + 532 497 p + 575 497 p + 584 497 p + 605 497 p + 398 496 p + 446 496 p + 467 496 p + 494 496 p + 520 496 p + 535 496 p + 550 496 p + 445 495 p + 476 495 p + 488 495 p + 495 495 p + 524 495 p + 574 495 p + 391 494 p + 443 494 p + 474 494 p + 496 494 p + 526 494 p + 544 494 p + 391 493 p + 474 493 p + 489 493 p + 497 493 p + 385 492 p + 467 492 p + 487 492 p + 498 492 p + 528 492 p + 576 492 p + 620 492 p + 418 491 p + 477 491 p + 487 491 p + 499 491 p + 540 491 p + 589 491 p + 410 490 p + 447 490 p + 448 490 p + 500 490 p + 512 490 p + 431 489 p + 450 489 p + 480 489 p + 501 489 p + 547 489 p + 564 489 p + 569 489 p + 572 489 p + 442 488 p + 456 488 p + 469 488 p + 502 488 p + 504 488 p + 527 488 p + 538 488 p + 565 488 p + 382 487 p + 434 487 p + 464 487 p + 503 487 p + 519 487 p + 541 487 p + 566 487 p + 571 487 p + 402 486 p + 442 486 p + 502 486 p + 504 486 p + 596 486 p + 606 486 p + 618 486 p + 643 486 p + 403 485 p + 458 485 p + 473 485 p + 505 485 p + 597 485 p + 405 484 p + 458 484 p + 459 484 p + 506 484 p + 536 484 p + 551 484 p + 581 484 p + 598 484 p + 406 483 p + 453 483 p + 480 483 p + 507 483 p + 514 483 p + 409 482 p + 437 482 p + 449 482 p + 508 482 p + 521 482 p + 563 482 p + 594 482 p + 413 481 p + 457 481 p + 459 481 p + 509 481 p + 525 481 p + 419 480 p + 438 480 p + 472 480 p + 510 480 p + 529 480 p + 531 480 p + 593 480 p + 420 479 p + 438 479 p + 459 479 p + 511 479 p + 524 479 p + 593 479 p + 440 478 p + 467 478 p + 500 478 p + 512 478 p + 521 478 p + 522 478 p + 528 478 p + 596 478 p + 603 478 p + 441 477 p + 452 477 p + 462 477 p + 513 477 p + 583 477 p + 584 477 p + 599 477 p + 619 477 p + 633 477 p + 448 476 p + 450 476 p + 507 476 p + 514 476 p + 535 476 p + 564 476 p + 596 476 p + 455 475 p + 481 475 p + 485 475 p + 515 475 p + 537 475 p + 561 475 p + 563 475 p + 590 475 p + 600 475 p + 413 474 p + 457 474 p + 475 474 p + 516 474 p + 557 474 p + 581 474 p + 587 474 p + 382 473 p + 420 473 p + 459 473 p + 517 473 p + 525 473 p + 551 473 p + 443 472 p + 460 472 p + 491 472 p + 518 472 p + 544 472 p + 556 472 p + 588 472 p + 436 471 p + 464 471 p + 503 471 p + 519 471 p + 580 471 p + 416 470 p + 465 470 p + 494 470 p + 520 470 p + 567 470 p + 578 470 p + 479 469 p + 508 469 p + 512 469 p + 521 469 p + 522 469 p + 523 469 p + 603 469 p + 620 469 p + 627 469 p + 644 469 p + 651 469 p + 472 468 p + 512 468 p + 521 468 p + 522 468 p + 523 468 p + 570 468 p + 577 468 p + 472 467 p + 521 467 p + 522 467 p + 523 467 p + 577 467 p + 627 467 p + 628 467 p + 644 467 p + 455 466 p + 495 466 p + 511 466 p + 524 466 p + 529 466 p + 590 466 p + 624 466 p + 645 466 p + 457 465 p + 509 465 p + 517 465 p + 525 465 p + 579 465 p + 391 464 p + 475 464 p + 496 464 p + 526 464 p + 587 464 p + 601 464 p + 473 463 p + 478 463 p + 502 463 p + 527 463 p + 538 463 p + 565 463 p + 573 463 p + 602 463 p + 467 462 p + 498 462 p + 512 462 p + 528 462 p + 585 462 p + 603 462 p + 620 462 p + 639 462 p + 455 461 p + 510 461 p + 524 461 p + 529 461 p + 590 461 p + 624 461 p + 628 461 p + 436 460 p + 466 460 p + 483 460 p + 530 460 p + 534 460 p + 582 460 p + 604 460 p + 419 459 p + 483 459 p + 510 459 p + 531 459 p + 595 459 p + 464 458 p + 484 458 p + 493 458 p + 532 458 p + 541 458 p + 571 458 p + 583 458 p + 605 458 p + 630 458 p + 632 458 p + 460 457 p + 463 457 p + 477 457 p + 533 457 p + 559 457 p + 588 457 p + 589 457 p + 629 457 p + 424 456 p + 466 456 p + 530 456 p + 534 456 p + 542 456 p + 440 455 p + 494 455 p + 514 455 p + 535 455 p + 567 455 p + 458 454 p + 488 454 p + 506 454 p + 536 454 p + 539 454 p + 574 454 p + 598 454 p + 622 454 p + 659 454 p + 449 453 p + 481 453 p + 515 453 p + 537 453 p + 469 452 p + 502 452 p + 527 452 p + 538 452 p + 542 452 p + 606 452 p + 453 451 p + 490 451 p + 536 451 p + 539 451 p + 564 451 p + 607 451 p + 659 451 p + 446 450 p + 487 450 p + 499 450 p + 540 450 p + 576 450 p + 585 450 p + 608 450 p + 457 449 p + 503 449 p + 532 449 p + 541 449 p + 575 449 p + 609 449 p + 466 448 p + 534 448 p + 538 448 p + 542 448 p + 591 448 p + 621 448 p + 626 448 p + 446 447 p + 460 447 p + 465 447 p + 543 447 p + 589 447 p + 610 447 p + 613 447 p + 665 447 p + 474 446 p + 496 446 p + 518 446 p + 544 446 p + 545 446 p + 588 446 p + 592 446 p + 610 446 p + 635 446 p + 637 446 p + 396 445 p + 460 445 p + 544 445 p + 545 445 p + 586 445 p + 610 445 p + 402 444 p + 472 444 p + 492 444 p + 546 444 p + 570 444 p + 577 444 p + 618 444 p + 416 443 p + 482 443 p + 501 443 p + 547 443 p + 549 443 p + 552 443 p + 611 443 p + 429 442 p + 452 442 p + 481 442 p + 548 442 p + 562 442 p + 599 442 p + 612 442 p + 444 441 p + 482 441 p + 547 441 p + 549 441 p + 572 441 p + 611 441 p + 446 440 p + 467 440 p + 494 440 p + 550 440 p + 578 440 p + 585 440 p + 459 439 p + 506 439 p + 517 439 p + 551 439 p + 566 439 p + 579 439 p + 581 439 p + 631 439 p + 645 439 p + 646 439 p + 691 439 p + 716 439 p + 465 438 p + 482 438 p + 547 438 p + 552 438 p + 611 438 p + 613 438 p + 638 438 p + 647 438 p + 466 437 p + 471 437 p + 477 437 p + 553 437 p + 554 437 p + 582 437 p + 614 437 p + 468 436 p + 486 436 p + 553 436 p + 554 436 p + 555 436 p + 576 436 p + 615 436 p + 616 436 p + 471 435 p + 486 435 p + 554 435 p + 555 435 p + 580 435 p + 615 435 p + 616 435 p + 473 434 p + 475 434 p + 518 434 p + 556 434 p + 573 434 p + 592 434 p + 602 434 p + 617 434 p + 625 434 p + 648 434 p + 692 434 p + 458 433 p + 475 433 p + 516 433 p + 557 433 p + 597 433 p + 598 433 p + 617 433 p + 660 433 p + 444 432 p + 476 432 p + 488 432 p + 558 432 p + 561 432 p + 569 432 p + 574 432 p + 466 431 p + 477 431 p + 533 431 p + 559 431 p + 560 431 p + 629 431 p + 649 431 p + 478 430 p + 491 430 p + 559 430 p + 560 430 p + 573 430 p + 626 430 p + 481 429 p + 515 429 p + 558 429 p + 561 429 p + 612 429 p + 623 429 p + 650 429 p + 429 428 p + 482 428 p + 548 428 p + 562 428 p + 640 428 p + 485 427 p + 508 427 p + 515 427 p + 563 427 p + 600 427 p + 619 427 p + 651 427 p + 501 426 p + 514 426 p + 539 426 p + 564 426 p + 567 426 p + 607 426 p + 652 426 p + 653 426 p + 658 426 p + 664 426 p + 686 426 p + 693 426 p + 453 425 p + 502 425 p + 527 425 p + 565 425 p + 606 425 p + 607 425 p + 625 425 p + 483 424 p + 503 424 p + 551 424 p + 566 424 p + 571 424 p + 609 424 p + 642 424 p + 520 423 p + 535 423 p + 564 423 p + 567 423 p + 578 423 p + 641 423 p + 652 423 p + 653 423 p + 686 423 p + 690 423 p + 694 423 p + 402 422 p + 469 422 p + 492 422 p + 568 422 p + 618 422 p + 490 421 p + 501 421 p + 558 421 p + 569 421 p + 572 421 p + 622 421 p + 402 420 p + 522 420 p + 546 420 p + 570 420 p + 503 419 p + 532 419 p + 566 419 p + 571 419 p + 580 419 p + 630 419 p + 642 419 p + 501 418 p + 549 418 p + 569 418 p + 572 418 p + 652 418 p + 654 418 p + 527 417 p + 556 417 p + 560 417 p + 573 417 p + 648 417 p + 495 416 p + 536 416 p + 558 416 p + 574 416 p + 622 416 p + 645 416 p + 650 416 p + 457 415 p + 493 415 p + 541 415 p + 575 415 p + 632 415 p + 498 414 p + 540 414 p + 554 414 p + 576 414 p + 614 414 p + 634 414 p + 655 414 p + 695 414 p + 522 413 p + 523 413 p + 546 413 p + 577 413 p + 627 413 p + 643 413 p + 656 413 p + 669 413 p + 670 413 p + 696 413 p + 520 412 p + 550 412 p + 567 412 p + 578 412 p + 608 412 p + 613 412 p + 641 412 p + 457 411 p + 525 411 p + 551 411 p + 579 411 p + 609 411 p + 519 410 p + 555 410 p + 571 410 p + 580 410 p + 636 410 p + 506 409 p + 516 409 p + 551 409 p + 581 409 p + 631 409 p + 471 408 p + 530 408 p + 553 408 p + 582 408 p + 591 408 p + 615 408 p + 636 408 p + 657 408 p + 484 407 p + 513 407 p + 532 407 p + 583 407 p + 594 407 p + 630 407 p + 633 407 p + 671 407 p + 489 406 p + 493 406 p + 513 406 p + 584 406 p + 586 406 p + 599 406 p + 601 406 p + 605 406 p + 633 406 p + 640 406 p + 680 406 p + 697 406 p + 528 405 p + 540 405 p + 550 405 p + 585 405 p + 639 405 p + 641 405 p + 489 404 p + 545 404 p + 584 404 p + 586 404 p + 637 404 p + 638 404 p + 640 404 p + 683 404 p + 457 403 p + 516 403 p + 526 403 p + 587 403 p + 601 403 p + 631 403 p + 667 403 p + 518 402 p + 533 402 p + 544 402 p + 588 402 p + 648 402 p + 676 402 p + 698 402 p + 739 402 p + 499 401 p + 533 401 p + 543 401 p + 589 401 p + 608 401 p + 614 401 p + 629 401 p + 668 401 p + 698 401 p + 699 401 p + 715 401 p + 515 400 p + 524 400 p + 529 400 p + 590 400 p + 628 400 p + 677 400 p + 685 400 p + 733 400 p + 466 399 p + 542 399 p + 582 399 p + 591 399 p + 626 399 p + 657 399 p + 662 399 p + 663 399 p + 682 399 p + 740 399 p + 475 398 p + 544 398 p + 556 398 p + 592 398 p + 483 397 p + 510 397 p + 511 397 p + 593 397 p + 624 397 p + 656 397 p + 486 396 p + 508 396 p + 583 396 p + 594 396 p + 619 396 p + 655 396 p + 483 395 p + 492 395 p + 531 395 p + 595 395 p + 604 395 p + 621 395 p + 656 395 p + 662 395 p + 504 394 p + 512 394 p + 514 394 p + 596 394 p + 653 394 p + 658 394 p + 661 394 p + 670 394 p + 672 394 p + 458 393 p + 505 393 p + 557 393 p + 597 393 p + 659 393 p + 660 393 p + 506 392 p + 536 392 p + 557 392 p + 598 392 p + 660 392 p + 681 392 p + 684 392 p + 700 392 p + 513 391 p + 548 391 p + 584 391 p + 599 391 p + 600 391 p + 612 391 p + 697 391 p + 701 391 p + 712 391 p + 722 391 p + 515 390 p + 563 390 p + 599 390 p + 600 390 p + 677 390 p + 687 390 p + 702 390 p + 526 389 p + 584 389 p + 587 389 p + 601 389 p + 635 389 p + 637 389 p + 666 389 p + 674 389 p + 728 389 p + 743 389 p + 473 388 p + 527 388 p + 556 388 p + 602 388 p + 512 387 p + 521 387 p + 528 387 p + 603 387 p + 661 387 p + 670 387 p + 675 387 p + 703 387 p + 483 386 p + 530 386 p + 595 386 p + 604 386 p + 646 386 p + 662 386 p + 682 386 p + 704 386 p + 713 386 p + 493 385 p + 532 385 p + 584 385 p + 605 385 p + 632 385 p + 674 385 p + 504 384 p + 538 384 p + 565 384 p + 606 384 p + 658 384 p + 663 384 p + 688 384 p + 705 384 p + 735 384 p + 764 384 p + 539 383 p + 564 383 p + 565 383 p + 607 383 p + 625 383 p + 664 383 p + 706 383 p + 540 382 p + 578 382 p + 589 382 p + 608 382 p + 665 382 p + 678 382 p + 541 381 p + 566 381 p + 579 381 p + 609 381 p + 642 381 p + 666 381 p + 679 381 p + 689 381 p + 543 380 p + 544 380 p + 545 380 p + 610 380 p + 638 380 p + 698 380 p + 707 380 p + 547 379 p + 549 379 p + 552 379 p + 611 379 p + 623 379 p + 647 379 p + 701 379 p + 708 379 p + 548 378 p + 561 378 p + 599 378 p + 612 378 p + 623 378 p + 543 377 p + 552 377 p + 578 377 p + 613 377 p + 647 377 p + 665 377 p + 553 376 p + 576 376 p + 589 376 p + 614 376 p + 634 376 p + 657 376 p + 668 376 p + 554 375 p + 555 375 p + 582 375 p + 615 375 p + 634 375 p + 636 375 p + 486 374 p + 554 374 p + 555 374 p + 616 374 p + 711 374 p + 475 373 p + 556 373 p + 557 373 p + 617 373 p + 635 373 p + 667 373 p + 673 373 p + 504 372 p + 546 372 p + 568 372 p + 618 372 p + 621 372 p + 643 372 p + 513 371 p + 563 371 p + 594 371 p + 619 371 p + 651 371 p + 671 371 p + 702 371 p + 498 370 p + 521 370 p + 528 370 p + 620 370 p + 639 370 p + 695 370 p + 703 370 p + 542 369 p + 595 369 p + 618 369 p + 621 369 p + 663 369 p + 705 369 p + 536 368 p + 569 368 p + 574 368 p + 622 368 p + 650 368 p + 654 368 p + 664 368 p + 709 368 p + 718 368 p + 561 367 p + 611 367 p + 612 367 p + 623 367 p + 654 367 p + 687 367 p + 708 367 p + 524 366 p + 529 366 p + 593 366 p + 624 366 p + 685 366 p + 691 366 p + 556 365 p + 565 365 p + 607 365 p + 625 365 p + 673 365 p + 688 365 p + 706 365 p + 710 365 p + 542 364 p + 560 364 p + 591 364 p + 626 364 p + 521 363 p + 523 363 p + 577 363 p + 627 363 p + 644 363 p + 675 363 p + 523 362 p + 529 362 p + 590 362 p + 628 362 p + 669 362 p + 685 362 p + 533 361 p + 559 361 p + 589 361 p + 629 361 p + 649 361 p + 532 360 p + 571 360 p + 583 360 p + 630 360 p + 679 360 p + 711 360 p + 551 359 p + 581 359 p + 587 359 p + 631 359 p + 681 359 p + 684 359 p + 716 359 p + 741 359 p + 753 359 p + 532 358 p + 575 358 p + 605 358 p + 632 358 p + 666 358 p + 679 358 p + 513 357 p + 583 357 p + 584 357 p + 633 357 p + 671 357 p + 697 357 p + 576 356 p + 614 356 p + 615 356 p + 634 356 p + 655 356 p + 668 356 p + 723 356 p + 724 356 p + 730 356 p + 738 356 p + 742 356 p + 787 356 p + 831 356 p + 544 355 p + 601 355 p + 617 355 p + 635 355 p + 667 355 p + 676 355 p + 728 355 p + 580 354 p + 582 354 p + 615 354 p + 636 354 p + 723 354 p + 544 353 p + 586 353 p + 601 353 p + 637 353 p + 676 353 p + 680 353 p + 707 353 p + 743 353 p + 552 352 p + 586 352 p + 610 352 p + 638 352 p + 683 352 p + 707 352 p + 528 351 p + 585 351 p + 620 351 p + 639 351 p + 678 351 p + 562 350 p + 584 350 p + 586 350 p + 640 350 p + 680 350 p + 683 350 p + 567 349 p + 578 349 p + 585 349 p + 641 349 p + 661 349 p + 694 349 p + 566 348 p + 571 348 p + 609 348 p + 642 348 p + 646 348 p + 689 348 p + 713 348 p + 504 347 p + 577 347 p + 618 347 p + 643 347 p + 672 347 p + 521 346 p + 523 346 p + 627 346 p + 644 346 p + 669 346 p + 677 346 p + 744 346 p + 524 345 p + 551 345 p + 574 345 p + 645 345 p + 681 345 p + 551 344 p + 604 344 p + 642 344 p + 646 344 p + 689 344 p + 691 344 p + 704 344 p + 714 344 p + 745 344 p + 552 343 p + 611 343 p + 613 343 p + 647 343 p + 690 343 p + 719 343 p + 727 343 p + 746 343 p + 767 343 p + 556 342 p + 573 342 p + 588 342 p + 648 342 p + 649 342 p + 688 342 p + 559 341 p + 629 341 p + 648 341 p + 649 341 p + 724 341 p + 739 341 p + 740 341 p + 747 341 p + 754 341 p + 785 341 p + 561 340 p + 574 340 p + 622 340 p + 650 340 p + 687 340 p + 718 340 p + 732 340 p + 521 339 p + 563 339 p + 619 339 p + 651 339 p + 744 339 p + 748 339 p + 758 339 p + 564 338 p + 567 338 p + 572 338 p + 652 338 p + 690 338 p + 564 337 p + 567 337 p + 596 337 p + 653 337 p + 686 337 p + 572 336 p + 622 336 p + 623 336 p + 654 336 p + 708 336 p + 709 336 p + 720 336 p + 749 336 p + 576 335 p + 594 335 p + 634 335 p + 655 335 p + 695 335 p + 577 334 p + 593 334 p + 595 334 p + 656 334 p + 696 334 p + 704 334 p + 725 334 p + 582 333 p + 591 333 p + 614 333 p + 657 333 p + 564 332 p + 596 332 p + 606 332 p + 658 332 p + 672 332 p + 693 332 p + 706 332 p + 735 332 p + 750 332 p + 762 332 p + 792 332 p + 536 331 p + 539 331 p + 597 331 p + 659 331 p + 700 331 p + 557 330 p + 597 330 p + 598 330 p + 660 330 p + 673 330 p + 684 330 p + 596 329 p + 603 329 p + 641 329 p + 661 329 p + 678 329 p + 750 329 p + 751 329 p + 770 329 p + 795 329 p + 591 328 p + 595 328 p + 604 328 p + 662 328 p + 682 328 p + 752 328 p + 591 327 p + 606 327 p + 621 327 p + 663 327 p + 740 327 p + 752 327 p + 764 327 p + 765 327 p + 564 326 p + 607 326 p + 622 326 p + 664 326 p + 693 326 p + 709 326 p + 543 325 p + 608 325 p + 613 325 p + 665 325 p + 699 325 p + 601 324 p + 609 324 p + 632 324 p + 666 324 p + 674 324 p + 741 324 p + 587 323 p + 617 323 p + 635 323 p + 667 323 p + 728 323 p + 753 323 p + 589 322 p + 614 322 p + 634 322 p + 668 322 p + 715 322 p + 729 322 p + 754 322 p + 577 321 p + 628 321 p + 644 321 p + 669 321 p + 717 321 p + 726 321 p + 769 321 p + 577 320 p + 596 320 p + 603 320 p + 670 320 p + 675 320 p + 726 320 p + 751 320 p + 776 320 p + 583 319 p + 619 319 p + 633 319 p + 671 319 p + 711 319 p + 734 319 p + 738 319 p + 755 319 p + 825 319 p + 596 318 p + 643 318 p + 658 318 p + 672 318 p + 696 318 p + 705 318 p + 750 318 p + 776 318 p + 617 317 p + 625 317 p + 660 317 p + 673 317 p + 700 317 p + 753 317 p + 756 317 p + 768 317 p + 771 317 p + 784 317 p + 601 316 p + 605 316 p + 666 316 p + 674 316 p + 755 316 p + 603 315 p + 627 315 p + 670 315 p + 675 315 p + 588 314 p + 635 314 p + 637 314 p + 676 314 p + 692 314 p + 757 314 p + 772 314 p + 798 314 p + 803 314 p + 590 313 p + 600 313 p + 644 313 p + 677 313 p + 702 313 p + 744 313 p + 758 313 p + 763 313 p + 769 313 p + 814 313 p + 608 312 p + 639 312 p + 661 312 p + 678 312 p + 742 312 p + 759 312 p + 770 312 p + 777 312 p + 609 311 p + 630 311 p + 632 311 p + 679 311 p + 731 311 p + 584 310 p + 637 310 p + 640 310 p + 680 310 p + 734 310 p + 743 310 p + 757 310 p + 778 310 p + 799 310 p + 598 309 p + 631 309 p + 645 309 p + 681 309 p + 718 309 p + 732 309 p + 760 309 p + 786 309 p + 800 309 p + 847 309 p + 591 308 p + 604 308 p + 662 308 p + 682 308 p + 713 308 p + 723 308 p + 737 308 p + 761 308 p + 783 308 p + 586 307 p + 638 307 p + 640 307 p + 683 307 p + 701 307 p + 721 307 p + 767 307 p + 598 306 p + 631 306 p + 660 306 p + 684 306 p + 760 306 p + 590 305 p + 624 305 p + 628 305 p + 685 305 p + 717 305 p + 733 305 p + 769 305 p + 564 304 p + 567 304 p + 653 304 p + 686 304 p + 694 304 p + 762 304 p + 801 304 p + 600 303 p + 623 303 p + 650 303 p + 687 303 p + 712 303 p + 720 303 p + 722 303 p + 763 303 p + 606 302 p + 625 302 p + 648 302 p + 688 302 p + 692 302 p + 736 302 p + 747 302 p + 764 302 p + 768 302 p + 781 302 p + 802 302 p + 609 301 p + 642 301 p + 646 301 p + 689 301 p + 716 301 p + 731 301 p + 745 301 p + 567 300 p + 647 300 p + 652 300 p + 690 300 p + 719 300 p + 551 299 p + 624 299 p + 646 299 p + 691 299 p + 717 299 p + 793 299 p + 800 299 p + 556 298 p + 676 298 p + 688 298 p + 692 298 p + 739 298 p + 756 298 p + 768 298 p + 803 298 p + 564 297 p + 658 297 p + 664 297 p + 693 297 p + 762 297 p + 773 297 p + 567 296 p + 641 296 p + 686 296 p + 694 296 p + 746 296 p + 576 295 p + 620 295 p + 655 295 p + 695 295 p + 703 295 p + 577 294 p + 656 294 p + 672 294 p + 696 294 p + 725 294 p + 726 294 p + 789 294 p + 804 294 p + 584 293 p + 599 293 p + 633 293 p + 697 293 p + 734 293 p + 588 292 p + 589 292 p + 610 292 p + 698 292 p + 699 292 p + 715 292 p + 772 292 p + 589 291 p + 665 291 p + 698 291 p + 699 291 p + 727 291 p + 729 291 p + 598 290 p + 659 290 p + 673 290 p + 700 290 p + 710 290 p + 760 290 p + 771 290 p + 775 290 p + 599 289 p + 611 289 p + 683 289 p + 701 289 p + 721 289 p + 600 288 p + 619 288 p + 677 288 p + 702 288 p + 712 288 p + 758 288 p + 603 287 p + 620 287 p + 695 287 p + 703 287 p + 748 287 p + 751 287 p + 759 287 p + 604 286 p + 646 286 p + 656 286 p + 704 286 p + 714 286 p + 737 286 p + 793 286 p + 606 285 p + 621 285 p + 672 285 p + 705 285 p + 725 285 p + 735 285 p + 752 285 p + 765 285 p + 789 285 p + 607 284 p + 625 284 p + 658 284 p + 706 284 p + 710 284 p + 610 283 p + 637 283 p + 638 283 p + 707 283 p + 727 283 p + 757 283 p + 611 282 p + 623 282 p + 654 282 p + 708 282 p + 719 282 p + 720 282 p + 721 282 p + 766 282 p + 622 281 p + 654 281 p + 664 281 p + 709 281 p + 749 281 p + 773 281 p + 775 281 p + 625 280 p + 700 280 p + 706 280 p + 710 280 p + 736 280 p + 771 280 p + 773 280 p + 616 279 p + 630 279 p + 671 279 p + 711 279 p + 730 279 p + 738 279 p + 599 278 p + 687 278 p + 702 278 p + 712 278 p + 722 278 p + 774 278 p + 604 277 p + 642 277 p + 682 277 p + 713 277 p + 714 277 p + 731 277 p + 646 276 p + 704 276 p + 713 276 p + 714 276 p + 737 276 p + 790 276 p + 805 276 p + 589 275 p + 668 275 p + 698 275 p + 715 275 p + 729 275 p + 551 274 p + 631 274 p + 689 274 p + 716 274 p + 745 274 p + 786 274 p + 669 273 p + 685 273 p + 691 273 p + 717 273 p + 817 273 p + 870 273 p + 622 272 p + 650 272 p + 681 272 p + 718 272 p + 732 272 p + 775 272 p + 647 271 p + 690 271 p + 708 271 p + 719 271 p + 746 271 p + 749 271 p + 779 271 p + 654 270 p + 687 270 p + 708 270 p + 720 270 p + 782 270 p + 806 270 p + 683 269 p + 701 269 p + 708 269 p + 721 269 p + 766 269 p + 767 269 p + 599 268 p + 687 268 p + 712 268 p + 722 268 p + 766 268 p + 774 268 p + 634 267 p + 636 267 p + 682 267 p + 723 267 p + 724 267 p + 730 267 p + 783 267 p + 634 266 p + 649 266 p + 723 266 p + 724 266 p + 754 266 p + 783 266 p + 785 266 p + 807 266 p + 842 266 p + 656 265 p + 696 265 p + 705 265 p + 725 265 p + 789 265 p + 804 265 p + 808 265 p + 669 264 p + 670 264 p + 696 264 p + 726 264 p + 794 264 p + 817 264 p + 849 264 p + 860 264 p + 647 263 p + 699 263 p + 707 263 p + 727 263 p + 772 263 p + 829 263 p + 852 263 p + 601 262 p + 635 262 p + 667 262 p + 728 262 p + 741 262 p + 756 262 p + 798 262 p + 668 261 p + 699 261 p + 715 261 p + 729 261 p + 742 261 p + 777 261 p + 809 261 p + 829 261 p + 846 261 p + 634 260 p + 711 260 p + 723 260 p + 730 260 p + 755 260 p + 791 260 p + 807 260 p + 825 260 p + 850 260 p + 857 260 p + 679 259 p + 689 259 p + 713 259 p + 731 259 p + 790 259 p + 791 259 p + 650 258 p + 681 258 p + 718 258 p + 732 258 p + 733 258 p + 806 258 p + 816 258 p + 590 257 p + 685 257 p + 732 257 p + 733 257 p + 763 257 p + 800 257 p + 671 256 p + 680 256 p + 697 256 p + 734 256 p + 774 256 p + 778 256 p + 823 256 p + 868 256 p + 882 256 p + 606 255 p + 658 255 p + 705 255 p + 735 255 p + 736 255 p + 810 255 p + 688 254 p + 710 254 p + 735 254 p + 736 254 p + 821 254 p + 822 254 p + 830 254 p + 853 254 p + 682 253 p + 704 253 p + 714 253 p + 737 253 p + 808 253 p + 634 252 p + 671 252 p + 711 252 p + 738 252 p + 831 252 p + 854 252 p + 855 252 p + 588 251 p + 649 251 p + 692 251 p + 739 251 p + 781 251 p + 803 251 p + 809 251 p + 811 251 p + 832 251 p + 591 250 p + 649 250 p + 663 250 p + 740 250 p + 747 250 p + 761 250 p + 785 250 p + 788 250 p + 631 249 p + 666 249 p + 728 249 p + 741 249 p + 786 249 p + 813 249 p + 824 249 p + 833 249 p + 843 249 p + 851 249 p + 866 249 p + 634 248 p + 678 248 p + 729 248 p + 742 248 p + 777 248 p + 787 248 p + 812 248 p + 834 248 p + 601 247 p + 637 247 p + 680 247 p + 743 247 p + 798 247 p + 799 247 p + 644 246 p + 651 246 p + 677 246 p + 744 246 p + 748 246 p + 794 246 p + 814 246 p + 646 245 p + 689 245 p + 716 245 p + 745 245 p + 790 245 p + 793 245 p + 845 245 p + 647 244 p + 694 244 p + 719 244 p + 746 244 p + 770 244 p + 779 244 p + 835 244 p + 841 244 p + 875 244 p + 649 243 p + 688 243 p + 740 243 p + 747 243 p + 781 243 p + 788 243 p + 802 243 p + 844 243 p + 651 242 p + 703 242 p + 744 242 p + 748 242 p + 794 242 p + 812 242 p + 654 241 p + 709 241 p + 719 241 p + 749 241 p + 782 241 p + 796 241 p + 797 241 p + 835 241 p + 658 240 p + 661 240 p + 672 240 p + 750 240 p + 776 240 p + 792 240 p + 819 240 p + 661 239 p + 670 239 p + 703 239 p + 751 239 p + 759 239 p + 795 239 p + 662 238 p + 663 238 p + 705 238 p + 752 238 p + 761 238 p + 808 238 p + 631 237 p + 667 237 p + 673 237 p + 753 237 p + 784 237 p + 649 236 p + 668 236 p + 724 236 p + 754 236 p + 787 236 p + 809 236 p + 846 236 p + 671 235 p + 674 235 p + 730 235 p + 755 235 p + 799 235 p + 825 235 p + 833 235 p + 673 234 p + 692 234 p + 728 234 p + 756 234 p + 784 234 p + 813 234 p + 676 233 p + 680 233 p + 707 233 p + 757 233 p + 836 233 p + 852 233 p + 651 232 p + 677 232 p + 702 232 p + 758 232 p + 814 232 p + 823 232 p + 837 232 p + 678 231 p + 703 231 p + 751 231 p + 759 231 p + 812 231 p + 681 230 p + 684 230 p + 700 230 p + 760 230 p + 682 229 p + 740 229 p + 752 229 p + 761 229 p + 788 229 p + 838 229 p + 658 228 p + 686 228 p + 693 228 p + 762 228 p + 792 228 p + 797 228 p + 821 228 p + 677 227 p + 687 227 p + 733 227 p + 763 227 p + 780 227 p + 806 227 p + 606 226 p + 663 226 p + 688 226 p + 764 226 p + 765 226 p + 663 225 p + 705 225 p + 764 225 p + 765 225 p + 802 225 p + 810 225 p + 828 225 p + 708 224 p + 721 224 p + 722 224 p + 766 224 p + 778 224 p + 796 224 p + 827 224 p + 647 223 p + 683 223 p + 721 223 p + 767 223 p + 779 223 p + 673 222 p + 688 222 p + 692 222 p + 768 222 p + 815 222 p + 822 222 p + 848 222 p + 669 221 p + 677 221 p + 685 221 p + 769 221 p + 780 221 p + 661 220 p + 678 220 p + 746 220 p + 770 220 p + 801 220 p + 673 219 p + 700 219 p + 710 219 p + 771 219 p + 822 219 p + 826 219 p + 676 218 p + 698 218 p + 727 218 p + 772 218 p + 829 218 p + 693 217 p + 709 217 p + 710 217 p + 773 217 p + 797 217 p + 839 217 p + 853 217 p + 869 217 p + 712 216 p + 722 216 p + 734 216 p + 774 216 p + 780 216 p + 827 216 p + 840 216 p + 868 216 p + 700 215 p + 709 215 p + 718 215 p + 775 215 p + 782 215 p + 826 215 p + 839 215 p + 872 215 p + 670 214 p + 672 214 p + 750 214 p + 776 214 p + 795 214 p + 819 214 p + 678 213 p + 729 213 p + 742 213 p + 777 213 p + 834 213 p + 841 213 p + 905 213 p + 680 212 p + 734 212 p + 766 212 p + 778 212 p + 827 212 p + 836 212 p + 868 212 p + 879 212 p + 719 211 p + 746 211 p + 767 211 p + 779 211 p + 796 211 p + 763 210 p + 769 210 p + 774 210 p + 780 210 p + 816 210 p + 823 210 p + 876 210 p + 887 210 p + 911 210 p + 928 210 p + 932 210 p + 688 209 p + 739 209 p + 747 209 p + 781 209 p + 815 209 p + 720 208 p + 749 208 p + 775 208 p + 782 208 p + 880 208 p + 682 207 p + 723 207 p + 724 207 p + 783 207 p + 805 207 p + 807 207 p + 838 207 p + 842 207 p + 850 207 p + 673 206 p + 753 206 p + 756 206 p + 784 206 p + 826 206 p + 843 206 p + 848 206 p + 858 206 p + 649 205 p + 724 205 p + 740 205 p + 785 205 p + 811 205 p + 842 205 p + 844 205 p + 681 204 p + 716 204 p + 741 204 p + 786 204 p + 824 204 p + 843 204 p + 845 204 p + 847 204 p + 634 203 p + 742 203 p + 754 203 p + 787 203 p + 834 203 p + 846 203 p + 863 203 p + 877 203 p + 902 203 p + 740 202 p + 747 202 p + 761 202 p + 788 202 p + 696 201 p + 705 201 p + 725 201 p + 789 201 p + 804 201 p + 810 201 p + 828 201 p + 849 201 p + 862 201 p + 867 201 p + 714 200 p + 731 200 p + 745 200 p + 790 200 p + 791 200 p + 805 200 p + 824 200 p + 856 200 p + 730 199 p + 731 199 p + 790 199 p + 791 199 p + 833 199 p + 864 199 p + 658 198 p + 750 198 p + 762 198 p + 792 198 p + 691 197 p + 704 197 p + 745 197 p + 793 197 p + 818 197 p + 856 197 p + 870 197 p + 726 196 p + 744 196 p + 748 196 p + 794 196 p + 817 196 p + 837 196 p + 860 196 p + 661 195 p + 751 195 p + 776 195 p + 795 195 p + 801 195 p + 819 195 p + 820 195 p + 867 195 p + 894 195 p + 900 195 p + 749 194 p + 766 194 p + 779 194 p + 796 194 p + 879 194 p + 880 194 p + 749 193 p + 762 193 p + 773 193 p + 797 193 p + 835 193 p + 839 193 p + 676 192 p + 728 192 p + 743 192 p + 798 192 p + 813 192 p + 851 192 p + 874 192 p + 881 192 p + 680 191 p + 743 191 p + 755 191 p + 799 191 p + 836 191 p + 874 191 p + 882 191 p + 885 191 p + 681 190 p + 691 190 p + 733 190 p + 800 190 p + 816 190 p + 847 190 p + 870 190 p + 876 190 p + 686 189 p + 770 189 p + 795 189 p + 801 189 p + 820 189 p + 841 189 p + 883 189 p + 688 188 p + 747 188 p + 765 188 p + 802 188 p + 815 188 p + 830 188 p + 676 187 p + 692 187 p + 739 187 p + 803 187 p + 832 187 p + 848 187 p + 881 187 p + 884 187 p + 886 187 p + 696 186 p + 725 186 p + 789 186 p + 804 186 p + 818 186 p + 849 186 p + 714 185 p + 783 185 p + 790 185 p + 805 185 p + 720 184 p + 732 184 p + 763 184 p + 806 184 p + 840 184 p + 724 183 p + 730 183 p + 783 183 p + 807 183 p + 831 183 p + 850 183 p + 861 183 p + 725 182 p + 737 182 p + 752 182 p + 808 182 p + 818 182 p + 838 182 p + 729 181 p + 739 181 p + 754 181 p + 809 181 p + 811 181 p + 832 181 p + 735 180 p + 765 180 p + 789 180 p + 810 180 p + 821 180 p + 828 180 p + 739 179 p + 785 179 p + 809 179 p + 811 179 p + 844 179 p + 742 178 p + 748 178 p + 759 178 p + 812 178 p + 854 178 p + 865 178 p + 741 177 p + 756 177 p + 798 177 p + 813 177 p + 851 177 p + 677 176 p + 744 176 p + 758 176 p + 814 176 p + 837 176 p + 768 175 p + 781 175 p + 802 175 p + 815 175 p + 871 175 p + 884 175 p + 732 174 p + 780 174 p + 800 174 p + 816 174 p + 872 174 p + 888 174 p + 912 174 p + 928 174 p + 934 174 p + 717 173 p + 726 173 p + 794 173 p + 817 173 p + 860 173 p + 909 173 p + 910 173 p + 911 173 p + 793 172 p + 804 172 p + 808 172 p + 818 172 p + 862 172 p + 750 171 p + 776 171 p + 795 171 p + 819 171 p + 820 171 p + 795 170 p + 801 170 p + 819 170 p + 820 170 p + 894 170 p + 899 170 p + 913 170 p + 929 170 p + 736 169 p + 762 169 p + 810 169 p + 821 169 p + 873 169 p + 913 169 p + 930 169 p + 736 168 p + 768 168 p + 771 168 p + 822 168 p + 853 168 p + 914 168 p + 919 168 p + 734 167 p + 758 167 p + 780 167 p + 823 167 p + 859 167 p + 741 166 p + 786 166 p + 790 166 p + 824 166 p + 845 166 p + 856 166 p + 866 166 p + 906 166 p + 915 166 p + 671 165 p + 730 165 p + 755 165 p + 825 165 p + 882 165 p + 890 165 p + 771 164 p + 775 164 p + 784 164 p + 826 164 p + 869 164 p + 872 164 p + 895 164 p + 914 164 p + 917 164 p + 766 163 p + 774 163 p + 778 163 p + 827 163 p + 840 163 p + 765 162 p + 789 162 p + 810 162 p + 828 162 p + 830 162 p + 727 161 p + 729 161 p + 772 161 p + 829 161 p + 852 161 p + 881 161 p + 886 161 p + 889 161 p + 905 161 p + 944 161 p + 736 160 p + 802 160 p + 828 160 p + 830 160 p + 871 160 p + 892 160 p + 896 160 p + 919 160 p + 925 160 p + 930 160 p + 634 159 p + 738 159 p + 807 159 p + 831 159 p + 854 159 p + 857 159 p + 861 159 p + 907 159 p + 739 158 p + 803 158 p + 809 158 p + 832 158 p + 886 158 p + 741 157 p + 755 157 p + 791 157 p + 833 157 p + 885 157 p + 890 157 p + 906 157 p + 920 157 p + 926 157 p + 742 156 p + 777 156 p + 787 156 p + 834 156 p + 863 156 p + 865 156 p + 902 156 p + 746 155 p + 749 155 p + 797 155 p + 835 155 p + 875 155 p + 880 155 p + 883 155 p + 891 155 p + 899 155 p + 901 155 p + 757 154 p + 778 154 p + 799 154 p + 836 154 p + 874 154 p + 893 154 p + 908 154 p + 758 153 p + 794 153 p + 814 153 p + 837 153 p + 855 153 p + 859 153 p + 878 153 p + 761 152 p + 783 152 p + 808 152 p + 838 152 p + 896 152 p + 773 151 p + 775 151 p + 797 151 p + 839 151 p + 869 151 p + 873 151 p + 903 151 p + 774 150 p + 806 150 p + 827 150 p + 840 150 p + 888 150 p + 746 149 p + 777 149 p + 801 149 p + 841 149 p + 875 149 p + 883 149 p + 894 149 p + 901 149 p + 929 149 p + 724 148 p + 783 148 p + 785 148 p + 842 148 p + 877 148 p + 896 148 p + 741 147 p + 784 147 p + 786 147 p + 843 147 p + 866 147 p + 747 146 p + 785 146 p + 811 146 p + 844 146 p + 871 146 p + 745 145 p + 786 145 p + 824 145 p + 845 145 p + 729 144 p + 754 144 p + 787 144 p + 846 144 p + 863 144 p + 877 144 p + 681 143 p + 786 143 p + 800 143 p + 847 143 p + 895 143 p + 912 143 p + 768 142 p + 784 142 p + 803 142 p + 848 142 p + 858 142 p + 884 142 p + 726 141 p + 789 141 p + 804 141 p + 849 141 p + 862 141 p + 730 140 p + 783 140 p + 807 140 p + 850 140 p + 857 140 p + 861 140 p + 864 140 p + 898 140 p + 741 139 p + 798 139 p + 813 139 p + 851 139 p + 858 139 p + 920 139 p + 922 139 p + 727 138 p + 757 138 p + 829 138 p + 852 138 p + 736 137 p + 773 137 p + 822 137 p + 853 137 p + 873 137 p + 738 136 p + 812 136 p + 831 136 p + 854 136 p + 855 136 p + 865 136 p + 878 136 p + 907 136 p + 973 136 p + 738 135 p + 837 135 p + 854 135 p + 855 135 p + 859 135 p + 790 134 p + 793 134 p + 824 134 p + 856 134 p + 864 134 p + 906 134 p + 915 134 p + 730 133 p + 831 133 p + 850 133 p + 857 133 p + 898 133 p + 784 132 p + 848 132 p + 851 132 p + 858 132 p + 914 132 p + 922 132 p + 931 132 p + 823 131 p + 837 131 p + 855 131 p + 859 131 p + 878 131 p + 887 131 p + 897 131 p + 726 130 p + 794 130 p + 817 130 p + 860 130 p + 867 130 p + 909 130 p + 910 130 p + 923 130 p + 807 129 p + 831 129 p + 850 129 p + 861 129 p + 898 129 p + 907 129 p + 924 129 p + 789 128 p + 818 128 p + 849 128 p + 862 128 p + 925 128 p + 787 127 p + 834 127 p + 846 127 p + 863 127 p + 889 127 p + 902 127 p + 905 127 p + 791 126 p + 850 126 p + 856 126 p + 864 126 p + 924 126 p + 926 126 p + 812 125 p + 834 125 p + 854 125 p + 865 125 p + 900 125 p + 927 125 p + 973 125 p + 741 124 p + 824 124 p + 843 124 p + 866 124 p + 895 124 p + 920 124 p + 789 123 p + 795 123 p + 860 123 p + 867 123 p + 909 123 p + 913 123 p + 923 123 p + 734 122 p + 774 122 p + 778 122 p + 868 122 p + 879 122 p + 887 122 p + 897 122 p + 773 121 p + 826 121 p + 839 121 p + 869 121 p + 717 120 p + 793 120 p + 800 120 p + 870 120 p + 876 120 p + 911 120 p + 815 119 p + 830 119 p + 844 119 p + 871 119 p + 892 119 p + 904 119 p + 775 118 p + 816 118 p + 826 118 p + 872 118 p + 903 118 p + 917 118 p + 821 117 p + 839 117 p + 853 117 p + 873 117 p + 899 117 p + 930 117 p + 798 116 p + 799 116 p + 836 116 p + 874 116 p + 885 116 p + 893 116 p + 746 115 p + 835 115 p + 841 115 p + 875 115 p + 901 115 p + 944 115 p + 780 114 p + 800 114 p + 870 114 p + 876 114 p + 912 114 p + 928 114 p + 787 113 p + 842 113 p + 846 113 p + 877 113 p + 889 113 p + 837 112 p + 854 112 p + 859 112 p + 878 112 p + 910 112 p + 927 112 p + 973 112 p + 778 111 p + 796 111 p + 868 111 p + 879 111 p + 891 111 p + 782 110 p + 796 110 p + 835 110 p + 880 110 p + 888 110 p + 891 110 p + 903 110 p + 798 109 p + 803 109 p + 829 109 p + 881 109 p + 922 109 p + 931 109 p + 734 108 p + 799 108 p + 825 108 p + 882 108 p + 890 108 p + 908 108 p + 801 107 p + 835 107 p + 841 107 p + 883 107 p + 803 106 p + 815 106 p + 848 106 p + 884 106 p + 892 106 p + 904 106 p + 799 105 p + 833 105 p + 874 105 p + 885 105 p + 893 105 p + 939 105 p + 803 104 p + 829 104 p + 832 104 p + 886 104 p + 904 104 p + 780 103 p + 859 103 p + 868 103 p + 887 103 p + 897 103 p + 961 103 p + 816 102 p + 840 102 p + 880 102 p + 888 102 p + 829 101 p + 863 101 p + 877 101 p + 889 101 p + 825 100 p + 833 100 p + 882 100 p + 890 100 p + 939 100 p + 835 99 p + 879 99 p + 880 99 p + 891 99 p + 830 98 p + 871 98 p + 884 98 p + 892 98 p + 919 98 p + 836 97 p + 874 97 p + 885 97 p + 893 97 p + 908 97 p + 939 97 p + 795 96 p + 820 96 p + 841 96 p + 894 96 p + 900 96 p + 826 95 p + 847 95 p + 866 95 p + 895 95 p + 830 94 p + 838 94 p + 842 94 p + 896 94 p + 924 94 p + 859 93 p + 868 93 p + 887 93 p + 897 93 p + 850 92 p + 857 92 p + 861 92 p + 898 92 p + 926 92 p + 820 91 p + 835 91 p + 873 91 p + 899 91 p + 795 90 p + 865 90 p + 894 90 p + 900 90 p + 923 90 p + 835 89 p + 841 89 p + 875 89 p + 901 89 p + 929 89 p + 787 88 p + 834 88 p + 863 88 p + 902 88 p + 839 87 p + 872 87 p + 880 87 p + 903 87 p + 871 86 p + 884 86 p + 886 86 p + 904 86 p + 931 86 p + 777 85 p + 829 85 p + 863 85 p + 905 85 p + 824 84 p + 833 84 p + 856 84 p + 906 84 p + 915 84 p + 831 83 p + 854 83 p + 861 83 p + 907 83 p + 836 82 p + 882 82 p + 893 82 p + 908 82 p + 817 81 p + 860 81 p + 867 81 p + 909 81 p + 817 80 p + 860 80 p + 878 80 p + 910 80 p + 932 80 p + 961 80 p + 780 79 p + 817 79 p + 870 79 p + 911 79 p + 932 79 p + 816 78 p + 847 78 p + 876 78 p + 912 78 p + 917 78 p + 934 78 p + 820 77 p + 821 77 p + 867 77 p + 913 77 p + 925 77 p + 822 76 p + 826 76 p + 858 76 p + 914 76 p + 824 75 p + 856 75 p + 906 75 p + 915 75 p + 825 74 p + 859 74 p + 890 74 p + 916 74 p + 826 73 p + 872 73 p + 912 73 p + 917 73 p + 934 73 p + 829 72 p + 836 72 p + 881 72 p + 918 72 p + 822 71 p + 830 71 p + 892 71 p + 919 71 p + 833 70 p + 851 70 p + 866 70 p + 920 70 p + 856 69 p + 864 69 p + 870 69 p + 921 69 p + 851 68 p + 858 68 p + 881 68 p + 922 68 p + 860 67 p + 867 67 p + 900 67 p + 923 67 p + 927 67 p + 861 66 p + 864 66 p + 896 66 p + 924 66 p + 830 65 p + 862 65 p + 913 65 p + 925 65 p + 833 64 p + 864 64 p + 898 64 p + 926 64 p + 865 63 p + 878 63 p + 923 63 p + 927 63 p + 780 62 p + 816 62 p + 876 62 p + 928 62 p + 820 61 p + 841 61 p + 901 61 p + 929 61 p + 821 60 p + 830 60 p + 873 60 p + 930 60 p + 858 59 p + 881 59 p + 904 59 p + 931 59 p + 780 58 p + 910 58 p + 911 58 p + 932 58 p + 961 58 p + 868 57 p + 887 57 p + 897 57 p + 933 57 p + 816 56 p + 912 56 p + 917 56 p + 934 56 p + 780 55 p + 911 55 p + 928 55 p + 935 55 p + 865 54 p + 900 54 p + 905 54 p + 936 54 p + 912 53 p + 928 53 p + 937 53 p + 830 52 p + 871 52 p + 896 52 p + 938 52 p + 885 51 p + 890 51 p + 893 51 p + 939 51 p + 881 50 p + 886 50 p + 931 50 p + 940 50 p + 875 49 p + 879 49 p + 901 49 p + 941 49 p + 944 49 p + 879 48 p + 888 48 p + 942 48 p + 882 47 p + 890 47 p + 908 47 p + 943 47 p + 829 46 p + 875 46 p + 944 46 p + 880 45 p + 899 45 p + 901 45 p + 945 45 p + 826 44 p + 858 44 p + 895 44 p + 946 44 p + 898 43 p + 907 43 p + 947 43 p + 893 42 p + 922 42 p + 948 42 p + 864 41 p + 898 41 p + 926 41 p + 949 41 p + 904 40 p + 914 40 p + 931 40 p + 950 40 p + 895 39 p + 906 39 p + 920 39 p + 951 39 p + 826 38 p + 873 38 p + 903 38 p + 952 38 p + 920 37 p + 939 37 p + 953 37 p + 829 36 p + 889 36 p + 954 36 p + 889 35 p + 896 35 p + 924 35 p + 955 35 p + 841 34 p + 901 34 p + 944 34 p + 956 34 p + 892 33 p + 919 33 p + 957 33 p + 820 32 p + 867 32 p + 913 32 p + 958 32 p + 894 31 p + 900 31 p + 959 31 p + 861 30 p + 902 30 p + 960 30 p + 887 29 p + 910 29 p + 932 29 p + 961 29 p + 870 28 p + 915 28 p + 962 28 p + 820 27 p + 873 27 p + 913 27 p + 963 27 p + 829 26 p + 889 26 p + 964 26 p + 833 25 p + 906 25 p + 926 25 p + 965 25 p + 858 24 p + 895 24 p + 920 24 p + 966 24 p + 859 23 p + 878 23 p + 961 23 p + 967 23 p + 862 22 p + 867 22 p + 909 22 p + 968 22 p + 865 21 p + 902 21 p + 905 21 p + 969 21 p + 862 20 p + 870 20 p + 911 20 p + 970 20 p + 871 19 p + 904 19 p + 971 19 p + 873 18 p + 903 18 p + 972 18 p + 854 17 p + 865 17 p + 878 17 p + 973 17 p + 879 16 p + 880 16 p + 974 16 p + 880 15 p + 888 15 p + 903 15 p + 975 15 p + 895 14 p + 917 14 p + 976 14 p + 862 13 p + 896 13 p + 925 13 p + 977 13 p + 899 12 p + 929 12 p + 978 12 p + 900 11 p + 927 11 p + 979 11 p + 903 10 p + 917 10 p + 980 10 p + 910 9 p + 981 9 p + 870 8 p + 911 8 p + 982 8 p + 895 7 p + 912 7 p + 983 7 p + 922 6 p + 931 6 p + 984 6 p + 910 5 p + 911 5 p + 932 5 p + 985 5 p + 833 4 p + 986 4 p + 858 3 p + 922 3 p + 987 3 p + 862 2 p + 925 2 p + 988 2 p + 858 1 p + 914 1 p + 989 1 p + 862 0 p + 990 0 p +showpage diff --git a/DOC/mat8.pdf b/DOC/mat8.pdf new file mode 100644 index 0000000..ec46ce0 Binary files /dev/null and b/DOC/mat8.pdf differ diff --git a/DOC/mat8.ps b/DOC/mat8.ps new file mode 100644 index 0000000..1f70290 --- /dev/null +++ b/DOC/mat8.ps @@ -0,0 +1,8564 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: PSPLTM routine +%%BoundingBox: 100 50 510 500 +%%EndComments +/cm {72 mul 2.54 div} def +/mc {72 div 2.54 mul} def +/pnum { 72 div 2.54 mul 20 string +cvs print ( ) print} def +/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def +gsave + /Helvetica findfont 0.500000 cm scalefont setfont + 10.7950 cm 16.9700 cm moveto +(Assembled Matrix) Cshow + 3.81000 cm 2.00000 cm translate + 13.9700 cm 1257 div dup scale + 0.250000 setlinewidth +newpath + 0 0 moveto + 1257 0 lineto + 1257 1257 lineto + 0 1257 lineto +closepath stroke + 0.2 setlinewidth +1 1 translate +0.8 setlinewidth +/p {moveto 0 -.40 rmoveto + 0 .80 rlineto stroke} def + 0 1255 p + 880 1255 p + 881 1255 p + 918 1255 p + 1 1254 p + 1161 1254 p + 1160 1254 p + 1199 1254 p + 2 1253 p + 469 1253 p + 468 1253 p + 472 1253 p + 3 1252 p + 730 1252 p + 731 1252 p + 732 1252 p + 4 1251 p + 330 1251 p + 332 1251 p + 333 1251 p + 1202 1251 p + 1233 1251 p + 5 1250 p + 332 1250 p + 331 1250 p + 335 1250 p + 337 1250 p + 1121 1250 p + 1164 1250 p + 6 1249 p + 337 1249 p + 336 1249 p + 339 1249 p + 341 1249 p + 1041 1249 p + 1080 1249 p + 7 1248 p + 341 1248 p + 340 1248 p + 343 1248 p + 345 1248 p + 961 1248 p + 963 1248 p + 8 1247 p + 345 1247 p + 344 1247 p + 347 1247 p + 349 1247 p + 882 1247 p + 920 1247 p + 9 1246 p + 349 1246 p + 348 1246 p + 351 1246 p + 353 1246 p + 820 1246 p + 845 1246 p + 10 1245 p + 353 1245 p + 352 1245 p + 356 1245 p + 799 1245 p + 798 1245 p + 11 1244 p + 334 1244 p + 333 1244 p + 357 1244 p + 359 1244 p + 12 1243 p + 331 1243 p + 330 1243 p + 334 1243 p + 338 1243 p + 358 1243 p + 361 1243 p + 13 1242 p + 336 1242 p + 335 1242 p + 338 1242 p + 342 1242 p + 362 1242 p + 364 1242 p + 14 1241 p + 340 1241 p + 339 1241 p + 342 1241 p + 346 1241 p + 365 1241 p + 367 1241 p + 15 1240 p + 344 1240 p + 343 1240 p + 346 1240 p + 350 1240 p + 368 1240 p + 370 1240 p + 16 1239 p + 348 1239 p + 347 1239 p + 350 1239 p + 354 1239 p + 371 1239 p + 373 1239 p + 17 1238 p + 352 1238 p + 351 1238 p + 354 1238 p + 355 1238 p + 374 1238 p + 376 1238 p + 18 1237 p + 356 1237 p + 355 1237 p + 377 1237 p + 19 1236 p + 360 1236 p + 359 1236 p + 379 1236 p + 381 1236 p + 20 1235 p + 358 1235 p + 357 1235 p + 360 1235 p + 363 1235 p + 380 1235 p + 383 1235 p + 21 1234 p + 362 1234 p + 361 1234 p + 363 1234 p + 366 1234 p + 384 1234 p + 386 1234 p + 22 1233 p + 365 1233 p + 364 1233 p + 366 1233 p + 369 1233 p + 387 1233 p + 389 1233 p + 23 1232 p + 368 1232 p + 367 1232 p + 369 1232 p + 372 1232 p + 390 1232 p + 392 1232 p + 24 1231 p + 371 1231 p + 370 1231 p + 372 1231 p + 375 1231 p + 393 1231 p + 395 1231 p + 25 1230 p + 374 1230 p + 373 1230 p + 375 1230 p + 378 1230 p + 396 1230 p + 398 1230 p + 26 1229 p + 377 1229 p + 376 1229 p + 378 1229 p + 399 1229 p + 402 1229 p + 404 1229 p + 27 1228 p + 382 1228 p + 381 1228 p + 406 1228 p + 408 1228 p + 28 1227 p + 380 1227 p + 379 1227 p + 382 1227 p + 385 1227 p + 405 1227 p + 410 1227 p + 29 1226 p + 384 1226 p + 383 1226 p + 385 1226 p + 388 1226 p + 409 1226 p + 413 1226 p + 30 1225 p + 387 1225 p + 386 1225 p + 388 1225 p + 391 1225 p + 412 1225 p + 415 1225 p + 31 1224 p + 390 1224 p + 389 1224 p + 391 1224 p + 394 1224 p + 416 1224 p + 418 1224 p + 32 1223 p + 393 1223 p + 392 1223 p + 394 1223 p + 397 1223 p + 419 1223 p + 421 1223 p + 33 1222 p + 396 1222 p + 395 1222 p + 397 1222 p + 400 1222 p + 422 1222 p + 424 1222 p + 34 1221 p + 399 1221 p + 398 1221 p + 400 1221 p + 401 1221 p + 425 1221 p + 427 1221 p + 35 1220 p + 402 1220 p + 401 1220 p + 403 1220 p + 428 1220 p + 430 1220 p + 36 1219 p + 404 1219 p + 403 1219 p + 431 1219 p + 434 1219 p + 37 1218 p + 407 1218 p + 408 1218 p + 436 1218 p + 438 1218 p + 38 1217 p + 405 1217 p + 406 1217 p + 407 1217 p + 411 1217 p + 435 1217 p + 440 1217 p + 39 1216 p + 409 1216 p + 410 1216 p + 411 1216 p + 414 1216 p + 439 1216 p + 443 1216 p + 40 1215 p + 412 1215 p + 413 1215 p + 414 1215 p + 417 1215 p + 442 1215 p + 446 1215 p + 41 1214 p + 416 1214 p + 415 1214 p + 417 1214 p + 420 1214 p + 445 1214 p + 449 1214 p + 42 1213 p + 419 1213 p + 418 1213 p + 420 1213 p + 423 1213 p + 448 1213 p + 452 1213 p + 43 1212 p + 422 1212 p + 421 1212 p + 423 1212 p + 426 1212 p + 451 1212 p + 455 1212 p + 44 1211 p + 425 1211 p + 424 1211 p + 426 1211 p + 429 1211 p + 454 1211 p + 457 1211 p + 45 1210 p + 428 1210 p + 427 1210 p + 429 1210 p + 432 1210 p + 458 1210 p + 460 1210 p + 46 1209 p + 431 1209 p + 430 1209 p + 432 1209 p + 433 1209 p + 461 1209 p + 464 1209 p + 465 1209 p + 47 1208 p + 434 1208 p + 433 1208 p + 466 1208 p + 470 1208 p + 469 1208 p + 48 1207 p + 437 1207 p + 438 1207 p + 475 1207 p + 477 1207 p + 49 1206 p + 435 1206 p + 436 1206 p + 437 1206 p + 441 1206 p + 474 1206 p + 479 1206 p + 50 1205 p + 439 1205 p + 440 1205 p + 441 1205 p + 444 1205 p + 478 1205 p + 482 1205 p + 51 1204 p + 442 1204 p + 443 1204 p + 444 1204 p + 447 1204 p + 481 1204 p + 485 1204 p + 52 1203 p + 445 1203 p + 446 1203 p + 447 1203 p + 450 1203 p + 484 1203 p + 488 1203 p + 53 1202 p + 448 1202 p + 449 1202 p + 450 1202 p + 453 1202 p + 487 1202 p + 491 1202 p + 54 1201 p + 451 1201 p + 452 1201 p + 453 1201 p + 456 1201 p + 490 1201 p + 494 1201 p + 55 1200 p + 454 1200 p + 455 1200 p + 456 1200 p + 459 1200 p + 493 1200 p + 497 1200 p + 56 1199 p + 458 1199 p + 457 1199 p + 459 1199 p + 462 1199 p + 496 1199 p + 500 1199 p + 57 1198 p + 461 1198 p + 460 1198 p + 462 1198 p + 463 1198 p + 499 1198 p + 503 1198 p + 58 1197 p + 464 1197 p + 463 1197 p + 467 1197 p + 502 1197 p + 507 1197 p + 59 1196 p + 466 1196 p + 465 1196 p + 467 1196 p + 471 1196 p + 506 1196 p + 60 1195 p + 468 1195 p + 470 1195 p + 471 1195 p + 473 1195 p + 505 1195 p + 509 1195 p + 61 1194 p + 472 1194 p + 473 1194 p + 511 1194 p + 62 1193 p + 476 1193 p + 477 1193 p + 513 1193 p + 515 1193 p + 63 1192 p + 474 1192 p + 475 1192 p + 476 1192 p + 480 1192 p + 512 1192 p + 517 1192 p + 64 1191 p + 478 1191 p + 479 1191 p + 480 1191 p + 483 1191 p + 516 1191 p + 520 1191 p + 65 1190 p + 481 1190 p + 482 1190 p + 483 1190 p + 486 1190 p + 519 1190 p + 523 1190 p + 66 1189 p + 484 1189 p + 485 1189 p + 486 1189 p + 489 1189 p + 522 1189 p + 526 1189 p + 67 1188 p + 487 1188 p + 488 1188 p + 489 1188 p + 492 1188 p + 525 1188 p + 529 1188 p + 68 1187 p + 490 1187 p + 491 1187 p + 492 1187 p + 495 1187 p + 528 1187 p + 532 1187 p + 69 1186 p + 493 1186 p + 494 1186 p + 495 1186 p + 498 1186 p + 531 1186 p + 535 1186 p + 70 1185 p + 496 1185 p + 497 1185 p + 498 1185 p + 501 1185 p + 534 1185 p + 538 1185 p + 71 1184 p + 499 1184 p + 500 1184 p + 501 1184 p + 504 1184 p + 537 1184 p + 541 1184 p + 72 1183 p + 502 1183 p + 503 1183 p + 504 1183 p + 508 1183 p + 540 1183 p + 544 1183 p + 73 1182 p + 505 1182 p + 506 1182 p + 507 1182 p + 508 1182 p + 510 1182 p + 543 1182 p + 547 1182 p + 74 1181 p + 509 1181 p + 510 1181 p + 511 1181 p + 546 1181 p + 75 1180 p + 514 1180 p + 515 1180 p + 550 1180 p + 76 1179 p + 512 1179 p + 513 1179 p + 514 1179 p + 518 1179 p + 549 1179 p + 552 1179 p + 77 1178 p + 516 1178 p + 517 1178 p + 518 1178 p + 521 1178 p + 551 1178 p + 555 1178 p + 78 1177 p + 519 1177 p + 520 1177 p + 521 1177 p + 524 1177 p + 554 1177 p + 558 1177 p + 79 1176 p + 522 1176 p + 523 1176 p + 524 1176 p + 527 1176 p + 557 1176 p + 561 1176 p + 80 1175 p + 525 1175 p + 526 1175 p + 527 1175 p + 530 1175 p + 560 1175 p + 564 1175 p + 81 1174 p + 528 1174 p + 529 1174 p + 530 1174 p + 533 1174 p + 563 1174 p + 567 1174 p + 82 1173 p + 531 1173 p + 532 1173 p + 533 1173 p + 536 1173 p + 566 1173 p + 570 1173 p + 83 1172 p + 534 1172 p + 535 1172 p + 536 1172 p + 539 1172 p + 569 1172 p + 573 1172 p + 84 1171 p + 537 1171 p + 538 1171 p + 539 1171 p + 542 1171 p + 572 1171 p + 576 1171 p + 85 1170 p + 540 1170 p + 541 1170 p + 542 1170 p + 545 1170 p + 575 1170 p + 579 1170 p + 86 1169 p + 543 1169 p + 544 1169 p + 545 1169 p + 548 1169 p + 578 1169 p + 582 1169 p + 87 1168 p + 546 1168 p + 547 1168 p + 548 1168 p + 581 1168 p + 584 1168 p + 88 1167 p + 549 1167 p + 550 1167 p + 553 1167 p + 587 1167 p + 89 1166 p + 551 1166 p + 552 1166 p + 553 1166 p + 556 1166 p + 586 1166 p + 589 1166 p + 90 1165 p + 554 1165 p + 555 1165 p + 556 1165 p + 559 1165 p + 588 1165 p + 592 1165 p + 91 1164 p + 557 1164 p + 558 1164 p + 559 1164 p + 562 1164 p + 591 1164 p + 595 1164 p + 92 1163 p + 560 1163 p + 561 1163 p + 562 1163 p + 565 1163 p + 594 1163 p + 598 1163 p + 93 1162 p + 563 1162 p + 564 1162 p + 565 1162 p + 568 1162 p + 597 1162 p + 601 1162 p + 94 1161 p + 566 1161 p + 567 1161 p + 568 1161 p + 571 1161 p + 600 1161 p + 604 1161 p + 95 1160 p + 569 1160 p + 570 1160 p + 571 1160 p + 574 1160 p + 603 1160 p + 607 1160 p + 96 1159 p + 572 1159 p + 573 1159 p + 574 1159 p + 577 1159 p + 606 1159 p + 610 1159 p + 97 1158 p + 575 1158 p + 576 1158 p + 577 1158 p + 580 1158 p + 609 1158 p + 613 1158 p + 98 1157 p + 578 1157 p + 579 1157 p + 580 1157 p + 583 1157 p + 612 1157 p + 616 1157 p + 99 1156 p + 581 1156 p + 582 1156 p + 583 1156 p + 585 1156 p + 615 1156 p + 619 1156 p + 100 1155 p + 584 1155 p + 585 1155 p + 618 1155 p + 621 1155 p + 101 1154 p + 586 1154 p + 587 1154 p + 590 1154 p + 624 1154 p + 102 1153 p + 588 1153 p + 589 1153 p + 590 1153 p + 593 1153 p + 623 1153 p + 626 1153 p + 103 1152 p + 591 1152 p + 592 1152 p + 593 1152 p + 596 1152 p + 625 1152 p + 629 1152 p + 104 1151 p + 594 1151 p + 595 1151 p + 596 1151 p + 599 1151 p + 628 1151 p + 632 1151 p + 105 1150 p + 597 1150 p + 598 1150 p + 599 1150 p + 602 1150 p + 631 1150 p + 635 1150 p + 106 1149 p + 600 1149 p + 601 1149 p + 602 1149 p + 605 1149 p + 634 1149 p + 638 1149 p + 107 1148 p + 603 1148 p + 604 1148 p + 605 1148 p + 608 1148 p + 637 1148 p + 641 1148 p + 108 1147 p + 606 1147 p + 607 1147 p + 608 1147 p + 611 1147 p + 640 1147 p + 644 1147 p + 109 1146 p + 609 1146 p + 610 1146 p + 611 1146 p + 614 1146 p + 643 1146 p + 647 1146 p + 110 1145 p + 612 1145 p + 613 1145 p + 614 1145 p + 617 1145 p + 646 1145 p + 650 1145 p + 111 1144 p + 615 1144 p + 616 1144 p + 617 1144 p + 620 1144 p + 649 1144 p + 653 1144 p + 112 1143 p + 618 1143 p + 619 1143 p + 620 1143 p + 622 1143 p + 652 1143 p + 656 1143 p + 113 1142 p + 621 1142 p + 622 1142 p + 655 1142 p + 658 1142 p + 114 1141 p + 623 1141 p + 624 1141 p + 627 1141 p + 661 1141 p + 115 1140 p + 625 1140 p + 626 1140 p + 627 1140 p + 630 1140 p + 660 1140 p + 663 1140 p + 116 1139 p + 628 1139 p + 629 1139 p + 630 1139 p + 633 1139 p + 662 1139 p + 666 1139 p + 117 1138 p + 631 1138 p + 632 1138 p + 633 1138 p + 636 1138 p + 665 1138 p + 669 1138 p + 118 1137 p + 634 1137 p + 635 1137 p + 636 1137 p + 639 1137 p + 668 1137 p + 119 1136 p + 637 1136 p + 638 1136 p + 639 1136 p + 642 1136 p + 671 1136 p + 673 1136 p + 120 1135 p + 640 1135 p + 641 1135 p + 642 1135 p + 645 1135 p + 672 1135 p + 676 1135 p + 121 1134 p + 643 1134 p + 644 1134 p + 645 1134 p + 648 1134 p + 675 1134 p + 679 1134 p + 122 1133 p + 646 1133 p + 647 1133 p + 648 1133 p + 651 1133 p + 678 1133 p + 682 1133 p + 123 1132 p + 649 1132 p + 650 1132 p + 651 1132 p + 654 1132 p + 681 1132 p + 685 1132 p + 124 1131 p + 652 1131 p + 653 1131 p + 654 1131 p + 657 1131 p + 684 1131 p + 688 1131 p + 125 1130 p + 655 1130 p + 656 1130 p + 657 1130 p + 659 1130 p + 687 1130 p + 691 1130 p + 693 1130 p + 126 1129 p + 658 1129 p + 659 1129 p + 692 1129 p + 695 1129 p + 127 1128 p + 660 1128 p + 661 1128 p + 664 1128 p + 698 1128 p + 128 1127 p + 662 1127 p + 663 1127 p + 664 1127 p + 667 1127 p + 697 1127 p + 129 1126 p + 665 1126 p + 666 1126 p + 667 1126 p + 670 1126 p + 699 1126 p + 701 1126 p + 130 1125 p + 668 1125 p + 669 1125 p + 670 1125 p + 671 1125 p + 674 1125 p + 700 1125 p + 704 1125 p + 131 1124 p + 672 1124 p + 673 1124 p + 674 1124 p + 677 1124 p + 703 1124 p + 707 1124 p + 132 1123 p + 675 1123 p + 676 1123 p + 677 1123 p + 680 1123 p + 706 1123 p + 710 1123 p + 133 1122 p + 678 1122 p + 679 1122 p + 680 1122 p + 683 1122 p + 709 1122 p + 713 1122 p + 134 1121 p + 681 1121 p + 682 1121 p + 683 1121 p + 686 1121 p + 712 1121 p + 716 1121 p + 135 1120 p + 684 1120 p + 685 1120 p + 686 1120 p + 689 1120 p + 715 1120 p + 719 1120 p + 136 1119 p + 687 1119 p + 688 1119 p + 689 1119 p + 690 1119 p + 718 1119 p + 722 1119 p + 137 1118 p + 691 1118 p + 690 1118 p + 694 1118 p + 721 1118 p + 725 1118 p + 138 1117 p + 692 1117 p + 693 1117 p + 694 1117 p + 696 1117 p + 724 1117 p + 728 1117 p + 139 1116 p + 695 1116 p + 696 1116 p + 727 1116 p + 730 1116 p + 140 1115 p + 697 1115 p + 698 1115 p + 699 1115 p + 702 1115 p + 735 1115 p + 141 1114 p + 700 1114 p + 701 1114 p + 702 1114 p + 705 1114 p + 734 1114 p + 142 1113 p + 703 1113 p + 704 1113 p + 705 1113 p + 708 1113 p + 736 1113 p + 738 1113 p + 143 1112 p + 706 1112 p + 707 1112 p + 708 1112 p + 711 1112 p + 737 1112 p + 741 1112 p + 144 1111 p + 709 1111 p + 710 1111 p + 711 1111 p + 714 1111 p + 740 1111 p + 744 1111 p + 145 1110 p + 712 1110 p + 713 1110 p + 714 1110 p + 717 1110 p + 743 1110 p + 747 1110 p + 146 1109 p + 715 1109 p + 716 1109 p + 717 1109 p + 720 1109 p + 746 1109 p + 750 1109 p + 147 1108 p + 718 1108 p + 719 1108 p + 720 1108 p + 723 1108 p + 749 1108 p + 753 1108 p + 148 1107 p + 721 1107 p + 722 1107 p + 723 1107 p + 726 1107 p + 752 1107 p + 757 1107 p + 149 1106 p + 724 1106 p + 725 1106 p + 726 1106 p + 729 1106 p + 756 1106 p + 150 1105 p + 727 1105 p + 728 1105 p + 729 1105 p + 731 1105 p + 733 1105 p + 755 1105 p + 759 1105 p + 151 1104 p + 732 1104 p + 733 1104 p + 761 1104 p + 152 1103 p + 734 1103 p + 735 1103 p + 736 1103 p + 739 1103 p + 763 1103 p + 153 1102 p + 737 1102 p + 738 1102 p + 739 1102 p + 742 1102 p + 762 1102 p + 154 1101 p + 740 1101 p + 741 1101 p + 742 1101 p + 745 1101 p + 764 1101 p + 766 1101 p + 155 1100 p + 743 1100 p + 744 1100 p + 745 1100 p + 748 1100 p + 765 1100 p + 769 1100 p + 156 1099 p + 746 1099 p + 747 1099 p + 748 1099 p + 751 1099 p + 768 1099 p + 772 1099 p + 157 1098 p + 749 1098 p + 750 1098 p + 751 1098 p + 754 1098 p + 771 1098 p + 775 1098 p + 158 1097 p + 752 1097 p + 753 1097 p + 754 1097 p + 758 1097 p + 774 1097 p + 778 1097 p + 159 1096 p + 755 1096 p + 756 1096 p + 757 1096 p + 758 1096 p + 760 1096 p + 777 1096 p + 781 1096 p + 160 1095 p + 759 1095 p + 760 1095 p + 761 1095 p + 780 1095 p + 161 1094 p + 762 1094 p + 763 1094 p + 764 1094 p + 767 1094 p + 784 1094 p + 162 1093 p + 765 1093 p + 766 1093 p + 767 1093 p + 770 1093 p + 783 1093 p + 163 1092 p + 768 1092 p + 769 1092 p + 770 1092 p + 773 1092 p + 785 1092 p + 787 1092 p + 164 1091 p + 771 1091 p + 772 1091 p + 773 1091 p + 776 1091 p + 786 1091 p + 790 1091 p + 165 1090 p + 774 1090 p + 775 1090 p + 776 1090 p + 779 1090 p + 789 1090 p + 793 1090 p + 166 1089 p + 777 1089 p + 778 1089 p + 779 1089 p + 782 1089 p + 792 1089 p + 796 1089 p + 167 1088 p + 780 1088 p + 781 1088 p + 782 1088 p + 795 1088 p + 168 1087 p + 783 1087 p + 784 1087 p + 785 1087 p + 788 1087 p + 803 1087 p + 802 1087 p + 805 1087 p + 169 1086 p + 786 1086 p + 787 1086 p + 788 1086 p + 791 1086 p + 804 1086 p + 808 1086 p + 170 1085 p + 789 1085 p + 790 1085 p + 791 1085 p + 794 1085 p + 807 1085 p + 811 1085 p + 171 1084 p + 792 1084 p + 793 1084 p + 794 1084 p + 797 1084 p + 810 1084 p + 814 1084 p + 172 1083 p + 795 1083 p + 796 1083 p + 797 1083 p + 813 1083 p + 816 1083 p + 173 1082 p + 801 1082 p + 803 1082 p + 822 1082 p + 821 1082 p + 824 1082 p + 174 1081 p + 802 1081 p + 801 1081 p + 806 1081 p + 826 1081 p + 828 1081 p + 175 1080 p + 804 1080 p + 805 1080 p + 806 1080 p + 809 1080 p + 827 1080 p + 831 1080 p + 176 1079 p + 807 1079 p + 808 1079 p + 809 1079 p + 812 1079 p + 830 1079 p + 834 1079 p + 177 1078 p + 810 1078 p + 811 1078 p + 812 1078 p + 815 1078 p + 833 1078 p + 837 1078 p + 178 1077 p + 813 1077 p + 814 1077 p + 815 1077 p + 817 1077 p + 836 1077 p + 840 1077 p + 179 1076 p + 816 1076 p + 817 1076 p + 839 1076 p + 842 1076 p + 180 1075 p + 823 1075 p + 822 1075 p + 850 1075 p + 849 1075 p + 852 1075 p + 181 1074 p + 821 1074 p + 823 1074 p + 825 1074 p + 854 1074 p + 855 1074 p + 182 1073 p + 824 1073 p + 825 1073 p + 826 1073 p + 829 1073 p + 857 1073 p + 858 1073 p + 183 1072 p + 827 1072 p + 828 1072 p + 829 1072 p + 832 1072 p + 860 1072 p + 861 1072 p + 184 1071 p + 830 1071 p + 831 1071 p + 832 1071 p + 835 1071 p + 863 1071 p + 864 1071 p + 185 1070 p + 833 1070 p + 834 1070 p + 835 1070 p + 838 1070 p + 866 1070 p + 868 1070 p + 186 1069 p + 836 1069 p + 837 1069 p + 838 1069 p + 841 1069 p + 867 1069 p + 871 1069 p + 187 1068 p + 839 1068 p + 840 1068 p + 841 1068 p + 843 1068 p + 870 1068 p + 873 1068 p + 876 1068 p + 188 1067 p + 842 1067 p + 843 1067 p + 875 1067 p + 878 1067 p + 189 1066 p + 851 1066 p + 850 1066 p + 883 1066 p + 885 1066 p + 886 1066 p + 190 1065 p + 849 1065 p + 851 1065 p + 853 1065 p + 887 1065 p + 889 1065 p + 191 1064 p + 852 1064 p + 853 1064 p + 854 1064 p + 856 1064 p + 891 1064 p + 892 1064 p + 192 1063 p + 855 1063 p + 856 1063 p + 857 1063 p + 859 1063 p + 894 1063 p + 895 1063 p + 193 1062 p + 858 1062 p + 859 1062 p + 860 1062 p + 862 1062 p + 897 1062 p + 898 1062 p + 194 1061 p + 861 1061 p + 862 1061 p + 863 1061 p + 865 1061 p + 900 1061 p + 901 1061 p + 195 1060 p + 864 1060 p + 865 1060 p + 866 1060 p + 869 1060 p + 903 1060 p + 904 1060 p + 196 1059 p + 867 1059 p + 868 1059 p + 869 1059 p + 872 1059 p + 906 1059 p + 907 1059 p + 197 1058 p + 870 1058 p + 871 1058 p + 872 1058 p + 874 1058 p + 909 1058 p + 910 1058 p + 198 1057 p + 873 1057 p + 874 1057 p + 877 1057 p + 912 1057 p + 913 1057 p + 199 1056 p + 875 1056 p + 876 1056 p + 877 1056 p + 879 1056 p + 881 1056 p + 915 1056 p + 916 1056 p + 200 1055 p + 878 1055 p + 879 1055 p + 880 1055 p + 201 1054 p + 884 1054 p + 883 1054 p + 923 1054 p + 925 1054 p + 202 1053 p + 885 1053 p + 884 1053 p + 888 1053 p + 924 1053 p + 927 1053 p + 203 1052 p + 887 1052 p + 886 1052 p + 888 1052 p + 890 1052 p + 928 1052 p + 930 1052 p + 204 1051 p + 889 1051 p + 890 1051 p + 891 1051 p + 893 1051 p + 931 1051 p + 933 1051 p + 935 1051 p + 205 1050 p + 892 1050 p + 893 1050 p + 894 1050 p + 896 1050 p + 937 1050 p + 938 1050 p + 206 1049 p + 895 1049 p + 896 1049 p + 897 1049 p + 899 1049 p + 940 1049 p + 941 1049 p + 207 1048 p + 898 1048 p + 899 1048 p + 900 1048 p + 902 1048 p + 943 1048 p + 944 1048 p + 208 1047 p + 901 1047 p + 902 1047 p + 903 1047 p + 905 1047 p + 946 1047 p + 947 1047 p + 209 1046 p + 904 1046 p + 905 1046 p + 906 1046 p + 908 1046 p + 949 1046 p + 950 1046 p + 210 1045 p + 907 1045 p + 908 1045 p + 909 1045 p + 911 1045 p + 952 1045 p + 955 1045 p + 211 1044 p + 910 1044 p + 911 1044 p + 912 1044 p + 914 1044 p + 953 1044 p + 212 1043 p + 913 1043 p + 914 1043 p + 915 1043 p + 917 1043 p + 954 1043 p + 957 1043 p + 213 1042 p + 916 1042 p + 917 1042 p + 918 1042 p + 958 1042 p + 214 1041 p + 926 1041 p + 925 1041 p + 964 1041 p + 966 1041 p + 215 1040 p + 924 1040 p + 923 1040 p + 926 1040 p + 929 1040 p + 965 1040 p + 969 1040 p + 216 1039 p + 928 1039 p + 927 1039 p + 929 1039 p + 932 1039 p + 968 1039 p + 972 1039 p + 217 1038 p + 931 1038 p + 930 1038 p + 932 1038 p + 934 1038 p + 971 1038 p + 975 1038 p + 218 1037 p + 933 1037 p + 934 1037 p + 936 1037 p + 974 1037 p + 977 1037 p + 219 1036 p + 935 1036 p + 936 1036 p + 937 1036 p + 939 1036 p + 979 1036 p + 980 1036 p + 220 1035 p + 938 1035 p + 939 1035 p + 940 1035 p + 942 1035 p + 982 1035 p + 983 1035 p + 221 1034 p + 941 1034 p + 942 1034 p + 943 1034 p + 945 1034 p + 985 1034 p + 986 1034 p + 222 1033 p + 944 1033 p + 945 1033 p + 946 1033 p + 948 1033 p + 988 1033 p + 989 1033 p + 223 1032 p + 947 1032 p + 948 1032 p + 949 1032 p + 951 1032 p + 991 1032 p + 992 1032 p + 224 1031 p + 950 1031 p + 951 1031 p + 952 1031 p + 956 1031 p + 994 1031 p + 995 1031 p + 225 1030 p + 954 1030 p + 953 1030 p + 955 1030 p + 956 1030 p + 959 1030 p + 997 1030 p + 998 1030 p + 226 1029 p + 958 1029 p + 957 1029 p + 959 1029 p + 1000 1029 p + 227 1028 p + 967 1028 p + 966 1028 p + 1004 1028 p + 1006 1028 p + 228 1027 p + 965 1027 p + 964 1027 p + 967 1027 p + 970 1027 p + 1003 1027 p + 1008 1027 p + 229 1026 p + 968 1026 p + 969 1026 p + 970 1026 p + 973 1026 p + 1007 1026 p + 1011 1026 p + 230 1025 p + 971 1025 p + 972 1025 p + 973 1025 p + 976 1025 p + 1010 1025 p + 1014 1025 p + 231 1024 p + 974 1024 p + 975 1024 p + 976 1024 p + 978 1024 p + 1013 1024 p + 1017 1024 p + 232 1023 p + 977 1023 p + 978 1023 p + 979 1023 p + 981 1023 p + 1016 1023 p + 1019 1023 p + 233 1022 p + 980 1022 p + 981 1022 p + 982 1022 p + 984 1022 p + 1020 1022 p + 1022 1022 p + 234 1021 p + 983 1021 p + 984 1021 p + 985 1021 p + 987 1021 p + 1024 1021 p + 1025 1021 p + 235 1020 p + 986 1020 p + 987 1020 p + 988 1020 p + 990 1020 p + 1027 1020 p + 1028 1020 p + 236 1019 p + 989 1019 p + 990 1019 p + 991 1019 p + 993 1019 p + 1030 1019 p + 1031 1019 p + 237 1018 p + 992 1018 p + 993 1018 p + 994 1018 p + 996 1018 p + 1033 1018 p + 1034 1018 p + 238 1017 p + 995 1017 p + 996 1017 p + 997 1017 p + 999 1017 p + 1036 1017 p + 1037 1017 p + 239 1016 p + 998 1016 p + 999 1016 p + 1000 1016 p + 1039 1016 p + 240 1015 p + 1005 1015 p + 1006 1015 p + 1043 1015 p + 1045 1015 p + 241 1014 p + 1003 1014 p + 1004 1014 p + 1005 1014 p + 1009 1014 p + 1042 1014 p + 1047 1014 p + 242 1013 p + 1007 1013 p + 1008 1013 p + 1009 1013 p + 1012 1013 p + 1046 1013 p + 1050 1013 p + 243 1012 p + 1010 1012 p + 1011 1012 p + 1012 1012 p + 1015 1012 p + 1049 1012 p + 1053 1012 p + 244 1011 p + 1013 1011 p + 1014 1011 p + 1015 1011 p + 1018 1011 p + 1052 1011 p + 1056 1011 p + 245 1010 p + 1016 1010 p + 1017 1010 p + 1018 1010 p + 1021 1010 p + 1055 1010 p + 1059 1010 p + 246 1009 p + 1020 1009 p + 1019 1009 p + 1021 1009 p + 1023 1009 p + 1058 1009 p + 1061 1009 p + 247 1008 p + 1022 1008 p + 1023 1008 p + 1024 1008 p + 1026 1008 p + 1062 1008 p + 1064 1008 p + 248 1007 p + 1025 1007 p + 1026 1007 p + 1027 1007 p + 1029 1007 p + 1066 1007 p + 1067 1007 p + 249 1006 p + 1028 1006 p + 1029 1006 p + 1030 1006 p + 1032 1006 p + 1069 1006 p + 1070 1006 p + 250 1005 p + 1031 1005 p + 1032 1005 p + 1033 1005 p + 1035 1005 p + 1072 1005 p + 1073 1005 p + 251 1004 p + 1034 1004 p + 1035 1004 p + 1036 1004 p + 1038 1004 p + 1075 1004 p + 1076 1004 p + 252 1003 p + 1037 1003 p + 1038 1003 p + 1039 1003 p + 1078 1003 p + 253 1002 p + 1044 1002 p + 1045 1002 p + 1085 1002 p + 254 1001 p + 1042 1001 p + 1043 1001 p + 1044 1001 p + 1048 1001 p + 1084 1001 p + 1087 1001 p + 255 1000 p + 1046 1000 p + 1047 1000 p + 1048 1000 p + 1051 1000 p + 1086 1000 p + 1090 1000 p + 256 999 p + 1049 999 p + 1050 999 p + 1051 999 p + 1054 999 p + 1089 999 p + 1093 999 p + 257 998 p + 1052 998 p + 1053 998 p + 1054 998 p + 1057 998 p + 1092 998 p + 1096 998 p + 258 997 p + 1055 997 p + 1056 997 p + 1057 997 p + 1060 997 p + 1095 997 p + 1099 997 p + 259 996 p + 1058 996 p + 1059 996 p + 1060 996 p + 1063 996 p + 1098 996 p + 1102 996 p + 260 995 p + 1062 995 p + 1061 995 p + 1063 995 p + 1065 995 p + 1101 995 p + 1104 995 p + 261 994 p + 1064 994 p + 1065 994 p + 1066 994 p + 1068 994 p + 1105 994 p + 1107 994 p + 262 993 p + 1067 993 p + 1068 993 p + 1069 993 p + 1071 993 p + 1109 993 p + 1110 993 p + 263 992 p + 1070 992 p + 1071 992 p + 1072 992 p + 1074 992 p + 1112 992 p + 1113 992 p + 264 991 p + 1073 991 p + 1074 991 p + 1075 991 p + 1077 991 p + 1115 991 p + 1116 991 p + 265 990 p + 1076 990 p + 1077 990 p + 1078 990 p + 1118 990 p + 1120 990 p + 266 989 p + 1084 989 p + 1085 989 p + 1088 989 p + 1123 989 p + 267 988 p + 1086 988 p + 1087 988 p + 1088 988 p + 1091 988 p + 1122 988 p + 1125 988 p + 268 987 p + 1089 987 p + 1090 987 p + 1091 987 p + 1094 987 p + 1124 987 p + 1128 987 p + 269 986 p + 1092 986 p + 1093 986 p + 1094 986 p + 1097 986 p + 1127 986 p + 1131 986 p + 270 985 p + 1095 985 p + 1096 985 p + 1097 985 p + 1100 985 p + 1130 985 p + 1134 985 p + 271 984 p + 1098 984 p + 1099 984 p + 1100 984 p + 1103 984 p + 1133 984 p + 1137 984 p + 272 983 p + 1101 983 p + 1102 983 p + 1103 983 p + 1106 983 p + 1136 983 p + 1140 983 p + 273 982 p + 1105 982 p + 1104 982 p + 1106 982 p + 1108 982 p + 1139 982 p + 1143 982 p + 274 981 p + 1107 981 p + 1108 981 p + 1109 981 p + 1111 981 p + 1142 981 p + 1145 981 p + 275 980 p + 1110 980 p + 1111 980 p + 1112 980 p + 1114 980 p + 1146 980 p + 1148 980 p + 276 979 p + 1113 979 p + 1114 979 p + 1115 979 p + 1117 979 p + 1149 979 p + 1151 979 p + 277 978 p + 1116 978 p + 1117 978 p + 1118 978 p + 1119 978 p + 1153 978 p + 1154 978 p + 1156 978 p + 278 977 p + 1120 977 p + 1119 977 p + 1158 977 p + 1162 977 p + 279 976 p + 1122 976 p + 1123 976 p + 1126 976 p + 1169 976 p + 280 975 p + 1124 975 p + 1125 975 p + 1126 975 p + 1129 975 p + 1168 975 p + 1171 975 p + 281 974 p + 1127 974 p + 1128 974 p + 1129 974 p + 1132 974 p + 1170 974 p + 1174 974 p + 282 973 p + 1130 973 p + 1131 973 p + 1132 973 p + 1135 973 p + 1173 973 p + 1177 973 p + 283 972 p + 1133 972 p + 1134 972 p + 1135 972 p + 1138 972 p + 1176 972 p + 1180 972 p + 284 971 p + 1136 971 p + 1137 971 p + 1138 971 p + 1141 971 p + 1179 971 p + 1183 971 p + 285 970 p + 1139 970 p + 1140 970 p + 1141 970 p + 1144 970 p + 1182 970 p + 1186 970 p + 286 969 p + 1142 969 p + 1143 969 p + 1144 969 p + 1147 969 p + 1185 969 p + 1189 969 p + 287 968 p + 1146 968 p + 1145 968 p + 1147 968 p + 1150 968 p + 1188 968 p + 1191 968 p + 288 967 p + 1149 967 p + 1148 967 p + 1150 967 p + 1152 967 p + 1192 967 p + 1196 967 p + 289 966 p + 1151 966 p + 1152 966 p + 1153 966 p + 1155 966 p + 1194 966 p + 290 965 p + 1154 965 p + 1155 965 p + 1157 965 p + 1195 965 p + 1200 965 p + 291 964 p + 1156 964 p + 1157 964 p + 1158 964 p + 1160 964 p + 1159 964 p + 1198 964 p + 292 963 p + 1159 963 p + 1161 963 p + 1162 963 p + 293 962 p + 1168 962 p + 1169 962 p + 1172 962 p + 1204 962 p + 294 961 p + 1170 961 p + 1171 961 p + 1172 961 p + 1175 961 p + 1203 961 p + 1206 961 p + 295 960 p + 1173 960 p + 1174 960 p + 1175 960 p + 1178 960 p + 1205 960 p + 1209 960 p + 296 959 p + 1176 959 p + 1177 959 p + 1178 959 p + 1181 959 p + 1208 959 p + 1212 959 p + 297 958 p + 1179 958 p + 1180 958 p + 1181 958 p + 1184 958 p + 1211 958 p + 1215 958 p + 298 957 p + 1182 957 p + 1183 957 p + 1184 957 p + 1187 957 p + 1214 957 p + 1218 957 p + 299 956 p + 1185 956 p + 1186 956 p + 1187 956 p + 1190 956 p + 1217 956 p + 1221 956 p + 300 955 p + 1188 955 p + 1189 955 p + 1190 955 p + 1193 955 p + 1220 955 p + 1223 955 p + 301 954 p + 1192 954 p + 1191 954 p + 1193 954 p + 1197 954 p + 1224 954 p + 1226 954 p + 302 953 p + 1195 953 p + 1194 953 p + 1196 953 p + 1197 953 p + 1201 953 p + 1227 953 p + 1229 953 p + 303 952 p + 1199 952 p + 1198 952 p + 1200 952 p + 1201 952 p + 1230 952 p + 304 951 p + 1203 951 p + 1204 951 p + 1207 951 p + 1237 951 p + 305 950 p + 1205 950 p + 1206 950 p + 1207 950 p + 1210 950 p + 1236 950 p + 1239 950 p + 306 949 p + 1208 949 p + 1209 949 p + 1210 949 p + 1213 949 p + 1238 949 p + 1242 949 p + 307 948 p + 1211 948 p + 1212 948 p + 1213 948 p + 1216 948 p + 1241 948 p + 1245 948 p + 308 947 p + 1214 947 p + 1215 947 p + 1216 947 p + 1219 947 p + 1244 947 p + 1247 947 p + 309 946 p + 1217 946 p + 1218 946 p + 1219 946 p + 1222 946 p + 1246 946 p + 1249 946 p + 310 945 p + 1220 945 p + 1221 945 p + 1222 945 p + 1225 945 p + 1248 945 p + 1251 945 p + 311 944 p + 1224 944 p + 1223 944 p + 1225 944 p + 1228 944 p + 1250 944 p + 1254 944 p + 312 943 p + 1227 943 p + 1226 943 p + 1228 943 p + 1231 943 p + 1253 943 p + 313 942 p + 1230 942 p + 1229 942 p + 1231 942 p + 1252 942 p + 314 941 p + 1236 941 p + 1237 941 p + 1240 941 p + 1255 941 p + 315 940 p + 1235 940 p + 1234 940 p + 1238 940 p + 1239 940 p + 1240 940 p + 1243 940 p + 316 939 p + 1166 939 p + 1165 939 p + 1167 939 p + 1241 939 p + 1242 939 p + 1243 939 p + 317 938 p + 1082 938 p + 1081 938 p + 1083 938 p + 1167 938 p + 1244 938 p + 1245 938 p + 318 937 p + 1002 937 p + 1001 937 p + 1040 937 p + 1083 937 p + 1246 937 p + 1247 937 p + 319 936 p + 922 936 p + 921 936 p + 960 936 p + 1040 936 p + 1248 936 p + 1249 936 p + 320 935 p + 847 935 p + 846 935 p + 848 935 p + 960 935 p + 1250 935 p + 1251 935 p + 321 934 p + 819 934 p + 818 934 p + 848 934 p + 1252 934 p + 1253 934 p + 1254 934 p + 322 933 p + 1233 933 p + 1232 933 p + 1235 933 p + 1255 933 p + 323 932 p + 1164 932 p + 1163 932 p + 1166 932 p + 1202 932 p + 1232 932 p + 1234 932 p + 324 931 p + 1080 931 p + 1079 931 p + 1082 931 p + 1121 931 p + 1163 931 p + 1165 931 p + 325 930 p + 963 930 p + 962 930 p + 1002 930 p + 1041 930 p + 1079 930 p + 1081 930 p + 326 929 p + 920 929 p + 919 929 p + 922 929 p + 961 929 p + 962 929 p + 1001 929 p + 327 928 p + 845 928 p + 844 928 p + 847 928 p + 882 928 p + 919 928 p + 921 928 p + 328 927 p + 798 927 p + 800 927 p + 819 927 p + 820 927 p + 844 927 p + 846 927 p + 329 926 p + 800 926 p + 799 926 p + 818 926 p + 330 925 p + 331 925 p + 332 925 p + 333 925 p + 334 925 p + 4 925 p + 12 925 p + 330 924 p + 331 924 p + 332 924 p + 338 924 p + 335 924 p + 12 924 p + 5 924 p + 330 923 p + 331 923 p + 332 923 p + 1164 923 p + 1202 923 p + 4 923 p + 5 923 p + 333 922 p + 334 922 p + 330 922 p + 4 922 p + 11 922 p + 333 921 p + 334 921 p + 330 921 p + 357 921 p + 358 921 p + 11 921 p + 12 921 p + 335 920 p + 336 920 p + 337 920 p + 331 920 p + 338 920 p + 5 920 p + 13 920 p + 335 919 p + 336 919 p + 337 919 p + 342 919 p + 339 919 p + 13 919 p + 6 919 p + 335 918 p + 336 918 p + 337 918 p + 1080 918 p + 1121 918 p + 5 918 p + 6 918 p + 331 917 p + 338 917 p + 335 917 p + 361 917 p + 362 917 p + 12 917 p + 13 917 p + 339 916 p + 340 916 p + 341 916 p + 336 916 p + 342 916 p + 6 916 p + 14 916 p + 339 915 p + 340 915 p + 341 915 p + 346 915 p + 343 915 p + 14 915 p + 7 915 p + 339 914 p + 340 914 p + 341 914 p + 963 914 p + 1041 914 p + 6 914 p + 7 914 p + 336 913 p + 342 913 p + 339 913 p + 364 913 p + 365 913 p + 13 913 p + 14 913 p + 343 912 p + 344 912 p + 345 912 p + 340 912 p + 346 912 p + 7 912 p + 15 912 p + 343 911 p + 344 911 p + 345 911 p + 350 911 p + 347 911 p + 15 911 p + 8 911 p + 343 910 p + 344 910 p + 345 910 p + 920 910 p + 961 910 p + 7 910 p + 8 910 p + 340 909 p + 346 909 p + 343 909 p + 367 909 p + 368 909 p + 14 909 p + 15 909 p + 347 908 p + 348 908 p + 349 908 p + 344 908 p + 350 908 p + 8 908 p + 16 908 p + 347 907 p + 348 907 p + 349 907 p + 354 907 p + 351 907 p + 16 907 p + 9 907 p + 347 906 p + 348 906 p + 349 906 p + 845 906 p + 882 906 p + 8 906 p + 9 906 p + 344 905 p + 350 905 p + 347 905 p + 370 905 p + 371 905 p + 15 905 p + 16 905 p + 351 904 p + 352 904 p + 353 904 p + 348 904 p + 354 904 p + 9 904 p + 17 904 p + 351 903 p + 352 903 p + 353 903 p + 355 903 p + 356 903 p + 17 903 p + 10 903 p + 351 902 p + 352 902 p + 353 902 p + 798 902 p + 820 902 p + 9 902 p + 10 902 p + 348 901 p + 354 901 p + 351 901 p + 373 901 p + 374 901 p + 16 901 p + 17 901 p + 355 900 p + 356 900 p + 352 900 p + 376 900 p + 377 900 p + 17 900 p + 18 900 p + 355 899 p + 356 899 p + 352 899 p + 18 899 p + 10 899 p + 357 898 p + 358 898 p + 334 898 p + 359 898 p + 360 898 p + 11 898 p + 20 898 p + 357 897 p + 358 897 p + 334 897 p + 363 897 p + 361 897 p + 20 897 p + 12 897 p + 359 896 p + 360 896 p + 357 896 p + 11 896 p + 19 896 p + 359 895 p + 360 895 p + 357 895 p + 379 895 p + 380 895 p + 19 895 p + 20 895 p + 361 894 p + 362 894 p + 338 894 p + 358 894 p + 363 894 p + 12 894 p + 21 894 p + 361 893 p + 362 893 p + 338 893 p + 366 893 p + 364 893 p + 21 893 p + 13 893 p + 358 892 p + 363 892 p + 361 892 p + 383 892 p + 384 892 p + 20 892 p + 21 892 p + 364 891 p + 365 891 p + 342 891 p + 362 891 p + 366 891 p + 13 891 p + 22 891 p + 364 890 p + 365 890 p + 342 890 p + 369 890 p + 367 890 p + 22 890 p + 14 890 p + 362 889 p + 366 889 p + 364 889 p + 386 889 p + 387 889 p + 21 889 p + 22 889 p + 367 888 p + 368 888 p + 346 888 p + 365 888 p + 369 888 p + 14 888 p + 23 888 p + 367 887 p + 368 887 p + 346 887 p + 372 887 p + 370 887 p + 23 887 p + 15 887 p + 365 886 p + 369 886 p + 367 886 p + 389 886 p + 390 886 p + 22 886 p + 23 886 p + 370 885 p + 371 885 p + 350 885 p + 368 885 p + 372 885 p + 15 885 p + 24 885 p + 370 884 p + 371 884 p + 350 884 p + 375 884 p + 373 884 p + 24 884 p + 16 884 p + 368 883 p + 372 883 p + 370 883 p + 392 883 p + 393 883 p + 23 883 p + 24 883 p + 373 882 p + 374 882 p + 354 882 p + 371 882 p + 375 882 p + 16 882 p + 25 882 p + 373 881 p + 374 881 p + 354 881 p + 378 881 p + 376 881 p + 25 881 p + 17 881 p + 371 880 p + 375 880 p + 373 880 p + 395 880 p + 396 880 p + 24 880 p + 25 880 p + 376 879 p + 377 879 p + 355 879 p + 374 879 p + 378 879 p + 17 879 p + 26 879 p + 376 878 p + 377 878 p + 355 878 p + 26 878 p + 18 878 p + 374 877 p + 378 877 p + 376 877 p + 398 877 p + 399 877 p + 25 877 p + 26 877 p + 379 876 p + 380 876 p + 360 876 p + 381 876 p + 382 876 p + 19 876 p + 28 876 p + 379 875 p + 380 875 p + 360 875 p + 385 875 p + 383 875 p + 28 875 p + 20 875 p + 381 874 p + 382 874 p + 379 874 p + 19 874 p + 27 874 p + 381 873 p + 382 873 p + 379 873 p + 405 873 p + 406 873 p + 27 873 p + 28 873 p + 383 872 p + 384 872 p + 363 872 p + 380 872 p + 385 872 p + 20 872 p + 29 872 p + 383 871 p + 384 871 p + 363 871 p + 388 871 p + 386 871 p + 29 871 p + 21 871 p + 380 870 p + 385 870 p + 383 870 p + 409 870 p + 410 870 p + 28 870 p + 29 870 p + 386 869 p + 387 869 p + 366 869 p + 384 869 p + 388 869 p + 21 869 p + 30 869 p + 386 868 p + 387 868 p + 366 868 p + 391 868 p + 389 868 p + 30 868 p + 22 868 p + 384 867 p + 388 867 p + 386 867 p + 412 867 p + 413 867 p + 29 867 p + 30 867 p + 389 866 p + 390 866 p + 369 866 p + 387 866 p + 391 866 p + 22 866 p + 31 866 p + 389 865 p + 390 865 p + 369 865 p + 394 865 p + 392 865 p + 31 865 p + 23 865 p + 387 864 p + 391 864 p + 389 864 p + 415 864 p + 416 864 p + 30 864 p + 31 864 p + 392 863 p + 393 863 p + 372 863 p + 390 863 p + 394 863 p + 23 863 p + 32 863 p + 392 862 p + 393 862 p + 372 862 p + 397 862 p + 395 862 p + 32 862 p + 24 862 p + 390 861 p + 394 861 p + 392 861 p + 418 861 p + 419 861 p + 31 861 p + 32 861 p + 395 860 p + 396 860 p + 375 860 p + 393 860 p + 397 860 p + 24 860 p + 33 860 p + 395 859 p + 396 859 p + 375 859 p + 400 859 p + 398 859 p + 33 859 p + 25 859 p + 393 858 p + 397 858 p + 395 858 p + 421 858 p + 422 858 p + 32 858 p + 33 858 p + 398 857 p + 399 857 p + 378 857 p + 396 857 p + 400 857 p + 25 857 p + 34 857 p + 398 856 p + 399 856 p + 378 856 p + 401 856 p + 402 856 p + 34 856 p + 26 856 p + 396 855 p + 400 855 p + 398 855 p + 424 855 p + 425 855 p + 33 855 p + 34 855 p + 401 854 p + 402 854 p + 399 854 p + 427 854 p + 428 854 p + 34 854 p + 35 854 p + 401 853 p + 402 853 p + 399 853 p + 403 853 p + 404 853 p + 35 853 p + 26 853 p + 403 852 p + 404 852 p + 402 852 p + 430 852 p + 431 852 p + 35 852 p + 36 852 p + 403 851 p + 404 851 p + 402 851 p + 36 851 p + 26 851 p + 405 850 p + 382 850 p + 406 850 p + 411 850 p + 410 850 p + 38 850 p + 28 850 p + 405 849 p + 382 849 p + 406 849 p + 407 849 p + 408 849 p + 38 849 p + 27 849 p + 407 848 p + 406 848 p + 408 848 p + 435 848 p + 436 848 p + 37 848 p + 38 848 p + 407 847 p + 406 847 p + 408 847 p + 37 847 p + 27 847 p + 409 846 p + 385 846 p + 410 846 p + 414 846 p + 413 846 p + 39 846 p + 29 846 p + 409 845 p + 385 845 p + 410 845 p + 411 845 p + 405 845 p + 39 845 p + 28 845 p + 411 844 p + 410 844 p + 405 844 p + 439 844 p + 440 844 p + 38 844 p + 39 844 p + 412 843 p + 388 843 p + 413 843 p + 417 843 p + 415 843 p + 40 843 p + 30 843 p + 412 842 p + 388 842 p + 413 842 p + 414 842 p + 409 842 p + 40 842 p + 29 842 p + 414 841 p + 413 841 p + 409 841 p + 442 841 p + 443 841 p + 39 841 p + 40 841 p + 415 840 p + 416 840 p + 391 840 p + 412 840 p + 417 840 p + 30 840 p + 41 840 p + 415 839 p + 416 839 p + 391 839 p + 420 839 p + 418 839 p + 41 839 p + 31 839 p + 412 838 p + 417 838 p + 415 838 p + 445 838 p + 446 838 p + 40 838 p + 41 838 p + 418 837 p + 419 837 p + 394 837 p + 416 837 p + 420 837 p + 31 837 p + 42 837 p + 418 836 p + 419 836 p + 394 836 p + 423 836 p + 421 836 p + 42 836 p + 32 836 p + 416 835 p + 420 835 p + 418 835 p + 448 835 p + 449 835 p + 41 835 p + 42 835 p + 421 834 p + 422 834 p + 397 834 p + 419 834 p + 423 834 p + 32 834 p + 43 834 p + 421 833 p + 422 833 p + 397 833 p + 426 833 p + 424 833 p + 43 833 p + 33 833 p + 419 832 p + 423 832 p + 421 832 p + 451 832 p + 452 832 p + 42 832 p + 43 832 p + 424 831 p + 425 831 p + 400 831 p + 422 831 p + 426 831 p + 33 831 p + 44 831 p + 424 830 p + 425 830 p + 400 830 p + 429 830 p + 427 830 p + 44 830 p + 34 830 p + 422 829 p + 426 829 p + 424 829 p + 454 829 p + 455 829 p + 43 829 p + 44 829 p + 427 828 p + 428 828 p + 401 828 p + 425 828 p + 429 828 p + 34 828 p + 45 828 p + 427 827 p + 428 827 p + 401 827 p + 432 827 p + 430 827 p + 45 827 p + 35 827 p + 425 826 p + 429 826 p + 427 826 p + 457 826 p + 458 826 p + 44 826 p + 45 826 p + 430 825 p + 431 825 p + 403 825 p + 428 825 p + 432 825 p + 35 825 p + 46 825 p + 430 824 p + 431 824 p + 403 824 p + 433 824 p + 434 824 p + 46 824 p + 36 824 p + 428 823 p + 432 823 p + 430 823 p + 460 823 p + 461 823 p + 45 823 p + 46 823 p + 433 822 p + 434 822 p + 431 822 p + 465 822 p + 466 822 p + 46 822 p + 47 822 p + 433 821 p + 434 821 p + 431 821 p + 47 821 p + 36 821 p + 435 820 p + 407 820 p + 436 820 p + 441 820 p + 440 820 p + 49 820 p + 38 820 p + 435 819 p + 407 819 p + 436 819 p + 437 819 p + 438 819 p + 49 819 p + 37 819 p + 437 818 p + 436 818 p + 438 818 p + 474 818 p + 475 818 p + 48 818 p + 49 818 p + 437 817 p + 436 817 p + 438 817 p + 48 817 p + 37 817 p + 439 816 p + 411 816 p + 440 816 p + 444 816 p + 443 816 p + 50 816 p + 39 816 p + 439 815 p + 411 815 p + 440 815 p + 441 815 p + 435 815 p + 50 815 p + 38 815 p + 441 814 p + 440 814 p + 435 814 p + 478 814 p + 479 814 p + 49 814 p + 50 814 p + 442 813 p + 414 813 p + 443 813 p + 447 813 p + 446 813 p + 51 813 p + 40 813 p + 442 812 p + 414 812 p + 443 812 p + 444 812 p + 439 812 p + 51 812 p + 39 812 p + 444 811 p + 443 811 p + 439 811 p + 481 811 p + 482 811 p + 50 811 p + 51 811 p + 445 810 p + 417 810 p + 446 810 p + 450 810 p + 449 810 p + 52 810 p + 41 810 p + 445 809 p + 417 809 p + 446 809 p + 447 809 p + 442 809 p + 52 809 p + 40 809 p + 447 808 p + 446 808 p + 442 808 p + 484 808 p + 485 808 p + 51 808 p + 52 808 p + 448 807 p + 420 807 p + 449 807 p + 453 807 p + 452 807 p + 53 807 p + 42 807 p + 448 806 p + 420 806 p + 449 806 p + 450 806 p + 445 806 p + 53 806 p + 41 806 p + 450 805 p + 449 805 p + 445 805 p + 487 805 p + 488 805 p + 52 805 p + 53 805 p + 451 804 p + 423 804 p + 452 804 p + 456 804 p + 455 804 p + 54 804 p + 43 804 p + 451 803 p + 423 803 p + 452 803 p + 453 803 p + 448 803 p + 54 803 p + 42 803 p + 453 802 p + 452 802 p + 448 802 p + 490 802 p + 491 802 p + 53 802 p + 54 802 p + 454 801 p + 426 801 p + 455 801 p + 459 801 p + 457 801 p + 55 801 p + 44 801 p + 454 800 p + 426 800 p + 455 800 p + 456 800 p + 451 800 p + 55 800 p + 43 800 p + 456 799 p + 455 799 p + 451 799 p + 493 799 p + 494 799 p + 54 799 p + 55 799 p + 457 798 p + 458 798 p + 429 798 p + 454 798 p + 459 798 p + 44 798 p + 56 798 p + 457 797 p + 458 797 p + 429 797 p + 462 797 p + 460 797 p + 56 797 p + 45 797 p + 454 796 p + 459 796 p + 457 796 p + 496 796 p + 497 796 p + 55 796 p + 56 796 p + 460 795 p + 461 795 p + 432 795 p + 458 795 p + 462 795 p + 45 795 p + 57 795 p + 460 794 p + 461 794 p + 432 794 p + 463 794 p + 464 794 p + 57 794 p + 46 794 p + 458 793 p + 462 793 p + 460 793 p + 499 793 p + 500 793 p + 56 793 p + 57 793 p + 461 792 p + 463 792 p + 464 792 p + 502 792 p + 503 792 p + 57 792 p + 58 792 p + 461 791 p + 463 791 p + 464 791 p + 467 791 p + 465 791 p + 46 791 p + 58 791 p + 465 790 p + 466 790 p + 433 790 p + 464 790 p + 467 790 p + 46 790 p + 59 790 p + 465 789 p + 466 789 p + 433 789 p + 471 789 p + 470 789 p + 59 789 p + 47 789 p + 464 788 p + 467 788 p + 465 788 p + 506 788 p + 507 788 p + 58 788 p + 59 788 p + 468 787 p + 469 787 p + 470 787 p + 472 787 p + 473 787 p + 60 787 p + 2 787 p + 468 786 p + 469 786 p + 470 786 p + 2 786 p + 47 786 p + 468 785 p + 469 785 p + 470 785 p + 471 785 p + 466 785 p + 60 785 p + 47 785 p + 471 784 p + 470 784 p + 466 784 p + 505 784 p + 506 784 p + 59 784 p + 60 784 p + 472 783 p + 468 783 p + 473 783 p + 61 783 p + 2 783 p + 472 782 p + 468 782 p + 473 782 p + 509 782 p + 511 782 p + 61 782 p + 60 782 p + 474 781 p + 437 781 p + 475 781 p + 480 781 p + 479 781 p + 63 781 p + 49 781 p + 474 780 p + 437 780 p + 475 780 p + 476 780 p + 477 780 p + 63 780 p + 48 780 p + 476 779 p + 475 779 p + 477 779 p + 512 779 p + 513 779 p + 62 779 p + 63 779 p + 476 778 p + 475 778 p + 477 778 p + 62 778 p + 48 778 p + 478 777 p + 441 777 p + 479 777 p + 483 777 p + 482 777 p + 64 777 p + 50 777 p + 478 776 p + 441 776 p + 479 776 p + 480 776 p + 474 776 p + 64 776 p + 49 776 p + 480 775 p + 479 775 p + 474 775 p + 516 775 p + 517 775 p + 63 775 p + 64 775 p + 481 774 p + 444 774 p + 482 774 p + 486 774 p + 485 774 p + 65 774 p + 51 774 p + 481 773 p + 444 773 p + 482 773 p + 483 773 p + 478 773 p + 65 773 p + 50 773 p + 483 772 p + 482 772 p + 478 772 p + 519 772 p + 520 772 p + 64 772 p + 65 772 p + 484 771 p + 447 771 p + 485 771 p + 489 771 p + 488 771 p + 66 771 p + 52 771 p + 484 770 p + 447 770 p + 485 770 p + 486 770 p + 481 770 p + 66 770 p + 51 770 p + 486 769 p + 485 769 p + 481 769 p + 522 769 p + 523 769 p + 65 769 p + 66 769 p + 487 768 p + 450 768 p + 488 768 p + 492 768 p + 491 768 p + 67 768 p + 53 768 p + 487 767 p + 450 767 p + 488 767 p + 489 767 p + 484 767 p + 67 767 p + 52 767 p + 489 766 p + 488 766 p + 484 766 p + 525 766 p + 526 766 p + 66 766 p + 67 766 p + 490 765 p + 453 765 p + 491 765 p + 495 765 p + 494 765 p + 68 765 p + 54 765 p + 490 764 p + 453 764 p + 491 764 p + 492 764 p + 487 764 p + 68 764 p + 53 764 p + 492 763 p + 491 763 p + 487 763 p + 528 763 p + 529 763 p + 67 763 p + 68 763 p + 493 762 p + 456 762 p + 494 762 p + 498 762 p + 497 762 p + 69 762 p + 55 762 p + 493 761 p + 456 761 p + 494 761 p + 495 761 p + 490 761 p + 69 761 p + 54 761 p + 495 760 p + 494 760 p + 490 760 p + 531 760 p + 532 760 p + 68 760 p + 69 760 p + 496 759 p + 459 759 p + 497 759 p + 501 759 p + 500 759 p + 70 759 p + 56 759 p + 496 758 p + 459 758 p + 497 758 p + 498 758 p + 493 758 p + 70 758 p + 55 758 p + 498 757 p + 497 757 p + 493 757 p + 534 757 p + 535 757 p + 69 757 p + 70 757 p + 499 756 p + 462 756 p + 500 756 p + 504 756 p + 503 756 p + 71 756 p + 57 756 p + 499 755 p + 462 755 p + 500 755 p + 501 755 p + 496 755 p + 71 755 p + 56 755 p + 501 754 p + 500 754 p + 496 754 p + 537 754 p + 538 754 p + 70 754 p + 71 754 p + 502 753 p + 463 753 p + 503 753 p + 508 753 p + 507 753 p + 72 753 p + 58 753 p + 502 752 p + 463 752 p + 503 752 p + 504 752 p + 499 752 p + 72 752 p + 57 752 p + 504 751 p + 503 751 p + 499 751 p + 540 751 p + 541 751 p + 71 751 p + 72 751 p + 505 750 p + 471 750 p + 506 750 p + 509 750 p + 510 750 p + 73 750 p + 60 750 p + 505 749 p + 471 749 p + 506 749 p + 467 749 p + 507 749 p + 73 749 p + 59 749 p + 506 748 p + 467 748 p + 507 748 p + 508 748 p + 502 748 p + 73 748 p + 58 748 p + 508 747 p + 507 747 p + 502 747 p + 543 747 p + 544 747 p + 72 747 p + 73 747 p + 509 746 p + 505 746 p + 510 746 p + 473 746 p + 511 746 p + 74 746 p + 60 746 p + 509 745 p + 505 745 p + 510 745 p + 546 745 p + 547 745 p + 74 745 p + 73 745 p + 473 744 p + 509 744 p + 511 744 p + 61 744 p + 74 744 p + 512 743 p + 476 743 p + 513 743 p + 518 743 p + 517 743 p + 76 743 p + 63 743 p + 512 742 p + 476 742 p + 513 742 p + 514 742 p + 515 742 p + 76 742 p + 62 742 p + 514 741 p + 513 741 p + 515 741 p + 549 741 p + 550 741 p + 75 741 p + 76 741 p + 514 740 p + 513 740 p + 515 740 p + 75 740 p + 62 740 p + 516 739 p + 480 739 p + 517 739 p + 521 739 p + 520 739 p + 77 739 p + 64 739 p + 516 738 p + 480 738 p + 517 738 p + 518 738 p + 512 738 p + 77 738 p + 63 738 p + 518 737 p + 517 737 p + 512 737 p + 551 737 p + 552 737 p + 76 737 p + 77 737 p + 519 736 p + 483 736 p + 520 736 p + 524 736 p + 523 736 p + 78 736 p + 65 736 p + 519 735 p + 483 735 p + 520 735 p + 521 735 p + 516 735 p + 78 735 p + 64 735 p + 521 734 p + 520 734 p + 516 734 p + 554 734 p + 555 734 p + 77 734 p + 78 734 p + 522 733 p + 486 733 p + 523 733 p + 527 733 p + 526 733 p + 79 733 p + 66 733 p + 522 732 p + 486 732 p + 523 732 p + 524 732 p + 519 732 p + 79 732 p + 65 732 p + 524 731 p + 523 731 p + 519 731 p + 557 731 p + 558 731 p + 78 731 p + 79 731 p + 525 730 p + 489 730 p + 526 730 p + 530 730 p + 529 730 p + 80 730 p + 67 730 p + 525 729 p + 489 729 p + 526 729 p + 527 729 p + 522 729 p + 80 729 p + 66 729 p + 527 728 p + 526 728 p + 522 728 p + 560 728 p + 561 728 p + 79 728 p + 80 728 p + 528 727 p + 492 727 p + 529 727 p + 533 727 p + 532 727 p + 81 727 p + 68 727 p + 528 726 p + 492 726 p + 529 726 p + 530 726 p + 525 726 p + 81 726 p + 67 726 p + 530 725 p + 529 725 p + 525 725 p + 563 725 p + 564 725 p + 80 725 p + 81 725 p + 531 724 p + 495 724 p + 532 724 p + 536 724 p + 535 724 p + 82 724 p + 69 724 p + 531 723 p + 495 723 p + 532 723 p + 533 723 p + 528 723 p + 82 723 p + 68 723 p + 533 722 p + 532 722 p + 528 722 p + 566 722 p + 567 722 p + 81 722 p + 82 722 p + 534 721 p + 498 721 p + 535 721 p + 539 721 p + 538 721 p + 83 721 p + 70 721 p + 534 720 p + 498 720 p + 535 720 p + 536 720 p + 531 720 p + 83 720 p + 69 720 p + 536 719 p + 535 719 p + 531 719 p + 569 719 p + 570 719 p + 82 719 p + 83 719 p + 537 718 p + 501 718 p + 538 718 p + 542 718 p + 541 718 p + 84 718 p + 71 718 p + 537 717 p + 501 717 p + 538 717 p + 539 717 p + 534 717 p + 84 717 p + 70 717 p + 539 716 p + 538 716 p + 534 716 p + 572 716 p + 573 716 p + 83 716 p + 84 716 p + 540 715 p + 504 715 p + 541 715 p + 545 715 p + 544 715 p + 85 715 p + 72 715 p + 540 714 p + 504 714 p + 541 714 p + 542 714 p + 537 714 p + 85 714 p + 71 714 p + 542 713 p + 541 713 p + 537 713 p + 575 713 p + 576 713 p + 84 713 p + 85 713 p + 543 712 p + 508 712 p + 544 712 p + 548 712 p + 547 712 p + 86 712 p + 73 712 p + 543 711 p + 508 711 p + 544 711 p + 545 711 p + 540 711 p + 86 711 p + 72 711 p + 545 710 p + 544 710 p + 540 710 p + 578 710 p + 579 710 p + 85 710 p + 86 710 p + 546 709 p + 510 709 p + 547 709 p + 87 709 p + 74 709 p + 546 708 p + 510 708 p + 547 708 p + 548 708 p + 543 708 p + 87 708 p + 73 708 p + 548 707 p + 547 707 p + 543 707 p + 581 707 p + 582 707 p + 86 707 p + 87 707 p + 549 706 p + 514 706 p + 550 706 p + 553 706 p + 552 706 p + 88 706 p + 76 706 p + 549 705 p + 514 705 p + 550 705 p + 88 705 p + 75 705 p + 551 704 p + 518 704 p + 552 704 p + 556 704 p + 555 704 p + 89 704 p + 77 704 p + 551 703 p + 518 703 p + 552 703 p + 553 703 p + 549 703 p + 89 703 p + 76 703 p + 553 702 p + 552 702 p + 549 702 p + 586 702 p + 587 702 p + 88 702 p + 89 702 p + 554 701 p + 521 701 p + 555 701 p + 559 701 p + 558 701 p + 90 701 p + 78 701 p + 554 700 p + 521 700 p + 555 700 p + 556 700 p + 551 700 p + 90 700 p + 77 700 p + 556 699 p + 555 699 p + 551 699 p + 588 699 p + 589 699 p + 89 699 p + 90 699 p + 557 698 p + 524 698 p + 558 698 p + 562 698 p + 561 698 p + 91 698 p + 79 698 p + 557 697 p + 524 697 p + 558 697 p + 559 697 p + 554 697 p + 91 697 p + 78 697 p + 559 696 p + 558 696 p + 554 696 p + 591 696 p + 592 696 p + 90 696 p + 91 696 p + 560 695 p + 527 695 p + 561 695 p + 565 695 p + 564 695 p + 92 695 p + 80 695 p + 560 694 p + 527 694 p + 561 694 p + 562 694 p + 557 694 p + 92 694 p + 79 694 p + 562 693 p + 561 693 p + 557 693 p + 594 693 p + 595 693 p + 91 693 p + 92 693 p + 563 692 p + 530 692 p + 564 692 p + 568 692 p + 567 692 p + 93 692 p + 81 692 p + 563 691 p + 530 691 p + 564 691 p + 565 691 p + 560 691 p + 93 691 p + 80 691 p + 565 690 p + 564 690 p + 560 690 p + 597 690 p + 598 690 p + 92 690 p + 93 690 p + 566 689 p + 533 689 p + 567 689 p + 571 689 p + 570 689 p + 94 689 p + 82 689 p + 566 688 p + 533 688 p + 567 688 p + 568 688 p + 563 688 p + 94 688 p + 81 688 p + 568 687 p + 567 687 p + 563 687 p + 600 687 p + 601 687 p + 93 687 p + 94 687 p + 569 686 p + 536 686 p + 570 686 p + 574 686 p + 573 686 p + 95 686 p + 83 686 p + 569 685 p + 536 685 p + 570 685 p + 571 685 p + 566 685 p + 95 685 p + 82 685 p + 571 684 p + 570 684 p + 566 684 p + 603 684 p + 604 684 p + 94 684 p + 95 684 p + 572 683 p + 539 683 p + 573 683 p + 577 683 p + 576 683 p + 96 683 p + 84 683 p + 572 682 p + 539 682 p + 573 682 p + 574 682 p + 569 682 p + 96 682 p + 83 682 p + 574 681 p + 573 681 p + 569 681 p + 606 681 p + 607 681 p + 95 681 p + 96 681 p + 575 680 p + 542 680 p + 576 680 p + 580 680 p + 579 680 p + 97 680 p + 85 680 p + 575 679 p + 542 679 p + 576 679 p + 577 679 p + 572 679 p + 97 679 p + 84 679 p + 577 678 p + 576 678 p + 572 678 p + 609 678 p + 610 678 p + 96 678 p + 97 678 p + 578 677 p + 545 677 p + 579 677 p + 583 677 p + 582 677 p + 98 677 p + 86 677 p + 578 676 p + 545 676 p + 579 676 p + 580 676 p + 575 676 p + 98 676 p + 85 676 p + 580 675 p + 579 675 p + 575 675 p + 612 675 p + 613 675 p + 97 675 p + 98 675 p + 581 674 p + 548 674 p + 582 674 p + 584 674 p + 585 674 p + 99 674 p + 87 674 p + 581 673 p + 548 673 p + 582 673 p + 583 673 p + 578 673 p + 99 673 p + 86 673 p + 583 672 p + 582 672 p + 578 672 p + 615 672 p + 616 672 p + 98 672 p + 99 672 p + 584 671 p + 581 671 p + 585 671 p + 100 671 p + 87 671 p + 584 670 p + 581 670 p + 585 670 p + 618 670 p + 619 670 p + 100 670 p + 99 670 p + 586 669 p + 553 669 p + 587 669 p + 590 669 p + 589 669 p + 101 669 p + 89 669 p + 586 668 p + 553 668 p + 587 668 p + 101 668 p + 88 668 p + 588 667 p + 556 667 p + 589 667 p + 593 667 p + 592 667 p + 102 667 p + 90 667 p + 588 666 p + 556 666 p + 589 666 p + 590 666 p + 586 666 p + 102 666 p + 89 666 p + 590 665 p + 589 665 p + 586 665 p + 623 665 p + 624 665 p + 101 665 p + 102 665 p + 591 664 p + 559 664 p + 592 664 p + 596 664 p + 595 664 p + 103 664 p + 91 664 p + 591 663 p + 559 663 p + 592 663 p + 593 663 p + 588 663 p + 103 663 p + 90 663 p + 593 662 p + 592 662 p + 588 662 p + 625 662 p + 626 662 p + 102 662 p + 103 662 p + 594 661 p + 562 661 p + 595 661 p + 599 661 p + 598 661 p + 104 661 p + 92 661 p + 594 660 p + 562 660 p + 595 660 p + 596 660 p + 591 660 p + 104 660 p + 91 660 p + 596 659 p + 595 659 p + 591 659 p + 628 659 p + 629 659 p + 103 659 p + 104 659 p + 597 658 p + 565 658 p + 598 658 p + 602 658 p + 601 658 p + 105 658 p + 93 658 p + 597 657 p + 565 657 p + 598 657 p + 599 657 p + 594 657 p + 105 657 p + 92 657 p + 599 656 p + 598 656 p + 594 656 p + 631 656 p + 632 656 p + 104 656 p + 105 656 p + 600 655 p + 568 655 p + 601 655 p + 605 655 p + 604 655 p + 106 655 p + 94 655 p + 600 654 p + 568 654 p + 601 654 p + 602 654 p + 597 654 p + 106 654 p + 93 654 p + 602 653 p + 601 653 p + 597 653 p + 634 653 p + 635 653 p + 105 653 p + 106 653 p + 603 652 p + 571 652 p + 604 652 p + 608 652 p + 607 652 p + 107 652 p + 95 652 p + 603 651 p + 571 651 p + 604 651 p + 605 651 p + 600 651 p + 107 651 p + 94 651 p + 605 650 p + 604 650 p + 600 650 p + 637 650 p + 638 650 p + 106 650 p + 107 650 p + 606 649 p + 574 649 p + 607 649 p + 611 649 p + 610 649 p + 108 649 p + 96 649 p + 606 648 p + 574 648 p + 607 648 p + 608 648 p + 603 648 p + 108 648 p + 95 648 p + 608 647 p + 607 647 p + 603 647 p + 640 647 p + 641 647 p + 107 647 p + 108 647 p + 609 646 p + 577 646 p + 610 646 p + 614 646 p + 613 646 p + 109 646 p + 97 646 p + 609 645 p + 577 645 p + 610 645 p + 611 645 p + 606 645 p + 109 645 p + 96 645 p + 611 644 p + 610 644 p + 606 644 p + 643 644 p + 644 644 p + 108 644 p + 109 644 p + 612 643 p + 580 643 p + 613 643 p + 617 643 p + 616 643 p + 110 643 p + 98 643 p + 612 642 p + 580 642 p + 613 642 p + 614 642 p + 609 642 p + 110 642 p + 97 642 p + 614 641 p + 613 641 p + 609 641 p + 646 641 p + 647 641 p + 109 641 p + 110 641 p + 615 640 p + 583 640 p + 616 640 p + 620 640 p + 619 640 p + 111 640 p + 99 640 p + 615 639 p + 583 639 p + 616 639 p + 617 639 p + 612 639 p + 111 639 p + 98 639 p + 617 638 p + 616 638 p + 612 638 p + 649 638 p + 650 638 p + 110 638 p + 111 638 p + 618 637 p + 585 637 p + 619 637 p + 621 637 p + 622 637 p + 112 637 p + 100 637 p + 618 636 p + 585 636 p + 619 636 p + 620 636 p + 615 636 p + 112 636 p + 99 636 p + 620 635 p + 619 635 p + 615 635 p + 652 635 p + 653 635 p + 111 635 p + 112 635 p + 621 634 p + 618 634 p + 622 634 p + 113 634 p + 100 634 p + 621 633 p + 618 633 p + 622 633 p + 655 633 p + 656 633 p + 113 633 p + 112 633 p + 623 632 p + 590 632 p + 624 632 p + 627 632 p + 626 632 p + 114 632 p + 102 632 p + 623 631 p + 590 631 p + 624 631 p + 114 631 p + 101 631 p + 625 630 p + 593 630 p + 626 630 p + 630 630 p + 629 630 p + 115 630 p + 103 630 p + 625 629 p + 593 629 p + 626 629 p + 627 629 p + 623 629 p + 115 629 p + 102 629 p + 627 628 p + 626 628 p + 623 628 p + 660 628 p + 661 628 p + 114 628 p + 115 628 p + 628 627 p + 596 627 p + 629 627 p + 633 627 p + 632 627 p + 116 627 p + 104 627 p + 628 626 p + 596 626 p + 629 626 p + 630 626 p + 625 626 p + 116 626 p + 103 626 p + 630 625 p + 629 625 p + 625 625 p + 662 625 p + 663 625 p + 115 625 p + 116 625 p + 631 624 p + 599 624 p + 632 624 p + 636 624 p + 635 624 p + 117 624 p + 105 624 p + 631 623 p + 599 623 p + 632 623 p + 633 623 p + 628 623 p + 117 623 p + 104 623 p + 633 622 p + 632 622 p + 628 622 p + 665 622 p + 666 622 p + 116 622 p + 117 622 p + 634 621 p + 602 621 p + 635 621 p + 639 621 p + 638 621 p + 118 621 p + 106 621 p + 634 620 p + 602 620 p + 635 620 p + 636 620 p + 631 620 p + 118 620 p + 105 620 p + 636 619 p + 635 619 p + 631 619 p + 668 619 p + 669 619 p + 117 619 p + 118 619 p + 637 618 p + 605 618 p + 638 618 p + 642 618 p + 641 618 p + 119 618 p + 107 618 p + 637 617 p + 605 617 p + 638 617 p + 639 617 p + 634 617 p + 119 617 p + 106 617 p + 639 616 p + 638 616 p + 634 616 p + 671 616 p + 668 616 p + 118 616 p + 119 616 p + 640 615 p + 608 615 p + 641 615 p + 645 615 p + 644 615 p + 120 615 p + 108 615 p + 640 614 p + 608 614 p + 641 614 p + 642 614 p + 637 614 p + 120 614 p + 107 614 p + 642 613 p + 641 613 p + 637 613 p + 672 613 p + 673 613 p + 119 613 p + 120 613 p + 643 612 p + 611 612 p + 644 612 p + 648 612 p + 647 612 p + 121 612 p + 109 612 p + 643 611 p + 611 611 p + 644 611 p + 645 611 p + 640 611 p + 121 611 p + 108 611 p + 645 610 p + 644 610 p + 640 610 p + 675 610 p + 676 610 p + 120 610 p + 121 610 p + 646 609 p + 614 609 p + 647 609 p + 651 609 p + 650 609 p + 122 609 p + 110 609 p + 646 608 p + 614 608 p + 647 608 p + 648 608 p + 643 608 p + 122 608 p + 109 608 p + 648 607 p + 647 607 p + 643 607 p + 678 607 p + 679 607 p + 121 607 p + 122 607 p + 649 606 p + 617 606 p + 650 606 p + 654 606 p + 653 606 p + 123 606 p + 111 606 p + 649 605 p + 617 605 p + 650 605 p + 651 605 p + 646 605 p + 123 605 p + 110 605 p + 651 604 p + 650 604 p + 646 604 p + 681 604 p + 682 604 p + 122 604 p + 123 604 p + 652 603 p + 620 603 p + 653 603 p + 657 603 p + 656 603 p + 124 603 p + 112 603 p + 652 602 p + 620 602 p + 653 602 p + 654 602 p + 649 602 p + 124 602 p + 111 602 p + 654 601 p + 653 601 p + 649 601 p + 684 601 p + 685 601 p + 123 601 p + 124 601 p + 655 600 p + 622 600 p + 656 600 p + 658 600 p + 659 600 p + 125 600 p + 113 600 p + 655 599 p + 622 599 p + 656 599 p + 657 599 p + 652 599 p + 125 599 p + 112 599 p + 657 598 p + 656 598 p + 652 598 p + 687 598 p + 688 598 p + 124 598 p + 125 598 p + 658 597 p + 655 597 p + 659 597 p + 126 597 p + 113 597 p + 658 596 p + 655 596 p + 659 596 p + 692 596 p + 693 596 p + 126 596 p + 125 596 p + 660 595 p + 627 595 p + 661 595 p + 664 595 p + 663 595 p + 127 595 p + 115 595 p + 660 594 p + 627 594 p + 661 594 p + 127 594 p + 114 594 p + 662 593 p + 630 593 p + 663 593 p + 667 593 p + 666 593 p + 128 593 p + 116 593 p + 662 592 p + 630 592 p + 663 592 p + 664 592 p + 660 592 p + 128 592 p + 115 592 p + 664 591 p + 663 591 p + 660 591 p + 697 591 p + 698 591 p + 127 591 p + 128 591 p + 665 590 p + 633 590 p + 666 590 p + 670 590 p + 669 590 p + 129 590 p + 117 590 p + 665 589 p + 633 589 p + 666 589 p + 667 589 p + 662 589 p + 129 589 p + 116 589 p + 667 588 p + 666 588 p + 662 588 p + 699 588 p + 697 588 p + 128 588 p + 129 588 p + 668 587 p + 636 587 p + 669 587 p + 671 587 p + 639 587 p + 130 587 p + 118 587 p + 668 586 p + 636 586 p + 669 586 p + 670 586 p + 665 586 p + 130 586 p + 117 586 p + 670 585 p + 669 585 p + 665 585 p + 700 585 p + 701 585 p + 129 585 p + 130 585 p + 671 584 p + 639 584 p + 668 584 p + 674 584 p + 673 584 p + 130 584 p + 119 584 p + 672 583 p + 642 583 p + 673 583 p + 677 583 p + 676 583 p + 131 583 p + 120 583 p + 672 582 p + 642 582 p + 673 582 p + 674 582 p + 671 582 p + 131 582 p + 119 582 p + 674 581 p + 673 581 p + 671 581 p + 703 581 p + 704 581 p + 130 581 p + 131 581 p + 675 580 p + 645 580 p + 676 580 p + 680 580 p + 679 580 p + 132 580 p + 121 580 p + 675 579 p + 645 579 p + 676 579 p + 677 579 p + 672 579 p + 132 579 p + 120 579 p + 677 578 p + 676 578 p + 672 578 p + 706 578 p + 707 578 p + 131 578 p + 132 578 p + 678 577 p + 648 577 p + 679 577 p + 683 577 p + 682 577 p + 133 577 p + 122 577 p + 678 576 p + 648 576 p + 679 576 p + 680 576 p + 675 576 p + 133 576 p + 121 576 p + 680 575 p + 679 575 p + 675 575 p + 709 575 p + 710 575 p + 132 575 p + 133 575 p + 681 574 p + 651 574 p + 682 574 p + 686 574 p + 685 574 p + 134 574 p + 123 574 p + 681 573 p + 651 573 p + 682 573 p + 683 573 p + 678 573 p + 134 573 p + 122 573 p + 683 572 p + 682 572 p + 678 572 p + 712 572 p + 713 572 p + 133 572 p + 134 572 p + 684 571 p + 654 571 p + 685 571 p + 689 571 p + 688 571 p + 135 571 p + 124 571 p + 684 570 p + 654 570 p + 685 570 p + 686 570 p + 681 570 p + 135 570 p + 123 570 p + 686 569 p + 685 569 p + 681 569 p + 715 569 p + 716 569 p + 134 569 p + 135 569 p + 687 568 p + 657 568 p + 688 568 p + 690 568 p + 691 568 p + 136 568 p + 125 568 p + 687 567 p + 657 567 p + 688 567 p + 689 567 p + 684 567 p + 136 567 p + 124 567 p + 689 566 p + 688 566 p + 684 566 p + 718 566 p + 719 566 p + 135 566 p + 136 566 p + 690 565 p + 691 565 p + 687 565 p + 721 565 p + 722 565 p + 136 565 p + 137 565 p + 690 564 p + 691 564 p + 687 564 p + 694 564 p + 693 564 p + 137 564 p + 125 564 p + 692 563 p + 659 563 p + 693 563 p + 695 563 p + 696 563 p + 138 563 p + 126 563 p + 692 562 p + 659 562 p + 693 562 p + 694 562 p + 691 562 p + 138 562 p + 125 562 p + 694 561 p + 693 561 p + 691 561 p + 724 561 p + 725 561 p + 137 561 p + 138 561 p + 695 560 p + 692 560 p + 696 560 p + 139 560 p + 126 560 p + 695 559 p + 692 559 p + 696 559 p + 727 559 p + 728 559 p + 139 559 p + 138 559 p + 697 558 p + 664 558 p + 698 558 p + 699 558 p + 667 558 p + 140 558 p + 128 558 p + 697 557 p + 664 557 p + 698 557 p + 140 557 p + 127 557 p + 699 556 p + 667 556 p + 697 556 p + 702 556 p + 701 556 p + 140 556 p + 129 556 p + 700 555 p + 670 555 p + 701 555 p + 705 555 p + 704 555 p + 141 555 p + 130 555 p + 700 554 p + 670 554 p + 701 554 p + 702 554 p + 699 554 p + 141 554 p + 129 554 p + 702 553 p + 701 553 p + 699 553 p + 734 553 p + 735 553 p + 140 553 p + 141 553 p + 703 552 p + 674 552 p + 704 552 p + 708 552 p + 707 552 p + 142 552 p + 131 552 p + 703 551 p + 674 551 p + 704 551 p + 705 551 p + 700 551 p + 142 551 p + 130 551 p + 705 550 p + 704 550 p + 700 550 p + 736 550 p + 734 550 p + 141 550 p + 142 550 p + 706 549 p + 677 549 p + 707 549 p + 711 549 p + 710 549 p + 143 549 p + 132 549 p + 706 548 p + 677 548 p + 707 548 p + 708 548 p + 703 548 p + 143 548 p + 131 548 p + 708 547 p + 707 547 p + 703 547 p + 737 547 p + 738 547 p + 142 547 p + 143 547 p + 709 546 p + 680 546 p + 710 546 p + 714 546 p + 713 546 p + 144 546 p + 133 546 p + 709 545 p + 680 545 p + 710 545 p + 711 545 p + 706 545 p + 144 545 p + 132 545 p + 711 544 p + 710 544 p + 706 544 p + 740 544 p + 741 544 p + 143 544 p + 144 544 p + 712 543 p + 683 543 p + 713 543 p + 717 543 p + 716 543 p + 145 543 p + 134 543 p + 712 542 p + 683 542 p + 713 542 p + 714 542 p + 709 542 p + 145 542 p + 133 542 p + 714 541 p + 713 541 p + 709 541 p + 743 541 p + 744 541 p + 144 541 p + 145 541 p + 715 540 p + 686 540 p + 716 540 p + 720 540 p + 719 540 p + 146 540 p + 135 540 p + 715 539 p + 686 539 p + 716 539 p + 717 539 p + 712 539 p + 146 539 p + 134 539 p + 717 538 p + 716 538 p + 712 538 p + 746 538 p + 747 538 p + 145 538 p + 146 538 p + 718 537 p + 689 537 p + 719 537 p + 723 537 p + 722 537 p + 147 537 p + 136 537 p + 718 536 p + 689 536 p + 719 536 p + 720 536 p + 715 536 p + 147 536 p + 135 536 p + 720 535 p + 719 535 p + 715 535 p + 749 535 p + 750 535 p + 146 535 p + 147 535 p + 721 534 p + 690 534 p + 722 534 p + 726 534 p + 725 534 p + 148 534 p + 137 534 p + 721 533 p + 690 533 p + 722 533 p + 723 533 p + 718 533 p + 148 533 p + 136 533 p + 723 532 p + 722 532 p + 718 532 p + 752 532 p + 753 532 p + 147 532 p + 148 532 p + 724 531 p + 694 531 p + 725 531 p + 729 531 p + 728 531 p + 149 531 p + 138 531 p + 724 530 p + 694 530 p + 725 530 p + 726 530 p + 721 530 p + 149 530 p + 137 530 p + 726 529 p + 725 529 p + 721 529 p + 756 529 p + 757 529 p + 148 529 p + 149 529 p + 727 528 p + 696 528 p + 728 528 p + 730 528 p + 731 528 p + 150 528 p + 139 528 p + 727 527 p + 696 527 p + 728 527 p + 729 527 p + 724 527 p + 150 527 p + 138 527 p + 729 526 p + 728 526 p + 724 526 p + 755 526 p + 756 526 p + 149 526 p + 150 526 p + 730 525 p + 727 525 p + 731 525 p + 3 525 p + 139 525 p + 730 524 p + 727 524 p + 731 524 p + 732 524 p + 733 524 p + 3 524 p + 150 524 p + 732 523 p + 731 523 p + 733 523 p + 151 523 p + 3 523 p + 732 522 p + 731 522 p + 733 522 p + 759 522 p + 761 522 p + 151 522 p + 150 522 p + 734 521 p + 702 521 p + 735 521 p + 736 521 p + 705 521 p + 152 521 p + 141 521 p + 734 520 p + 702 520 p + 735 520 p + 152 520 p + 140 520 p + 736 519 p + 705 519 p + 734 519 p + 739 519 p + 738 519 p + 152 519 p + 142 519 p + 737 518 p + 708 518 p + 738 518 p + 742 518 p + 741 518 p + 153 518 p + 143 518 p + 737 517 p + 708 517 p + 738 517 p + 739 517 p + 736 517 p + 153 517 p + 142 517 p + 739 516 p + 738 516 p + 736 516 p + 762 516 p + 763 516 p + 152 516 p + 153 516 p + 740 515 p + 711 515 p + 741 515 p + 745 515 p + 744 515 p + 154 515 p + 144 515 p + 740 514 p + 711 514 p + 741 514 p + 742 514 p + 737 514 p + 154 514 p + 143 514 p + 742 513 p + 741 513 p + 737 513 p + 764 513 p + 762 513 p + 153 513 p + 154 513 p + 743 512 p + 714 512 p + 744 512 p + 748 512 p + 747 512 p + 155 512 p + 145 512 p + 743 511 p + 714 511 p + 744 511 p + 745 511 p + 740 511 p + 155 511 p + 144 511 p + 745 510 p + 744 510 p + 740 510 p + 765 510 p + 766 510 p + 154 510 p + 155 510 p + 746 509 p + 717 509 p + 747 509 p + 751 509 p + 750 509 p + 156 509 p + 146 509 p + 746 508 p + 717 508 p + 747 508 p + 748 508 p + 743 508 p + 156 508 p + 145 508 p + 748 507 p + 747 507 p + 743 507 p + 768 507 p + 769 507 p + 155 507 p + 156 507 p + 749 506 p + 720 506 p + 750 506 p + 754 506 p + 753 506 p + 157 506 p + 147 506 p + 749 505 p + 720 505 p + 750 505 p + 751 505 p + 746 505 p + 157 505 p + 146 505 p + 751 504 p + 750 504 p + 746 504 p + 771 504 p + 772 504 p + 156 504 p + 157 504 p + 752 503 p + 723 503 p + 753 503 p + 758 503 p + 757 503 p + 158 503 p + 148 503 p + 752 502 p + 723 502 p + 753 502 p + 754 502 p + 749 502 p + 158 502 p + 147 502 p + 754 501 p + 753 501 p + 749 501 p + 774 501 p + 775 501 p + 157 501 p + 158 501 p + 755 500 p + 729 500 p + 756 500 p + 759 500 p + 760 500 p + 159 500 p + 150 500 p + 755 499 p + 729 499 p + 756 499 p + 726 499 p + 757 499 p + 159 499 p + 149 499 p + 756 498 p + 726 498 p + 757 498 p + 758 498 p + 752 498 p + 159 498 p + 148 498 p + 758 497 p + 757 497 p + 752 497 p + 777 497 p + 778 497 p + 158 497 p + 159 497 p + 759 496 p + 755 496 p + 760 496 p + 733 496 p + 761 496 p + 160 496 p + 150 496 p + 759 495 p + 755 495 p + 760 495 p + 780 495 p + 781 495 p + 160 495 p + 159 495 p + 733 494 p + 759 494 p + 761 494 p + 151 494 p + 160 494 p + 762 493 p + 739 493 p + 763 493 p + 764 493 p + 742 493 p + 161 493 p + 153 493 p + 762 492 p + 739 492 p + 763 492 p + 161 492 p + 152 492 p + 764 491 p + 742 491 p + 762 491 p + 767 491 p + 766 491 p + 161 491 p + 154 491 p + 765 490 p + 745 490 p + 766 490 p + 770 490 p + 769 490 p + 162 490 p + 155 490 p + 765 489 p + 745 489 p + 766 489 p + 767 489 p + 764 489 p + 162 489 p + 154 489 p + 767 488 p + 766 488 p + 764 488 p + 783 488 p + 784 488 p + 161 488 p + 162 488 p + 768 487 p + 748 487 p + 769 487 p + 773 487 p + 772 487 p + 163 487 p + 156 487 p + 768 486 p + 748 486 p + 769 486 p + 770 486 p + 765 486 p + 163 486 p + 155 486 p + 770 485 p + 769 485 p + 765 485 p + 785 485 p + 783 485 p + 162 485 p + 163 485 p + 771 484 p + 751 484 p + 772 484 p + 776 484 p + 775 484 p + 164 484 p + 157 484 p + 771 483 p + 751 483 p + 772 483 p + 773 483 p + 768 483 p + 164 483 p + 156 483 p + 773 482 p + 772 482 p + 768 482 p + 786 482 p + 787 482 p + 163 482 p + 164 482 p + 774 481 p + 754 481 p + 775 481 p + 779 481 p + 778 481 p + 165 481 p + 158 481 p + 774 480 p + 754 480 p + 775 480 p + 776 480 p + 771 480 p + 165 480 p + 157 480 p + 776 479 p + 775 479 p + 771 479 p + 789 479 p + 790 479 p + 164 479 p + 165 479 p + 777 478 p + 758 478 p + 778 478 p + 782 478 p + 781 478 p + 166 478 p + 159 478 p + 777 477 p + 758 477 p + 778 477 p + 779 477 p + 774 477 p + 166 477 p + 158 477 p + 779 476 p + 778 476 p + 774 476 p + 792 476 p + 793 476 p + 165 476 p + 166 476 p + 780 475 p + 760 475 p + 781 475 p + 167 475 p + 160 475 p + 780 474 p + 760 474 p + 781 474 p + 782 474 p + 777 474 p + 167 474 p + 159 474 p + 782 473 p + 781 473 p + 777 473 p + 795 473 p + 796 473 p + 166 473 p + 167 473 p + 783 472 p + 767 472 p + 784 472 p + 785 472 p + 770 472 p + 168 472 p + 162 472 p + 783 471 p + 767 471 p + 784 471 p + 168 471 p + 161 471 p + 785 470 p + 770 470 p + 783 470 p + 788 470 p + 787 470 p + 168 470 p + 163 470 p + 786 469 p + 773 469 p + 787 469 p + 791 469 p + 790 469 p + 169 469 p + 164 469 p + 786 468 p + 773 468 p + 787 468 p + 788 468 p + 785 468 p + 169 468 p + 163 468 p + 788 467 p + 787 467 p + 785 467 p + 804 467 p + 805 467 p + 168 467 p + 169 467 p + 789 466 p + 776 466 p + 790 466 p + 794 466 p + 793 466 p + 170 466 p + 165 466 p + 789 465 p + 776 465 p + 790 465 p + 791 465 p + 786 465 p + 170 465 p + 164 465 p + 791 464 p + 790 464 p + 786 464 p + 807 464 p + 808 464 p + 169 464 p + 170 464 p + 792 463 p + 779 463 p + 793 463 p + 797 463 p + 796 463 p + 171 463 p + 166 463 p + 792 462 p + 779 462 p + 793 462 p + 794 462 p + 789 462 p + 171 462 p + 165 462 p + 794 461 p + 793 461 p + 789 461 p + 810 461 p + 811 461 p + 170 461 p + 171 461 p + 795 460 p + 782 460 p + 796 460 p + 172 460 p + 167 460 p + 795 459 p + 782 459 p + 796 459 p + 797 459 p + 792 459 p + 172 459 p + 166 459 p + 797 458 p + 796 458 p + 792 458 p + 813 458 p + 814 458 p + 171 458 p + 172 458 p + 798 457 p + 799 457 p + 800 457 p + 353 457 p + 820 457 p + 328 457 p + 10 457 p + 798 456 p + 799 456 p + 800 456 p + 10 456 p + 329 456 p + 798 455 p + 799 455 p + 800 455 p + 818 455 p + 819 455 p + 328 455 p + 329 455 p + 801 454 p + 802 454 p + 803 454 p + 824 454 p + 826 454 p + 173 454 p + 174 454 p + 801 453 p + 802 453 p + 803 453 p + 806 453 p + 805 453 p + 174 453 p + 168 453 p + 801 452 p + 802 452 p + 803 452 p + 173 452 p + 168 452 p + 804 451 p + 788 451 p + 805 451 p + 809 451 p + 808 451 p + 175 451 p + 169 451 p + 804 450 p + 788 450 p + 805 450 p + 806 450 p + 802 450 p + 175 450 p + 168 450 p + 806 449 p + 805 449 p + 802 449 p + 827 449 p + 828 449 p + 174 449 p + 175 449 p + 807 448 p + 791 448 p + 808 448 p + 812 448 p + 811 448 p + 176 448 p + 170 448 p + 807 447 p + 791 447 p + 808 447 p + 809 447 p + 804 447 p + 176 447 p + 169 447 p + 809 446 p + 808 446 p + 804 446 p + 830 446 p + 831 446 p + 175 446 p + 176 446 p + 810 445 p + 794 445 p + 811 445 p + 815 445 p + 814 445 p + 177 445 p + 171 445 p + 810 444 p + 794 444 p + 811 444 p + 812 444 p + 807 444 p + 177 444 p + 170 444 p + 812 443 p + 811 443 p + 807 443 p + 833 443 p + 834 443 p + 176 443 p + 177 443 p + 813 442 p + 797 442 p + 814 442 p + 816 442 p + 817 442 p + 178 442 p + 172 442 p + 813 441 p + 797 441 p + 814 441 p + 815 441 p + 810 441 p + 178 441 p + 171 441 p + 815 440 p + 814 440 p + 810 440 p + 836 440 p + 837 440 p + 177 440 p + 178 440 p + 816 439 p + 813 439 p + 817 439 p + 179 439 p + 172 439 p + 816 438 p + 813 438 p + 817 438 p + 839 438 p + 840 438 p + 179 438 p + 178 438 p + 800 437 p + 818 437 p + 819 437 p + 329 437 p + 321 437 p + 800 436 p + 818 436 p + 819 436 p + 846 436 p + 848 436 p + 328 436 p + 321 436 p + 353 435 p + 798 435 p + 820 435 p + 844 435 p + 845 435 p + 9 435 p + 328 435 p + 821 434 p + 822 434 p + 823 434 p + 824 434 p + 825 434 p + 181 434 p + 173 434 p + 821 433 p + 822 433 p + 823 433 p + 173 433 p + 180 433 p + 821 432 p + 822 432 p + 823 432 p + 852 432 p + 854 432 p + 181 432 p + 180 432 p + 824 431 p + 821 431 p + 825 431 p + 801 431 p + 826 431 p + 182 431 p + 173 431 p + 824 430 p + 821 430 p + 825 430 p + 855 430 p + 857 430 p + 182 430 p + 181 430 p + 801 429 p + 824 429 p + 826 429 p + 829 429 p + 828 429 p + 174 429 p + 182 429 p + 827 428 p + 806 428 p + 828 428 p + 832 428 p + 831 428 p + 183 428 p + 175 428 p + 827 427 p + 806 427 p + 828 427 p + 829 427 p + 826 427 p + 183 427 p + 174 427 p + 829 426 p + 828 426 p + 826 426 p + 858 426 p + 860 426 p + 182 426 p + 183 426 p + 830 425 p + 809 425 p + 831 425 p + 835 425 p + 834 425 p + 184 425 p + 176 425 p + 830 424 p + 809 424 p + 831 424 p + 832 424 p + 827 424 p + 184 424 p + 175 424 p + 832 423 p + 831 423 p + 827 423 p + 861 423 p + 863 423 p + 183 423 p + 184 423 p + 833 422 p + 812 422 p + 834 422 p + 838 422 p + 837 422 p + 185 422 p + 177 422 p + 833 421 p + 812 421 p + 834 421 p + 835 421 p + 830 421 p + 185 421 p + 176 421 p + 835 420 p + 834 420 p + 830 420 p + 864 420 p + 866 420 p + 184 420 p + 185 420 p + 836 419 p + 815 419 p + 837 419 p + 841 419 p + 840 419 p + 186 419 p + 178 419 p + 836 418 p + 815 418 p + 837 418 p + 838 418 p + 833 418 p + 186 418 p + 177 418 p + 838 417 p + 837 417 p + 833 417 p + 867 417 p + 868 417 p + 185 417 p + 186 417 p + 839 416 p + 817 416 p + 840 416 p + 842 416 p + 843 416 p + 187 416 p + 179 416 p + 839 415 p + 817 415 p + 840 415 p + 841 415 p + 836 415 p + 187 415 p + 178 415 p + 841 414 p + 840 414 p + 836 414 p + 870 414 p + 871 414 p + 186 414 p + 187 414 p + 842 413 p + 839 413 p + 843 413 p + 188 413 p + 179 413 p + 842 412 p + 839 412 p + 843 412 p + 875 412 p + 876 412 p + 188 412 p + 187 412 p + 820 411 p + 844 411 p + 845 411 p + 846 411 p + 847 411 p + 328 411 p + 327 411 p + 820 410 p + 844 410 p + 845 410 p + 349 410 p + 882 410 p + 9 410 p + 327 410 p + 844 409 p + 846 409 p + 847 409 p + 819 409 p + 848 409 p + 328 409 p + 320 409 p + 844 408 p + 846 408 p + 847 408 p + 960 408 p + 921 408 p + 327 408 p + 320 408 p + 846 407 p + 819 407 p + 848 407 p + 1250 407 p + 1254 407 p + 320 407 p + 321 407 p + 849 406 p + 850 406 p + 851 406 p + 852 406 p + 853 406 p + 190 406 p + 180 406 p + 849 405 p + 850 405 p + 851 405 p + 180 405 p + 189 405 p + 849 404 p + 850 404 p + 851 404 p + 886 404 p + 887 404 p + 190 404 p + 189 404 p + 852 403 p + 849 403 p + 853 403 p + 823 403 p + 854 403 p + 191 403 p + 180 403 p + 852 402 p + 849 402 p + 853 402 p + 889 402 p + 891 402 p + 191 402 p + 190 402 p + 823 401 p + 852 401 p + 854 401 p + 855 401 p + 856 401 p + 181 401 p + 191 401 p + 855 400 p + 854 400 p + 856 400 p + 825 400 p + 857 400 p + 192 400 p + 181 400 p + 855 399 p + 854 399 p + 856 399 p + 892 399 p + 894 399 p + 192 399 p + 191 399 p + 825 398 p + 855 398 p + 857 398 p + 858 398 p + 859 398 p + 182 398 p + 192 398 p + 858 397 p + 857 397 p + 859 397 p + 829 397 p + 860 397 p + 193 397 p + 182 397 p + 858 396 p + 857 396 p + 859 396 p + 895 396 p + 897 396 p + 193 396 p + 192 396 p + 829 395 p + 858 395 p + 860 395 p + 861 395 p + 862 395 p + 183 395 p + 193 395 p + 861 394 p + 860 394 p + 862 394 p + 832 394 p + 863 394 p + 194 394 p + 183 394 p + 861 393 p + 860 393 p + 862 393 p + 898 393 p + 900 393 p + 194 393 p + 193 393 p + 832 392 p + 861 392 p + 863 392 p + 864 392 p + 865 392 p + 184 392 p + 194 392 p + 864 391 p + 863 391 p + 865 391 p + 835 391 p + 866 391 p + 195 391 p + 184 391 p + 864 390 p + 863 390 p + 865 390 p + 901 390 p + 903 390 p + 195 390 p + 194 390 p + 835 389 p + 864 389 p + 866 389 p + 869 389 p + 868 389 p + 185 389 p + 195 389 p + 867 388 p + 838 388 p + 868 388 p + 872 388 p + 871 388 p + 196 388 p + 186 388 p + 867 387 p + 838 387 p + 868 387 p + 869 387 p + 866 387 p + 196 387 p + 185 387 p + 869 386 p + 868 386 p + 866 386 p + 904 386 p + 906 386 p + 195 386 p + 196 386 p + 870 385 p + 841 385 p + 871 385 p + 873 385 p + 874 385 p + 197 385 p + 187 385 p + 870 384 p + 841 384 p + 871 384 p + 872 384 p + 867 384 p + 197 384 p + 186 384 p + 872 383 p + 871 383 p + 867 383 p + 907 383 p + 909 383 p + 196 383 p + 197 383 p + 873 382 p + 870 382 p + 874 382 p + 877 382 p + 876 382 p + 198 382 p + 187 382 p + 873 381 p + 870 381 p + 874 381 p + 910 381 p + 912 381 p + 198 381 p + 197 381 p + 875 380 p + 843 380 p + 876 380 p + 878 380 p + 879 380 p + 199 380 p + 188 380 p + 875 379 p + 843 379 p + 876 379 p + 877 379 p + 873 379 p + 199 379 p + 187 379 p + 877 378 p + 876 378 p + 873 378 p + 913 378 p + 915 378 p + 198 378 p + 199 378 p + 878 377 p + 875 377 p + 879 377 p + 200 377 p + 188 377 p + 878 376 p + 875 376 p + 879 376 p + 880 376 p + 881 376 p + 200 376 p + 199 376 p + 880 375 p + 879 375 p + 881 375 p + 0 375 p + 200 375 p + 880 374 p + 879 374 p + 881 374 p + 916 374 p + 918 374 p + 0 374 p + 199 374 p + 349 373 p + 845 373 p + 882 373 p + 919 373 p + 920 373 p + 8 373 p + 327 373 p + 883 372 p + 884 372 p + 885 372 p + 189 372 p + 201 372 p + 883 371 p + 884 371 p + 885 371 p + 923 371 p + 924 371 p + 201 371 p + 202 371 p + 883 370 p + 884 370 p + 885 370 p + 888 370 p + 886 370 p + 189 370 p + 202 370 p + 886 369 p + 887 369 p + 851 369 p + 885 369 p + 888 369 p + 189 369 p + 203 369 p + 886 368 p + 887 368 p + 851 368 p + 889 368 p + 890 368 p + 203 368 p + 190 368 p + 885 367 p + 888 367 p + 886 367 p + 927 367 p + 928 367 p + 202 367 p + 203 367 p + 889 366 p + 887 366 p + 890 366 p + 853 366 p + 891 366 p + 204 366 p + 190 366 p + 889 365 p + 887 365 p + 890 365 p + 930 365 p + 931 365 p + 204 365 p + 203 365 p + 853 364 p + 889 364 p + 891 364 p + 892 364 p + 893 364 p + 191 364 p + 204 364 p + 892 363 p + 891 363 p + 893 363 p + 856 363 p + 894 363 p + 205 363 p + 191 363 p + 892 362 p + 891 362 p + 893 362 p + 935 362 p + 937 362 p + 205 362 p + 204 362 p + 856 361 p + 892 361 p + 894 361 p + 895 361 p + 896 361 p + 192 361 p + 205 361 p + 895 360 p + 894 360 p + 896 360 p + 859 360 p + 897 360 p + 206 360 p + 192 360 p + 895 359 p + 894 359 p + 896 359 p + 938 359 p + 940 359 p + 206 359 p + 205 359 p + 859 358 p + 895 358 p + 897 358 p + 898 358 p + 899 358 p + 193 358 p + 206 358 p + 898 357 p + 897 357 p + 899 357 p + 862 357 p + 900 357 p + 207 357 p + 193 357 p + 898 356 p + 897 356 p + 899 356 p + 941 356 p + 943 356 p + 207 356 p + 206 356 p + 862 355 p + 898 355 p + 900 355 p + 901 355 p + 902 355 p + 194 355 p + 207 355 p + 901 354 p + 900 354 p + 902 354 p + 865 354 p + 903 354 p + 208 354 p + 194 354 p + 901 353 p + 900 353 p + 902 353 p + 944 353 p + 946 353 p + 208 353 p + 207 353 p + 865 352 p + 901 352 p + 903 352 p + 904 352 p + 905 352 p + 195 352 p + 208 352 p + 904 351 p + 903 351 p + 905 351 p + 869 351 p + 906 351 p + 209 351 p + 195 351 p + 904 350 p + 903 350 p + 905 350 p + 947 350 p + 949 350 p + 209 350 p + 208 350 p + 869 349 p + 904 349 p + 906 349 p + 907 349 p + 908 349 p + 196 349 p + 209 349 p + 907 348 p + 906 348 p + 908 348 p + 872 348 p + 909 348 p + 210 348 p + 196 348 p + 907 347 p + 906 347 p + 908 347 p + 950 347 p + 952 347 p + 210 347 p + 209 347 p + 872 346 p + 907 346 p + 909 346 p + 910 346 p + 911 346 p + 197 346 p + 210 346 p + 910 345 p + 909 345 p + 911 345 p + 874 345 p + 912 345 p + 211 345 p + 197 345 p + 910 344 p + 909 344 p + 911 344 p + 955 344 p + 953 344 p + 211 344 p + 210 344 p + 874 343 p + 910 343 p + 912 343 p + 913 343 p + 914 343 p + 198 343 p + 211 343 p + 913 342 p + 912 342 p + 914 342 p + 877 342 p + 915 342 p + 212 342 p + 198 342 p + 913 341 p + 912 341 p + 914 341 p + 953 341 p + 954 341 p + 212 341 p + 211 341 p + 877 340 p + 913 340 p + 915 340 p + 916 340 p + 917 340 p + 199 340 p + 212 340 p + 916 339 p + 915 339 p + 917 339 p + 881 339 p + 918 339 p + 213 339 p + 199 339 p + 916 338 p + 915 338 p + 917 338 p + 957 338 p + 958 338 p + 213 338 p + 212 338 p + 881 337 p + 916 337 p + 918 337 p + 0 337 p + 213 337 p + 882 336 p + 919 336 p + 920 336 p + 921 336 p + 922 336 p + 327 336 p + 326 336 p + 882 335 p + 919 335 p + 920 335 p + 345 335 p + 961 335 p + 8 335 p + 326 335 p + 919 334 p + 921 334 p + 922 334 p + 847 334 p + 960 334 p + 327 334 p + 319 334 p + 919 333 p + 921 333 p + 922 333 p + 1040 333 p + 1001 333 p + 326 333 p + 319 333 p + 923 332 p + 924 332 p + 884 332 p + 925 332 p + 926 332 p + 201 332 p + 215 332 p + 923 331 p + 924 331 p + 884 331 p + 929 331 p + 927 331 p + 215 331 p + 202 331 p + 925 330 p + 926 330 p + 923 330 p + 201 330 p + 214 330 p + 925 329 p + 926 329 p + 923 329 p + 964 329 p + 965 329 p + 214 329 p + 215 329 p + 927 328 p + 928 328 p + 888 328 p + 924 328 p + 929 328 p + 202 328 p + 216 328 p + 927 327 p + 928 327 p + 888 327 p + 932 327 p + 930 327 p + 216 327 p + 203 327 p + 924 326 p + 929 326 p + 927 326 p + 968 326 p + 969 326 p + 215 326 p + 216 326 p + 930 325 p + 931 325 p + 890 325 p + 928 325 p + 932 325 p + 203 325 p + 217 325 p + 930 324 p + 931 324 p + 890 324 p + 933 324 p + 934 324 p + 217 324 p + 204 324 p + 928 323 p + 932 323 p + 930 323 p + 971 323 p + 972 323 p + 216 323 p + 217 323 p + 933 322 p + 931 322 p + 934 322 p + 935 322 p + 936 322 p + 218 322 p + 204 322 p + 933 321 p + 931 321 p + 934 321 p + 974 321 p + 975 321 p + 218 321 p + 217 321 p + 935 320 p + 933 320 p + 936 320 p + 893 320 p + 937 320 p + 219 320 p + 204 320 p + 935 319 p + 933 319 p + 936 319 p + 977 319 p + 979 319 p + 219 319 p + 218 319 p + 893 318 p + 935 318 p + 937 318 p + 938 318 p + 939 318 p + 205 318 p + 219 318 p + 938 317 p + 937 317 p + 939 317 p + 896 317 p + 940 317 p + 220 317 p + 205 317 p + 938 316 p + 937 316 p + 939 316 p + 980 316 p + 982 316 p + 220 316 p + 219 316 p + 896 315 p + 938 315 p + 940 315 p + 941 315 p + 942 315 p + 206 315 p + 220 315 p + 941 314 p + 940 314 p + 942 314 p + 899 314 p + 943 314 p + 221 314 p + 206 314 p + 941 313 p + 940 313 p + 942 313 p + 983 313 p + 985 313 p + 221 313 p + 220 313 p + 899 312 p + 941 312 p + 943 312 p + 944 312 p + 945 312 p + 207 312 p + 221 312 p + 944 311 p + 943 311 p + 945 311 p + 902 311 p + 946 311 p + 222 311 p + 207 311 p + 944 310 p + 943 310 p + 945 310 p + 986 310 p + 988 310 p + 222 310 p + 221 310 p + 902 309 p + 944 309 p + 946 309 p + 947 309 p + 948 309 p + 208 309 p + 222 309 p + 947 308 p + 946 308 p + 948 308 p + 905 308 p + 949 308 p + 223 308 p + 208 308 p + 947 307 p + 946 307 p + 948 307 p + 989 307 p + 991 307 p + 223 307 p + 222 307 p + 905 306 p + 947 306 p + 949 306 p + 950 306 p + 951 306 p + 209 306 p + 223 306 p + 950 305 p + 949 305 p + 951 305 p + 908 305 p + 952 305 p + 224 305 p + 209 305 p + 950 304 p + 949 304 p + 951 304 p + 992 304 p + 994 304 p + 224 304 p + 223 304 p + 908 303 p + 950 303 p + 952 303 p + 955 303 p + 956 303 p + 210 303 p + 224 303 p + 914 302 p + 953 302 p + 954 302 p + 911 302 p + 955 302 p + 211 302 p + 225 302 p + 914 301 p + 953 301 p + 954 301 p + 959 301 p + 957 301 p + 212 301 p + 225 301 p + 955 300 p + 952 300 p + 956 300 p + 911 300 p + 953 300 p + 225 300 p + 210 300 p + 955 299 p + 952 299 p + 956 299 p + 995 299 p + 997 299 p + 225 299 p + 224 299 p + 957 298 p + 958 298 p + 917 298 p + 954 298 p + 959 298 p + 212 298 p + 226 298 p + 957 297 p + 958 297 p + 917 297 p + 226 297 p + 213 297 p + 954 296 p + 959 296 p + 957 296 p + 998 296 p + 1000 296 p + 225 296 p + 226 296 p + 847 295 p + 960 295 p + 921 295 p + 1251 295 p + 1248 295 p + 320 295 p + 319 295 p + 345 294 p + 920 294 p + 961 294 p + 962 294 p + 963 294 p + 7 294 p + 326 294 p + 961 293 p + 962 293 p + 963 293 p + 1001 293 p + 1002 293 p + 326 293 p + 325 293 p + 961 292 p + 962 292 p + 963 292 p + 341 292 p + 1041 292 p + 7 292 p + 325 292 p + 964 291 p + 965 291 p + 926 291 p + 966 291 p + 967 291 p + 214 291 p + 228 291 p + 964 290 p + 965 290 p + 926 290 p + 970 290 p + 969 290 p + 228 290 p + 215 290 p + 966 289 p + 967 289 p + 964 289 p + 214 289 p + 227 289 p + 966 288 p + 967 288 p + 964 288 p + 1003 288 p + 1004 288 p + 227 288 p + 228 288 p + 968 287 p + 929 287 p + 969 287 p + 973 287 p + 972 287 p + 229 287 p + 216 287 p + 968 286 p + 929 286 p + 969 286 p + 970 286 p + 965 286 p + 229 286 p + 215 286 p + 970 285 p + 969 285 p + 965 285 p + 1007 285 p + 1008 285 p + 228 285 p + 229 285 p + 971 284 p + 932 284 p + 972 284 p + 976 284 p + 975 284 p + 230 284 p + 217 284 p + 971 283 p + 932 283 p + 972 283 p + 973 283 p + 968 283 p + 230 283 p + 216 283 p + 973 282 p + 972 282 p + 968 282 p + 1010 282 p + 1011 282 p + 229 282 p + 230 282 p + 974 281 p + 934 281 p + 975 281 p + 977 281 p + 978 281 p + 231 281 p + 218 281 p + 974 280 p + 934 280 p + 975 280 p + 976 280 p + 971 280 p + 231 280 p + 217 280 p + 976 279 p + 975 279 p + 971 279 p + 1013 279 p + 1014 279 p + 230 279 p + 231 279 p + 977 278 p + 974 278 p + 978 278 p + 936 278 p + 979 278 p + 232 278 p + 218 278 p + 977 277 p + 974 277 p + 978 277 p + 1016 277 p + 1017 277 p + 232 277 p + 231 277 p + 936 276 p + 977 276 p + 979 276 p + 980 276 p + 981 276 p + 219 276 p + 232 276 p + 980 275 p + 979 275 p + 981 275 p + 939 275 p + 982 275 p + 233 275 p + 219 275 p + 980 274 p + 979 274 p + 981 274 p + 1019 274 p + 1020 274 p + 233 274 p + 232 274 p + 939 273 p + 980 273 p + 982 273 p + 983 273 p + 984 273 p + 220 273 p + 233 273 p + 983 272 p + 982 272 p + 984 272 p + 942 272 p + 985 272 p + 234 272 p + 220 272 p + 983 271 p + 982 271 p + 984 271 p + 1022 271 p + 1024 271 p + 234 271 p + 233 271 p + 942 270 p + 983 270 p + 985 270 p + 986 270 p + 987 270 p + 221 270 p + 234 270 p + 986 269 p + 985 269 p + 987 269 p + 945 269 p + 988 269 p + 235 269 p + 221 269 p + 986 268 p + 985 268 p + 987 268 p + 1025 268 p + 1027 268 p + 235 268 p + 234 268 p + 945 267 p + 986 267 p + 988 267 p + 989 267 p + 990 267 p + 222 267 p + 235 267 p + 989 266 p + 988 266 p + 990 266 p + 948 266 p + 991 266 p + 236 266 p + 222 266 p + 989 265 p + 988 265 p + 990 265 p + 1028 265 p + 1030 265 p + 236 265 p + 235 265 p + 948 264 p + 989 264 p + 991 264 p + 992 264 p + 993 264 p + 223 264 p + 236 264 p + 992 263 p + 991 263 p + 993 263 p + 951 263 p + 994 263 p + 237 263 p + 223 263 p + 992 262 p + 991 262 p + 993 262 p + 1031 262 p + 1033 262 p + 237 262 p + 236 262 p + 951 261 p + 992 261 p + 994 261 p + 995 261 p + 996 261 p + 224 261 p + 237 261 p + 995 260 p + 994 260 p + 996 260 p + 956 260 p + 997 260 p + 238 260 p + 224 260 p + 995 259 p + 994 259 p + 996 259 p + 1034 259 p + 1036 259 p + 238 259 p + 237 259 p + 956 258 p + 995 258 p + 997 258 p + 998 258 p + 999 258 p + 225 258 p + 238 258 p + 998 257 p + 997 257 p + 999 257 p + 959 257 p + 1000 257 p + 239 257 p + 225 257 p + 998 256 p + 997 256 p + 999 256 p + 1037 256 p + 1039 256 p + 239 256 p + 238 256 p + 959 255 p + 998 255 p + 1000 255 p + 226 255 p + 239 255 p + 962 254 p + 1001 254 p + 1002 254 p + 922 254 p + 1040 254 p + 326 254 p + 318 254 p + 962 253 p + 1001 253 p + 1002 253 p + 1083 253 p + 1081 253 p + 325 253 p + 318 253 p + 1003 252 p + 967 252 p + 1004 252 p + 1009 252 p + 1008 252 p + 241 252 p + 228 252 p + 1003 251 p + 967 251 p + 1004 251 p + 1005 251 p + 1006 251 p + 241 251 p + 227 251 p + 1005 250 p + 1004 250 p + 1006 250 p + 1042 250 p + 1043 250 p + 240 250 p + 241 250 p + 1005 249 p + 1004 249 p + 1006 249 p + 240 249 p + 227 249 p + 1007 248 p + 970 248 p + 1008 248 p + 1012 248 p + 1011 248 p + 242 248 p + 229 248 p + 1007 247 p + 970 247 p + 1008 247 p + 1009 247 p + 1003 247 p + 242 247 p + 228 247 p + 1009 246 p + 1008 246 p + 1003 246 p + 1046 246 p + 1047 246 p + 241 246 p + 242 246 p + 1010 245 p + 973 245 p + 1011 245 p + 1015 245 p + 1014 245 p + 243 245 p + 230 245 p + 1010 244 p + 973 244 p + 1011 244 p + 1012 244 p + 1007 244 p + 243 244 p + 229 244 p + 1012 243 p + 1011 243 p + 1007 243 p + 1049 243 p + 1050 243 p + 242 243 p + 243 243 p + 1013 242 p + 976 242 p + 1014 242 p + 1018 242 p + 1017 242 p + 244 242 p + 231 242 p + 1013 241 p + 976 241 p + 1014 241 p + 1015 241 p + 1010 241 p + 244 241 p + 230 241 p + 1015 240 p + 1014 240 p + 1010 240 p + 1052 240 p + 1053 240 p + 243 240 p + 244 240 p + 1016 239 p + 978 239 p + 1017 239 p + 1021 239 p + 1019 239 p + 245 239 p + 232 239 p + 1016 238 p + 978 238 p + 1017 238 p + 1018 238 p + 1013 238 p + 245 238 p + 231 238 p + 1018 237 p + 1017 237 p + 1013 237 p + 1055 237 p + 1056 237 p + 244 237 p + 245 237 p + 1019 236 p + 1020 236 p + 981 236 p + 1016 236 p + 1021 236 p + 232 236 p + 246 236 p + 1019 235 p + 1020 235 p + 981 235 p + 1022 235 p + 1023 235 p + 246 235 p + 233 235 p + 1016 234 p + 1021 234 p + 1019 234 p + 1058 234 p + 1059 234 p + 245 234 p + 246 234 p + 1022 233 p + 1020 233 p + 1023 233 p + 984 233 p + 1024 233 p + 247 233 p + 233 233 p + 1022 232 p + 1020 232 p + 1023 232 p + 1061 232 p + 1062 232 p + 247 232 p + 246 232 p + 984 231 p + 1022 231 p + 1024 231 p + 1025 231 p + 1026 231 p + 234 231 p + 247 231 p + 1025 230 p + 1024 230 p + 1026 230 p + 987 230 p + 1027 230 p + 248 230 p + 234 230 p + 1025 229 p + 1024 229 p + 1026 229 p + 1064 229 p + 1066 229 p + 248 229 p + 247 229 p + 987 228 p + 1025 228 p + 1027 228 p + 1028 228 p + 1029 228 p + 235 228 p + 248 228 p + 1028 227 p + 1027 227 p + 1029 227 p + 990 227 p + 1030 227 p + 249 227 p + 235 227 p + 1028 226 p + 1027 226 p + 1029 226 p + 1067 226 p + 1069 226 p + 249 226 p + 248 226 p + 990 225 p + 1028 225 p + 1030 225 p + 1031 225 p + 1032 225 p + 236 225 p + 249 225 p + 1031 224 p + 1030 224 p + 1032 224 p + 993 224 p + 1033 224 p + 250 224 p + 236 224 p + 1031 223 p + 1030 223 p + 1032 223 p + 1070 223 p + 1072 223 p + 250 223 p + 249 223 p + 993 222 p + 1031 222 p + 1033 222 p + 1034 222 p + 1035 222 p + 237 222 p + 250 222 p + 1034 221 p + 1033 221 p + 1035 221 p + 996 221 p + 1036 221 p + 251 221 p + 237 221 p + 1034 220 p + 1033 220 p + 1035 220 p + 1073 220 p + 1075 220 p + 251 220 p + 250 220 p + 996 219 p + 1034 219 p + 1036 219 p + 1037 219 p + 1038 219 p + 238 219 p + 251 219 p + 1037 218 p + 1036 218 p + 1038 218 p + 999 218 p + 1039 218 p + 252 218 p + 238 218 p + 1037 217 p + 1036 217 p + 1038 217 p + 1076 217 p + 1078 217 p + 252 217 p + 251 217 p + 999 216 p + 1037 216 p + 1039 216 p + 239 216 p + 252 216 p + 922 215 p + 1040 215 p + 1001 215 p + 1249 215 p + 1246 215 p + 319 215 p + 318 215 p + 341 214 p + 963 214 p + 1041 214 p + 1079 214 p + 1080 214 p + 6 214 p + 325 214 p + 1042 213 p + 1005 213 p + 1043 213 p + 1048 213 p + 1047 213 p + 254 213 p + 241 213 p + 1042 212 p + 1005 212 p + 1043 212 p + 1044 212 p + 1045 212 p + 254 212 p + 240 212 p + 1044 211 p + 1043 211 p + 1045 211 p + 1084 211 p + 1085 211 p + 253 211 p + 254 211 p + 1044 210 p + 1043 210 p + 1045 210 p + 253 210 p + 240 210 p + 1046 209 p + 1009 209 p + 1047 209 p + 1051 209 p + 1050 209 p + 255 209 p + 242 209 p + 1046 208 p + 1009 208 p + 1047 208 p + 1048 208 p + 1042 208 p + 255 208 p + 241 208 p + 1048 207 p + 1047 207 p + 1042 207 p + 1086 207 p + 1087 207 p + 254 207 p + 255 207 p + 1049 206 p + 1012 206 p + 1050 206 p + 1054 206 p + 1053 206 p + 256 206 p + 243 206 p + 1049 205 p + 1012 205 p + 1050 205 p + 1051 205 p + 1046 205 p + 256 205 p + 242 205 p + 1051 204 p + 1050 204 p + 1046 204 p + 1089 204 p + 1090 204 p + 255 204 p + 256 204 p + 1052 203 p + 1015 203 p + 1053 203 p + 1057 203 p + 1056 203 p + 257 203 p + 244 203 p + 1052 202 p + 1015 202 p + 1053 202 p + 1054 202 p + 1049 202 p + 257 202 p + 243 202 p + 1054 201 p + 1053 201 p + 1049 201 p + 1092 201 p + 1093 201 p + 256 201 p + 257 201 p + 1055 200 p + 1018 200 p + 1056 200 p + 1060 200 p + 1059 200 p + 258 200 p + 245 200 p + 1055 199 p + 1018 199 p + 1056 199 p + 1057 199 p + 1052 199 p + 258 199 p + 244 199 p + 1057 198 p + 1056 198 p + 1052 198 p + 1095 198 p + 1096 198 p + 257 198 p + 258 198 p + 1058 197 p + 1021 197 p + 1059 197 p + 1063 197 p + 1061 197 p + 259 197 p + 246 197 p + 1058 196 p + 1021 196 p + 1059 196 p + 1060 196 p + 1055 196 p + 259 196 p + 245 196 p + 1060 195 p + 1059 195 p + 1055 195 p + 1098 195 p + 1099 195 p + 258 195 p + 259 195 p + 1061 194 p + 1062 194 p + 1023 194 p + 1058 194 p + 1063 194 p + 246 194 p + 260 194 p + 1061 193 p + 1062 193 p + 1023 193 p + 1064 193 p + 1065 193 p + 260 193 p + 247 193 p + 1058 192 p + 1063 192 p + 1061 192 p + 1101 192 p + 1102 192 p + 259 192 p + 260 192 p + 1064 191 p + 1062 191 p + 1065 191 p + 1026 191 p + 1066 191 p + 261 191 p + 247 191 p + 1064 190 p + 1062 190 p + 1065 190 p + 1104 190 p + 1105 190 p + 261 190 p + 260 190 p + 1026 189 p + 1064 189 p + 1066 189 p + 1067 189 p + 1068 189 p + 248 189 p + 261 189 p + 1067 188 p + 1066 188 p + 1068 188 p + 1029 188 p + 1069 188 p + 262 188 p + 248 188 p + 1067 187 p + 1066 187 p + 1068 187 p + 1107 187 p + 1109 187 p + 262 187 p + 261 187 p + 1029 186 p + 1067 186 p + 1069 186 p + 1070 186 p + 1071 186 p + 249 186 p + 262 186 p + 1070 185 p + 1069 185 p + 1071 185 p + 1032 185 p + 1072 185 p + 263 185 p + 249 185 p + 1070 184 p + 1069 184 p + 1071 184 p + 1110 184 p + 1112 184 p + 263 184 p + 262 184 p + 1032 183 p + 1070 183 p + 1072 183 p + 1073 183 p + 1074 183 p + 250 183 p + 263 183 p + 1073 182 p + 1072 182 p + 1074 182 p + 1035 182 p + 1075 182 p + 264 182 p + 250 182 p + 1073 181 p + 1072 181 p + 1074 181 p + 1113 181 p + 1115 181 p + 264 181 p + 263 181 p + 1035 180 p + 1073 180 p + 1075 180 p + 1076 180 p + 1077 180 p + 251 180 p + 264 180 p + 1076 179 p + 1075 179 p + 1077 179 p + 1038 179 p + 1078 179 p + 265 179 p + 251 179 p + 1076 178 p + 1075 178 p + 1077 178 p + 1116 178 p + 1118 178 p + 265 178 p + 264 178 p + 1038 177 p + 1076 177 p + 1078 177 p + 252 177 p + 265 177 p + 1041 176 p + 1079 176 p + 1080 176 p + 1081 176 p + 1082 176 p + 325 176 p + 324 176 p + 1041 175 p + 1079 175 p + 1080 175 p + 337 175 p + 1121 175 p + 6 175 p + 324 175 p + 1079 174 p + 1081 174 p + 1082 174 p + 1002 174 p + 1083 174 p + 325 174 p + 317 174 p + 1079 173 p + 1081 173 p + 1082 173 p + 1167 173 p + 1165 173 p + 324 173 p + 317 173 p + 1002 172 p + 1083 172 p + 1081 172 p + 1247 172 p + 1244 172 p + 318 172 p + 317 172 p + 1084 171 p + 1044 171 p + 1085 171 p + 1088 171 p + 1087 171 p + 266 171 p + 254 171 p + 1084 170 p + 1044 170 p + 1085 170 p + 266 170 p + 253 170 p + 1086 169 p + 1048 169 p + 1087 169 p + 1091 169 p + 1090 169 p + 267 169 p + 255 169 p + 1086 168 p + 1048 168 p + 1087 168 p + 1088 168 p + 1084 168 p + 267 168 p + 254 168 p + 1088 167 p + 1087 167 p + 1084 167 p + 1122 167 p + 1123 167 p + 266 167 p + 267 167 p + 1089 166 p + 1051 166 p + 1090 166 p + 1094 166 p + 1093 166 p + 268 166 p + 256 166 p + 1089 165 p + 1051 165 p + 1090 165 p + 1091 165 p + 1086 165 p + 268 165 p + 255 165 p + 1091 164 p + 1090 164 p + 1086 164 p + 1124 164 p + 1125 164 p + 267 164 p + 268 164 p + 1092 163 p + 1054 163 p + 1093 163 p + 1097 163 p + 1096 163 p + 269 163 p + 257 163 p + 1092 162 p + 1054 162 p + 1093 162 p + 1094 162 p + 1089 162 p + 269 162 p + 256 162 p + 1094 161 p + 1093 161 p + 1089 161 p + 1127 161 p + 1128 161 p + 268 161 p + 269 161 p + 1095 160 p + 1057 160 p + 1096 160 p + 1100 160 p + 1099 160 p + 270 160 p + 258 160 p + 1095 159 p + 1057 159 p + 1096 159 p + 1097 159 p + 1092 159 p + 270 159 p + 257 159 p + 1097 158 p + 1096 158 p + 1092 158 p + 1130 158 p + 1131 158 p + 269 158 p + 270 158 p + 1098 157 p + 1060 157 p + 1099 157 p + 1103 157 p + 1102 157 p + 271 157 p + 259 157 p + 1098 156 p + 1060 156 p + 1099 156 p + 1100 156 p + 1095 156 p + 271 156 p + 258 156 p + 1100 155 p + 1099 155 p + 1095 155 p + 1133 155 p + 1134 155 p + 270 155 p + 271 155 p + 1101 154 p + 1063 154 p + 1102 154 p + 1106 154 p + 1104 154 p + 272 154 p + 260 154 p + 1101 153 p + 1063 153 p + 1102 153 p + 1103 153 p + 1098 153 p + 272 153 p + 259 153 p + 1103 152 p + 1102 152 p + 1098 152 p + 1136 152 p + 1137 152 p + 271 152 p + 272 152 p + 1104 151 p + 1105 151 p + 1065 151 p + 1101 151 p + 1106 151 p + 260 151 p + 273 151 p + 1104 150 p + 1105 150 p + 1065 150 p + 1107 150 p + 1108 150 p + 273 150 p + 261 150 p + 1101 149 p + 1106 149 p + 1104 149 p + 1139 149 p + 1140 149 p + 272 149 p + 273 149 p + 1107 148 p + 1105 148 p + 1108 148 p + 1068 148 p + 1109 148 p + 274 148 p + 261 148 p + 1107 147 p + 1105 147 p + 1108 147 p + 1142 147 p + 1143 147 p + 274 147 p + 273 147 p + 1068 146 p + 1107 146 p + 1109 146 p + 1110 146 p + 1111 146 p + 262 146 p + 274 146 p + 1110 145 p + 1109 145 p + 1111 145 p + 1071 145 p + 1112 145 p + 275 145 p + 262 145 p + 1110 144 p + 1109 144 p + 1111 144 p + 1145 144 p + 1146 144 p + 275 144 p + 274 144 p + 1071 143 p + 1110 143 p + 1112 143 p + 1113 143 p + 1114 143 p + 263 143 p + 275 143 p + 1113 142 p + 1112 142 p + 1114 142 p + 1074 142 p + 1115 142 p + 276 142 p + 263 142 p + 1113 141 p + 1112 141 p + 1114 141 p + 1148 141 p + 1149 141 p + 276 141 p + 275 141 p + 1074 140 p + 1113 140 p + 1115 140 p + 1116 140 p + 1117 140 p + 264 140 p + 276 140 p + 1116 139 p + 1115 139 p + 1117 139 p + 1077 139 p + 1118 139 p + 277 139 p + 264 139 p + 1116 138 p + 1115 138 p + 1117 138 p + 1151 138 p + 1153 138 p + 277 138 p + 276 138 p + 1077 137 p + 1116 137 p + 1118 137 p + 1119 137 p + 1120 137 p + 265 137 p + 277 137 p + 1118 136 p + 1119 136 p + 1120 136 p + 1156 136 p + 1158 136 p + 277 136 p + 278 136 p + 1118 135 p + 1119 135 p + 1120 135 p + 265 135 p + 278 135 p + 337 134 p + 1080 134 p + 1121 134 p + 1163 134 p + 1164 134 p + 5 134 p + 324 134 p + 1122 133 p + 1088 133 p + 1123 133 p + 1126 133 p + 1125 133 p + 279 133 p + 267 133 p + 1122 132 p + 1088 132 p + 1123 132 p + 279 132 p + 266 132 p + 1124 131 p + 1091 131 p + 1125 131 p + 1129 131 p + 1128 131 p + 280 131 p + 268 131 p + 1124 130 p + 1091 130 p + 1125 130 p + 1126 130 p + 1122 130 p + 280 130 p + 267 130 p + 1126 129 p + 1125 129 p + 1122 129 p + 1168 129 p + 1169 129 p + 279 129 p + 280 129 p + 1127 128 p + 1094 128 p + 1128 128 p + 1132 128 p + 1131 128 p + 281 128 p + 269 128 p + 1127 127 p + 1094 127 p + 1128 127 p + 1129 127 p + 1124 127 p + 281 127 p + 268 127 p + 1129 126 p + 1128 126 p + 1124 126 p + 1170 126 p + 1171 126 p + 280 126 p + 281 126 p + 1130 125 p + 1097 125 p + 1131 125 p + 1135 125 p + 1134 125 p + 282 125 p + 270 125 p + 1130 124 p + 1097 124 p + 1131 124 p + 1132 124 p + 1127 124 p + 282 124 p + 269 124 p + 1132 123 p + 1131 123 p + 1127 123 p + 1173 123 p + 1174 123 p + 281 123 p + 282 123 p + 1133 122 p + 1100 122 p + 1134 122 p + 1138 122 p + 1137 122 p + 283 122 p + 271 122 p + 1133 121 p + 1100 121 p + 1134 121 p + 1135 121 p + 1130 121 p + 283 121 p + 270 121 p + 1135 120 p + 1134 120 p + 1130 120 p + 1176 120 p + 1177 120 p + 282 120 p + 283 120 p + 1136 119 p + 1103 119 p + 1137 119 p + 1141 119 p + 1140 119 p + 284 119 p + 272 119 p + 1136 118 p + 1103 118 p + 1137 118 p + 1138 118 p + 1133 118 p + 284 118 p + 271 118 p + 1138 117 p + 1137 117 p + 1133 117 p + 1179 117 p + 1180 117 p + 283 117 p + 284 117 p + 1139 116 p + 1106 116 p + 1140 116 p + 1144 116 p + 1143 116 p + 285 116 p + 273 116 p + 1139 115 p + 1106 115 p + 1140 115 p + 1141 115 p + 1136 115 p + 285 115 p + 272 115 p + 1141 114 p + 1140 114 p + 1136 114 p + 1182 114 p + 1183 114 p + 284 114 p + 285 114 p + 1142 113 p + 1108 113 p + 1143 113 p + 1147 113 p + 1145 113 p + 286 113 p + 274 113 p + 1142 112 p + 1108 112 p + 1143 112 p + 1144 112 p + 1139 112 p + 286 112 p + 273 112 p + 1144 111 p + 1143 111 p + 1139 111 p + 1185 111 p + 1186 111 p + 285 111 p + 286 111 p + 1145 110 p + 1146 110 p + 1111 110 p + 1142 110 p + 1147 110 p + 274 110 p + 287 110 p + 1145 109 p + 1146 109 p + 1111 109 p + 1150 109 p + 1148 109 p + 287 109 p + 275 109 p + 1142 108 p + 1147 108 p + 1145 108 p + 1188 108 p + 1189 108 p + 286 108 p + 287 108 p + 1148 107 p + 1149 107 p + 1114 107 p + 1146 107 p + 1150 107 p + 275 107 p + 288 107 p + 1148 106 p + 1149 106 p + 1114 106 p + 1151 106 p + 1152 106 p + 288 106 p + 276 106 p + 1146 105 p + 1150 105 p + 1148 105 p + 1191 105 p + 1192 105 p + 287 105 p + 288 105 p + 1151 104 p + 1149 104 p + 1152 104 p + 1117 104 p + 1153 104 p + 289 104 p + 276 104 p + 1151 103 p + 1149 103 p + 1152 103 p + 1196 103 p + 1194 103 p + 289 103 p + 288 103 p + 1117 102 p + 1151 102 p + 1153 102 p + 1154 102 p + 1155 102 p + 277 102 p + 289 102 p + 1154 101 p + 1153 101 p + 1155 101 p + 1156 101 p + 1157 101 p + 290 101 p + 277 101 p + 1154 100 p + 1153 100 p + 1155 100 p + 1194 100 p + 1195 100 p + 290 100 p + 289 100 p + 1156 99 p + 1154 99 p + 1157 99 p + 1119 99 p + 1158 99 p + 291 99 p + 277 99 p + 1156 98 p + 1154 98 p + 1157 98 p + 1200 98 p + 1198 98 p + 291 98 p + 290 98 p + 1119 97 p + 1156 97 p + 1158 97 p + 1159 97 p + 1162 97 p + 278 97 p + 291 97 p + 1159 96 p + 1160 96 p + 1161 96 p + 1158 96 p + 1162 96 p + 292 96 p + 291 96 p + 1159 95 p + 1160 95 p + 1161 95 p + 1198 95 p + 1199 95 p + 291 95 p + 1 95 p + 1159 94 p + 1160 94 p + 1161 94 p + 292 94 p + 1 94 p + 1158 93 p + 1159 93 p + 1162 93 p + 278 93 p + 292 93 p + 1121 92 p + 1163 92 p + 1164 92 p + 1165 92 p + 1166 92 p + 324 92 p + 323 92 p + 1121 91 p + 1163 91 p + 1164 91 p + 332 91 p + 1202 91 p + 5 91 p + 323 91 p + 1163 90 p + 1165 90 p + 1166 90 p + 1082 90 p + 1167 90 p + 324 90 p + 316 90 p + 1163 89 p + 1165 89 p + 1166 89 p + 1243 89 p + 1234 89 p + 323 89 p + 316 89 p + 1082 88 p + 1167 88 p + 1165 88 p + 1245 88 p + 1241 88 p + 317 88 p + 316 88 p + 1168 87 p + 1126 87 p + 1169 87 p + 1172 87 p + 1171 87 p + 293 87 p + 280 87 p + 1168 86 p + 1126 86 p + 1169 86 p + 293 86 p + 279 86 p + 1170 85 p + 1129 85 p + 1171 85 p + 1175 85 p + 1174 85 p + 294 85 p + 281 85 p + 1170 84 p + 1129 84 p + 1171 84 p + 1172 84 p + 1168 84 p + 294 84 p + 280 84 p + 1172 83 p + 1171 83 p + 1168 83 p + 1203 83 p + 1204 83 p + 293 83 p + 294 83 p + 1173 82 p + 1132 82 p + 1174 82 p + 1178 82 p + 1177 82 p + 295 82 p + 282 82 p + 1173 81 p + 1132 81 p + 1174 81 p + 1175 81 p + 1170 81 p + 295 81 p + 281 81 p + 1175 80 p + 1174 80 p + 1170 80 p + 1205 80 p + 1206 80 p + 294 80 p + 295 80 p + 1176 79 p + 1135 79 p + 1177 79 p + 1181 79 p + 1180 79 p + 296 79 p + 283 79 p + 1176 78 p + 1135 78 p + 1177 78 p + 1178 78 p + 1173 78 p + 296 78 p + 282 78 p + 1178 77 p + 1177 77 p + 1173 77 p + 1208 77 p + 1209 77 p + 295 77 p + 296 77 p + 1179 76 p + 1138 76 p + 1180 76 p + 1184 76 p + 1183 76 p + 297 76 p + 284 76 p + 1179 75 p + 1138 75 p + 1180 75 p + 1181 75 p + 1176 75 p + 297 75 p + 283 75 p + 1181 74 p + 1180 74 p + 1176 74 p + 1211 74 p + 1212 74 p + 296 74 p + 297 74 p + 1182 73 p + 1141 73 p + 1183 73 p + 1187 73 p + 1186 73 p + 298 73 p + 285 73 p + 1182 72 p + 1141 72 p + 1183 72 p + 1184 72 p + 1179 72 p + 298 72 p + 284 72 p + 1184 71 p + 1183 71 p + 1179 71 p + 1214 71 p + 1215 71 p + 297 71 p + 298 71 p + 1185 70 p + 1144 70 p + 1186 70 p + 1190 70 p + 1189 70 p + 299 70 p + 286 70 p + 1185 69 p + 1144 69 p + 1186 69 p + 1187 69 p + 1182 69 p + 299 69 p + 285 69 p + 1187 68 p + 1186 68 p + 1182 68 p + 1217 68 p + 1218 68 p + 298 68 p + 299 68 p + 1188 67 p + 1147 67 p + 1189 67 p + 1193 67 p + 1191 67 p + 300 67 p + 287 67 p + 1188 66 p + 1147 66 p + 1189 66 p + 1190 66 p + 1185 66 p + 300 66 p + 286 66 p + 1190 65 p + 1189 65 p + 1185 65 p + 1220 65 p + 1221 65 p + 299 65 p + 300 65 p + 1191 64 p + 1192 64 p + 1150 64 p + 1188 64 p + 1193 64 p + 287 64 p + 301 64 p + 1191 63 p + 1192 63 p + 1150 63 p + 1197 63 p + 1196 63 p + 301 63 p + 288 63 p + 1188 62 p + 1193 62 p + 1191 62 p + 1223 62 p + 1224 62 p + 300 62 p + 301 62 p + 1194 61 p + 1195 61 p + 1155 61 p + 1196 61 p + 1152 61 p + 289 61 p + 302 61 p + 1194 60 p + 1195 60 p + 1155 60 p + 1201 60 p + 1200 60 p + 302 60 p + 290 60 p + 1196 59 p + 1194 59 p + 1152 59 p + 1192 59 p + 1197 59 p + 288 59 p + 302 59 p + 1192 58 p + 1197 58 p + 1196 58 p + 1226 58 p + 1227 58 p + 301 58 p + 302 58 p + 1198 57 p + 1199 57 p + 1160 57 p + 1200 57 p + 1157 57 p + 291 57 p + 303 57 p + 1198 56 p + 1199 56 p + 1160 56 p + 303 56 p + 1 56 p + 1200 55 p + 1198 55 p + 1157 55 p + 1195 55 p + 1201 55 p + 290 55 p + 303 55 p + 1195 54 p + 1201 54 p + 1200 54 p + 1229 54 p + 1230 54 p + 302 54 p + 303 54 p + 332 53 p + 1164 53 p + 1202 53 p + 1232 53 p + 1233 53 p + 4 53 p + 323 53 p + 1203 52 p + 1172 52 p + 1204 52 p + 1207 52 p + 1206 52 p + 304 52 p + 294 52 p + 1203 51 p + 1172 51 p + 1204 51 p + 304 51 p + 293 51 p + 1205 50 p + 1175 50 p + 1206 50 p + 1210 50 p + 1209 50 p + 305 50 p + 295 50 p + 1205 49 p + 1175 49 p + 1206 49 p + 1207 49 p + 1203 49 p + 305 49 p + 294 49 p + 1207 48 p + 1206 48 p + 1203 48 p + 1236 48 p + 1237 48 p + 304 48 p + 305 48 p + 1208 47 p + 1178 47 p + 1209 47 p + 1213 47 p + 1212 47 p + 306 47 p + 296 47 p + 1208 46 p + 1178 46 p + 1209 46 p + 1210 46 p + 1205 46 p + 306 46 p + 295 46 p + 1210 45 p + 1209 45 p + 1205 45 p + 1238 45 p + 1239 45 p + 305 45 p + 306 45 p + 1211 44 p + 1181 44 p + 1212 44 p + 1216 44 p + 1215 44 p + 307 44 p + 297 44 p + 1211 43 p + 1181 43 p + 1212 43 p + 1213 43 p + 1208 43 p + 307 43 p + 296 43 p + 1213 42 p + 1212 42 p + 1208 42 p + 1241 42 p + 1242 42 p + 306 42 p + 307 42 p + 1214 41 p + 1184 41 p + 1215 41 p + 1219 41 p + 1218 41 p + 308 41 p + 298 41 p + 1214 40 p + 1184 40 p + 1215 40 p + 1216 40 p + 1211 40 p + 308 40 p + 297 40 p + 1216 39 p + 1215 39 p + 1211 39 p + 1244 39 p + 1245 39 p + 307 39 p + 308 39 p + 1217 38 p + 1187 38 p + 1218 38 p + 1222 38 p + 1221 38 p + 309 38 p + 299 38 p + 1217 37 p + 1187 37 p + 1218 37 p + 1219 37 p + 1214 37 p + 309 37 p + 298 37 p + 1219 36 p + 1218 36 p + 1214 36 p + 1246 36 p + 1247 36 p + 308 36 p + 309 36 p + 1220 35 p + 1190 35 p + 1221 35 p + 1225 35 p + 1223 35 p + 310 35 p + 300 35 p + 1220 34 p + 1190 34 p + 1221 34 p + 1222 34 p + 1217 34 p + 310 34 p + 299 34 p + 1222 33 p + 1221 33 p + 1217 33 p + 1248 33 p + 1249 33 p + 309 33 p + 310 33 p + 1223 32 p + 1224 32 p + 1193 32 p + 1220 32 p + 1225 32 p + 300 32 p + 311 32 p + 1223 31 p + 1224 31 p + 1193 31 p + 1228 31 p + 1226 31 p + 311 31 p + 301 31 p + 1220 30 p + 1225 30 p + 1223 30 p + 1250 30 p + 1251 30 p + 310 30 p + 311 30 p + 1226 29 p + 1227 29 p + 1197 29 p + 1224 29 p + 1228 29 p + 301 29 p + 312 29 p + 1226 28 p + 1227 28 p + 1197 28 p + 1231 28 p + 1229 28 p + 312 28 p + 302 28 p + 1224 27 p + 1228 27 p + 1226 27 p + 1254 27 p + 1253 27 p + 311 27 p + 312 27 p + 1229 26 p + 1230 26 p + 1201 26 p + 1227 26 p + 1231 26 p + 302 26 p + 313 26 p + 1229 25 p + 1230 25 p + 1201 25 p + 313 25 p + 303 25 p + 1227 24 p + 1231 24 p + 1229 24 p + 1252 24 p + 1253 24 p + 312 24 p + 313 24 p + 1202 23 p + 1232 23 p + 1233 23 p + 1234 23 p + 1235 23 p + 323 23 p + 322 23 p + 1202 22 p + 1232 22 p + 1233 22 p + 4 22 p + 322 22 p + 1232 21 p + 1234 21 p + 1235 21 p + 1166 21 p + 1243 21 p + 323 21 p + 315 21 p + 1232 20 p + 1234 20 p + 1235 20 p + 1240 20 p + 1255 20 p + 322 20 p + 315 20 p + 1236 19 p + 1207 19 p + 1237 19 p + 1240 19 p + 1239 19 p + 314 19 p + 305 19 p + 1236 18 p + 1207 18 p + 1237 18 p + 314 18 p + 304 18 p + 1238 17 p + 1210 17 p + 1239 17 p + 1243 17 p + 1242 17 p + 315 17 p + 306 17 p + 1238 16 p + 1210 16 p + 1239 16 p + 1240 16 p + 1236 16 p + 315 16 p + 305 16 p + 1240 15 p + 1239 15 p + 1236 15 p + 1235 15 p + 1255 15 p + 314 15 p + 315 15 p + 1241 14 p + 1213 14 p + 1242 14 p + 1167 14 p + 1245 14 p + 316 14 p + 307 14 p + 1241 13 p + 1213 13 p + 1242 13 p + 1243 13 p + 1238 13 p + 316 13 p + 306 13 p + 1243 12 p + 1242 12 p + 1238 12 p + 1166 12 p + 1234 12 p + 315 12 p + 316 12 p + 1244 11 p + 1216 11 p + 1245 11 p + 1083 11 p + 1247 11 p + 317 11 p + 308 11 p + 1244 10 p + 1216 10 p + 1245 10 p + 1167 10 p + 1241 10 p + 317 10 p + 307 10 p + 1246 9 p + 1219 9 p + 1247 9 p + 1040 9 p + 1249 9 p + 318 9 p + 309 9 p + 1246 8 p + 1219 8 p + 1247 8 p + 1083 8 p + 1244 8 p + 318 8 p + 308 8 p + 1248 7 p + 1222 7 p + 1249 7 p + 960 7 p + 1251 7 p + 319 7 p + 310 7 p + 1248 6 p + 1222 6 p + 1249 6 p + 1040 6 p + 1246 6 p + 319 6 p + 309 6 p + 1250 5 p + 1225 5 p + 1251 5 p + 848 5 p + 1254 5 p + 320 5 p + 311 5 p + 1250 4 p + 1225 4 p + 1251 4 p + 960 4 p + 1248 4 p + 320 4 p + 310 4 p + 1252 3 p + 1231 3 p + 1253 3 p + 321 3 p + 313 3 p + 1252 2 p + 1231 2 p + 1253 2 p + 1254 2 p + 1228 2 p + 321 2 p + 312 2 p + 1254 1 p + 1253 1 p + 1228 1 p + 1250 1 p + 848 1 p + 311 1 p + 321 1 p + 1235 0 p + 1240 0 p + 1255 0 p + 322 0 p + 314 0 p +showpage diff --git a/DOC/mat9.pdf b/DOC/mat9.pdf new file mode 100644 index 0000000..ca136b7 Binary files /dev/null and b/DOC/mat9.pdf differ diff --git a/DOC/mat9.ps b/DOC/mat9.ps new file mode 100644 index 0000000..0bae0f3 --- /dev/null +++ b/DOC/mat9.ps @@ -0,0 +1,7332 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: PSPLTM routine +%%BoundingBox: 100 50 510 500 +%%EndComments +/cm {72 mul 2.54 div} def +/mc {72 div 2.54 mul} def +/pnum { 72 div 2.54 mul 20 string +cvs print ( ) print} def +/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def +gsave + /Helvetica findfont 0.500000 cm scalefont setfont + 10.7950 cm 16.9700 cm moveto +(Assembled Matrix) Cshow + 3.81000 cm 2.00000 cm translate + 13.9700 cm 1081 div dup scale + 0.250000 setlinewidth +newpath + 0 0 moveto + 1081 0 lineto + 1081 1081 lineto + 0 1081 lineto +closepath stroke + 0.2 setlinewidth +1 1 translate +0.8 setlinewidth +/p {moveto 0 -.40 rmoveto + 0 .80 rlineto stroke} def + 0 1079 p + 801 1079 p + 802 1079 p + 825 1079 p + 827 1079 p + 1 1078 p + 501 1078 p + 500 1078 p + 603 1078 p + 2 1077 p + 352 1077 p + 351 1077 p + 398 1077 p + 3 1076 p + 599 1076 p + 600 1076 p + 626 1076 p + 629 1076 p + 4 1075 p + 288 1075 p + 287 1075 p + 290 1075 p + 1037 1075 p + 1039 1075 p + 5 1074 p + 287 1074 p + 286 1074 p + 293 1074 p + 292 1074 p + 1038 1074 p + 1043 1074 p + 6 1073 p + 292 1073 p + 291 1073 p + 297 1073 p + 296 1073 p + 1044 1073 p + 1046 1073 p + 7 1072 p + 296 1072 p + 295 1072 p + 301 1072 p + 300 1072 p + 1047 1072 p + 1052 1072 p + 8 1071 p + 300 1071 p + 299 1071 p + 305 1071 p + 304 1071 p + 1053 1071 p + 1058 1071 p + 9 1070 p + 304 1070 p + 303 1070 p + 309 1070 p + 308 1070 p + 1059 1070 p + 1061 1070 p + 10 1069 p + 308 1069 p + 307 1069 p + 313 1069 p + 312 1069 p + 1062 1069 p + 1065 1069 p + 11 1068 p + 312 1068 p + 311 1068 p + 317 1068 p + 316 1068 p + 1066 1068 p + 1070 1068 p + 12 1067 p + 316 1067 p + 315 1067 p + 321 1067 p + 320 1067 p + 1071 1067 p + 1075 1067 p + 13 1066 p + 320 1066 p + 319 1066 p + 325 1066 p + 324 1066 p + 1076 1066 p + 1079 1066 p + 14 1065 p + 324 1065 p + 323 1065 p + 330 1065 p + 331 1065 p + 933 1065 p + 993 1065 p + 15 1064 p + 327 1064 p + 329 1064 p + 331 1064 p + 932 1064 p + 16 1063 p + 329 1063 p + 328 1063 p + 333 1063 p + 335 1063 p + 901 1063 p + 927 1063 p + 17 1062 p + 335 1062 p + 334 1062 p + 338 1062 p + 339 1062 p + 341 1062 p + 776 1062 p + 777 1062 p + 18 1061 p + 341 1061 p + 340 1061 p + 343 1061 p + 345 1061 p + 650 1061 p + 669 1061 p + 710 1061 p + 19 1060 p + 345 1060 p + 344 1060 p + 347 1060 p + 349 1060 p + 502 1060 p + 552 1060 p + 20 1059 p + 349 1059 p + 348 1059 p + 354 1059 p + 356 1059 p + 404 1059 p + 499 1059 p + 21 1058 p + 356 1058 p + 355 1058 p + 403 1058 p + 22 1057 p + 289 1057 p + 290 1057 p + 358 1057 p + 23 1056 p + 286 1056 p + 288 1056 p + 289 1056 p + 294 1056 p + 357 1056 p + 360 1056 p + 24 1055 p + 291 1055 p + 293 1055 p + 294 1055 p + 298 1055 p + 359 1055 p + 363 1055 p + 25 1054 p + 295 1054 p + 297 1054 p + 298 1054 p + 302 1054 p + 362 1054 p + 366 1054 p + 26 1053 p + 299 1053 p + 301 1053 p + 302 1053 p + 306 1053 p + 365 1053 p + 369 1053 p + 27 1052 p + 303 1052 p + 305 1052 p + 306 1052 p + 310 1052 p + 368 1052 p + 372 1052 p + 28 1051 p + 307 1051 p + 309 1051 p + 310 1051 p + 314 1051 p + 371 1051 p + 375 1051 p + 29 1050 p + 311 1050 p + 313 1050 p + 314 1050 p + 318 1050 p + 374 1050 p + 378 1050 p + 30 1049 p + 315 1049 p + 317 1049 p + 318 1049 p + 322 1049 p + 377 1049 p + 381 1049 p + 31 1048 p + 319 1048 p + 321 1048 p + 322 1048 p + 326 1048 p + 380 1048 p + 384 1048 p + 32 1047 p + 323 1047 p + 325 1047 p + 326 1047 p + 332 1047 p + 383 1047 p + 387 1047 p + 33 1046 p + 328 1046 p + 327 1046 p + 330 1046 p + 332 1046 p + 336 1046 p + 386 1046 p + 390 1046 p + 34 1045 p + 334 1045 p + 333 1045 p + 336 1045 p + 337 1045 p + 389 1045 p + 393 1045 p + 35 1044 p + 338 1044 p + 337 1044 p + 342 1044 p + 392 1044 p + 396 1044 p + 36 1043 p + 340 1043 p + 339 1043 p + 342 1043 p + 346 1043 p + 395 1043 p + 401 1043 p + 37 1042 p + 344 1042 p + 343 1042 p + 346 1042 p + 350 1042 p + 400 1042 p + 38 1041 p + 348 1041 p + 347 1041 p + 350 1041 p + 351 1041 p + 353 1041 p + 399 1041 p + 39 1040 p + 353 1040 p + 352 1040 p + 355 1040 p + 354 1040 p + 40 1039 p + 357 1039 p + 358 1039 p + 361 1039 p + 406 1039 p + 408 1039 p + 41 1038 p + 359 1038 p + 360 1038 p + 361 1038 p + 364 1038 p + 405 1038 p + 410 1038 p + 42 1037 p + 362 1037 p + 363 1037 p + 364 1037 p + 367 1037 p + 409 1037 p + 413 1037 p + 43 1036 p + 365 1036 p + 366 1036 p + 367 1036 p + 370 1036 p + 412 1036 p + 416 1036 p + 44 1035 p + 368 1035 p + 369 1035 p + 370 1035 p + 373 1035 p + 415 1035 p + 419 1035 p + 45 1034 p + 371 1034 p + 372 1034 p + 373 1034 p + 376 1034 p + 418 1034 p + 423 1034 p + 46 1033 p + 374 1033 p + 375 1033 p + 376 1033 p + 379 1033 p + 422 1033 p + 47 1032 p + 377 1032 p + 378 1032 p + 379 1032 p + 382 1032 p + 421 1032 p + 426 1032 p + 428 1032 p + 48 1031 p + 380 1031 p + 381 1031 p + 382 1031 p + 385 1031 p + 427 1031 p + 431 1031 p + 49 1030 p + 383 1030 p + 384 1030 p + 385 1030 p + 388 1030 p + 430 1030 p + 434 1030 p + 50 1029 p + 386 1029 p + 387 1029 p + 388 1029 p + 391 1029 p + 433 1029 p + 51 1028 p + 389 1028 p + 390 1028 p + 391 1028 p + 394 1028 p + 436 1028 p + 440 1028 p + 52 1027 p + 392 1027 p + 393 1027 p + 394 1027 p + 397 1027 p + 438 1027 p + 53 1026 p + 395 1026 p + 396 1026 p + 397 1026 p + 402 1026 p + 437 1026 p + 54 1025 p + 398 1025 p + 399 1025 p + 400 1025 p + 401 1025 p + 402 1025 p + 439 1025 p + 55 1024 p + 407 1024 p + 408 1024 p + 443 1024 p + 445 1024 p + 56 1023 p + 405 1023 p + 406 1023 p + 407 1023 p + 411 1023 p + 442 1023 p + 447 1023 p + 57 1022 p + 409 1022 p + 410 1022 p + 411 1022 p + 414 1022 p + 446 1022 p + 450 1022 p + 58 1021 p + 412 1021 p + 413 1021 p + 414 1021 p + 417 1021 p + 449 1021 p + 453 1021 p + 59 1020 p + 415 1020 p + 416 1020 p + 417 1020 p + 420 1020 p + 452 1020 p + 456 1020 p + 60 1019 p + 418 1019 p + 419 1019 p + 420 1019 p + 424 1019 p + 455 1019 p + 460 1019 p + 61 1018 p + 421 1018 p + 422 1018 p + 423 1018 p + 424 1018 p + 425 1018 p + 459 1018 p + 62 1017 p + 426 1017 p + 425 1017 p + 429 1017 p + 458 1017 p + 463 1017 p + 63 1016 p + 427 1016 p + 428 1016 p + 429 1016 p + 432 1016 p + 462 1016 p + 466 1016 p + 64 1015 p + 430 1015 p + 431 1015 p + 432 1015 p + 435 1015 p + 465 1015 p + 469 1015 p + 65 1014 p + 433 1014 p + 434 1014 p + 435 1014 p + 436 1014 p + 441 1014 p + 468 1014 p + 66 1013 p + 437 1013 p + 438 1013 p + 439 1013 p + 440 1013 p + 441 1013 p + 471 1013 p + 67 1012 p + 444 1012 p + 445 1012 p + 473 1012 p + 475 1012 p + 68 1011 p + 442 1011 p + 443 1011 p + 444 1011 p + 448 1011 p + 472 1011 p + 69 1010 p + 446 1010 p + 447 1010 p + 448 1010 p + 451 1010 p + 476 1010 p + 478 1010 p + 481 1010 p + 70 1009 p + 449 1009 p + 450 1009 p + 451 1009 p + 454 1009 p + 480 1009 p + 71 1008 p + 452 1008 p + 453 1008 p + 454 1008 p + 457 1008 p + 479 1008 p + 484 1008 p + 72 1007 p + 455 1007 p + 456 1007 p + 457 1007 p + 461 1007 p + 483 1007 p + 487 1007 p + 73 1006 p + 458 1006 p + 459 1006 p + 460 1006 p + 461 1006 p + 464 1006 p + 486 1006 p + 490 1006 p + 493 1006 p + 74 1005 p + 462 1005 p + 463 1005 p + 464 1005 p + 467 1005 p + 492 1005 p + 75 1004 p + 465 1004 p + 466 1004 p + 467 1004 p + 470 1004 p + 491 1004 p + 495 1004 p + 76 1003 p + 468 1003 p + 469 1003 p + 470 1003 p + 471 1003 p + 497 1003 p + 77 1002 p + 474 1002 p + 475 1002 p + 504 1002 p + 506 1002 p + 78 1001 p + 472 1001 p + 473 1001 p + 474 1001 p + 476 1001 p + 477 1001 p + 503 1001 p + 79 1000 p + 478 1000 p + 477 1000 p + 482 1000 p + 507 1000 p + 509 1000 p + 80 999 p + 479 999 p + 480 999 p + 481 999 p + 482 999 p + 485 999 p + 508 999 p + 512 999 p + 81 998 p + 483 998 p + 484 998 p + 485 998 p + 488 998 p + 511 998 p + 515 998 p + 517 998 p + 82 997 p + 486 997 p + 487 997 p + 488 997 p + 489 997 p + 516 997 p + 520 997 p + 83 996 p + 490 996 p + 489 996 p + 494 996 p + 519 996 p + 524 996 p + 84 995 p + 491 995 p + 492 995 p + 493 995 p + 494 995 p + 496 995 p + 523 995 p + 85 994 p + 495 994 p + 496 994 p + 497 994 p + 522 994 p + 526 994 p + 86 993 p + 505 993 p + 506 993 p + 529 993 p + 87 992 p + 503 992 p + 504 992 p + 505 992 p + 507 992 p + 510 992 p + 528 992 p + 531 992 p + 88 991 p + 508 991 p + 509 991 p + 510 991 p + 513 991 p + 530 991 p + 534 991 p + 89 990 p + 511 990 p + 512 990 p + 513 990 p + 514 990 p + 533 990 p + 537 990 p + 539 990 p + 90 989 p + 515 989 p + 514 989 p + 518 989 p + 538 989 p + 542 989 p + 91 988 p + 516 988 p + 517 988 p + 518 988 p + 521 988 p + 541 988 p + 546 988 p + 92 987 p + 519 987 p + 520 987 p + 521 987 p + 525 987 p + 545 987 p + 93 986 p + 522 986 p + 523 986 p + 524 986 p + 525 986 p + 527 986 p + 544 986 p + 549 986 p + 94 985 p + 526 985 p + 527 985 p + 548 985 p + 95 984 p + 528 984 p + 529 984 p + 532 984 p + 554 984 p + 556 984 p + 96 983 p + 530 983 p + 531 983 p + 532 983 p + 535 983 p + 553 983 p + 558 983 p + 97 982 p + 533 982 p + 534 982 p + 535 982 p + 536 982 p + 557 982 p + 561 982 p + 98 981 p + 537 981 p + 536 981 p + 540 981 p + 560 981 p + 565 981 p + 99 980 p + 538 980 p + 539 980 p + 540 980 p + 543 980 p + 564 980 p + 100 979 p + 541 979 p + 542 979 p + 543 979 p + 547 979 p + 563 979 p + 568 979 p + 101 978 p + 544 978 p + 545 978 p + 546 978 p + 547 978 p + 550 978 p + 567 978 p + 571 978 p + 102 977 p + 548 977 p + 549 977 p + 550 977 p + 570 977 p + 573 977 p + 103 976 p + 555 976 p + 556 976 p + 576 976 p + 104 975 p + 553 975 p + 554 975 p + 555 975 p + 559 975 p + 575 975 p + 578 975 p + 105 974 p + 557 974 p + 558 974 p + 559 974 p + 562 974 p + 577 974 p + 581 974 p + 106 973 p + 560 973 p + 561 973 p + 562 973 p + 566 973 p + 580 973 p + 584 973 p + 107 972 p + 563 972 p + 564 972 p + 565 972 p + 566 972 p + 569 972 p + 583 972 p + 587 972 p + 108 971 p + 567 971 p + 568 971 p + 569 971 p + 572 971 p + 586 971 p + 590 971 p + 592 971 p + 109 970 p + 570 970 p + 571 970 p + 572 970 p + 574 970 p + 591 970 p + 595 970 p + 110 969 p + 573 969 p + 574 969 p + 594 969 p + 597 969 p + 111 968 p + 575 968 p + 576 968 p + 579 968 p + 605 968 p + 607 968 p + 112 967 p + 577 967 p + 578 967 p + 579 967 p + 582 967 p + 604 967 p + 609 967 p + 113 966 p + 580 966 p + 581 966 p + 582 966 p + 585 966 p + 608 966 p + 612 966 p + 114 965 p + 583 965 p + 584 965 p + 585 965 p + 588 965 p + 611 965 p + 615 965 p + 115 964 p + 586 964 p + 587 964 p + 588 964 p + 589 964 p + 614 964 p + 619 964 p + 116 963 p + 590 963 p + 589 963 p + 593 963 p + 618 963 p + 117 962 p + 591 962 p + 592 962 p + 593 962 p + 596 962 p + 617 962 p + 622 962 p + 118 961 p + 594 961 p + 595 961 p + 596 961 p + 598 961 p + 600 961 p + 621 961 p + 624 961 p + 119 960 p + 597 960 p + 598 960 p + 599 960 p + 120 959 p + 606 959 p + 607 959 p + 631 959 p + 121 958 p + 604 958 p + 605 958 p + 606 958 p + 610 958 p + 630 958 p + 633 958 p + 122 957 p + 608 957 p + 609 957 p + 610 957 p + 613 957 p + 632 957 p + 636 957 p + 638 957 p + 123 956 p + 611 956 p + 612 956 p + 613 956 p + 616 956 p + 637 956 p + 641 956 p + 124 955 p + 614 955 p + 615 955 p + 616 955 p + 620 955 p + 640 955 p + 645 955 p + 125 954 p + 617 954 p + 618 954 p + 619 954 p + 620 954 p + 623 954 p + 644 954 p + 126 953 p + 621 953 p + 622 953 p + 623 953 p + 625 953 p + 628 953 p + 643 953 p + 647 953 p + 127 952 p + 624 952 p + 625 952 p + 626 952 p + 627 952 p + 128 951 p + 627 951 p + 628 951 p + 629 951 p + 649 951 p + 129 950 p + 630 950 p + 631 950 p + 634 950 p + 652 950 p + 654 950 p + 130 949 p + 632 949 p + 633 949 p + 634 949 p + 635 949 p + 651 949 p + 656 949 p + 131 948 p + 636 948 p + 635 948 p + 639 948 p + 655 948 p + 660 948 p + 132 947 p + 637 947 p + 638 947 p + 639 947 p + 642 947 p + 659 947 p + 133 946 p + 640 946 p + 641 946 p + 642 946 p + 646 946 p + 658 946 p + 663 946 p + 134 945 p + 643 945 p + 644 945 p + 645 945 p + 646 945 p + 648 945 p + 662 945 p + 665 945 p + 135 944 p + 647 944 p + 648 944 p + 649 944 p + 667 944 p + 136 943 p + 653 943 p + 654 943 p + 671 943 p + 137 942 p + 651 942 p + 652 942 p + 653 942 p + 657 942 p + 670 942 p + 673 942 p + 138 941 p + 655 941 p + 656 941 p + 657 941 p + 661 941 p + 672 941 p + 676 941 p + 139 940 p + 658 940 p + 659 940 p + 660 940 p + 661 940 p + 664 940 p + 675 940 p + 679 940 p + 140 939 p + 662 939 p + 663 939 p + 664 939 p + 666 939 p + 678 939 p + 681 939 p + 141 938 p + 665 938 p + 666 938 p + 667 938 p + 683 938 p + 142 937 p + 670 937 p + 671 937 p + 674 937 p + 685 937 p + 687 937 p + 143 936 p + 672 936 p + 673 936 p + 674 936 p + 677 936 p + 684 936 p + 144 935 p + 675 935 p + 676 935 p + 677 935 p + 680 935 p + 688 935 p + 690 935 p + 693 935 p + 145 934 p + 678 934 p + 679 934 p + 680 934 p + 682 934 p + 692 934 p + 146 933 p + 681 933 p + 682 933 p + 683 933 p + 691 933 p + 695 933 p + 147 932 p + 686 932 p + 687 932 p + 698 932 p + 148 931 p + 684 931 p + 685 931 p + 686 931 p + 688 931 p + 689 931 p + 697 931 p + 700 931 p + 149 930 p + 690 930 p + 689 930 p + 694 930 p + 699 930 p + 703 930 p + 150 929 p + 691 929 p + 692 929 p + 693 929 p + 694 929 p + 696 929 p + 702 929 p + 705 929 p + 151 928 p + 695 928 p + 696 928 p + 707 928 p + 152 927 p + 697 927 p + 698 927 p + 701 927 p + 714 927 p + 153 926 p + 699 926 p + 700 926 p + 701 926 p + 704 926 p + 713 926 p + 716 926 p + 154 925 p + 702 925 p + 703 925 p + 704 925 p + 706 925 p + 715 925 p + 719 925 p + 721 925 p + 155 924 p + 705 924 p + 706 924 p + 707 924 p + 720 924 p + 723 924 p + 156 923 p + 713 923 p + 714 923 p + 717 923 p + 726 923 p + 157 922 p + 715 922 p + 716 922 p + 717 922 p + 718 922 p + 725 922 p + 728 922 p + 730 922 p + 158 921 p + 719 921 p + 718 921 p + 722 921 p + 729 921 p + 733 921 p + 159 920 p + 720 920 p + 721 920 p + 722 920 p + 724 920 p + 732 920 p + 736 920 p + 160 919 p + 723 919 p + 724 919 p + 735 919 p + 161 918 p + 725 918 p + 726 918 p + 727 918 p + 739 918 p + 162 917 p + 728 917 p + 727 917 p + 731 917 p + 738 917 p + 741 917 p + 163 916 p + 729 916 p + 730 916 p + 731 916 p + 734 916 p + 740 916 p + 744 916 p + 164 915 p + 732 915 p + 733 915 p + 734 915 p + 737 915 p + 743 915 p + 747 915 p + 749 915 p + 165 914 p + 735 914 p + 736 914 p + 737 914 p + 748 914 p + 751 914 p + 166 913 p + 738 913 p + 739 913 p + 742 913 p + 758 913 p + 760 913 p + 167 912 p + 740 912 p + 741 912 p + 742 912 p + 745 912 p + 759 912 p + 763 912 p + 168 911 p + 743 911 p + 744 911 p + 745 911 p + 746 911 p + 762 911 p + 766 911 p + 169 910 p + 747 910 p + 746 910 p + 750 910 p + 765 910 p + 769 910 p + 170 909 p + 748 909 p + 749 909 p + 750 909 p + 752 909 p + 768 909 p + 772 909 p + 171 908 p + 751 908 p + 752 908 p + 771 908 p + 774 908 p + 172 907 p + 761 907 p + 760 907 p + 778 907 p + 173 906 p + 759 906 p + 758 906 p + 761 906 p + 764 906 p + 779 906 p + 780 906 p + 174 905 p + 762 905 p + 763 905 p + 764 905 p + 767 905 p + 781 905 p + 783 905 p + 175 904 p + 765 904 p + 766 904 p + 767 904 p + 770 904 p + 784 904 p + 787 904 p + 176 903 p + 768 903 p + 769 903 p + 770 903 p + 773 903 p + 786 903 p + 790 903 p + 177 902 p + 771 902 p + 772 902 p + 773 902 p + 775 902 p + 789 902 p + 793 902 p + 795 902 p + 178 901 p + 774 901 p + 775 901 p + 794 901 p + 797 901 p + 179 900 p + 779 900 p + 778 900 p + 782 900 p + 803 900 p + 180 899 p + 781 899 p + 780 899 p + 782 899 p + 785 899 p + 804 899 p + 805 899 p + 181 898 p + 784 898 p + 783 898 p + 785 898 p + 788 898 p + 806 898 p + 808 898 p + 182 897 p + 786 897 p + 787 897 p + 788 897 p + 791 897 p + 809 897 p + 811 897 p + 183 896 p + 789 896 p + 790 896 p + 791 896 p + 792 896 p + 812 896 p + 814 896 p + 184 895 p + 793 895 p + 792 895 p + 796 895 p + 815 895 p + 817 895 p + 185 894 p + 794 894 p + 795 894 p + 796 894 p + 798 894 p + 800 894 p + 818 894 p + 820 894 p + 186 893 p + 799 893 p + 800 893 p + 802 893 p + 821 893 p + 823 893 p + 187 892 p + 797 892 p + 798 892 p + 799 892 p + 801 892 p + 188 891 p + 804 891 p + 803 891 p + 807 891 p + 831 891 p + 833 891 p + 189 890 p + 806 890 p + 805 890 p + 807 890 p + 810 890 p + 832 890 p + 835 890 p + 190 889 p + 809 889 p + 808 889 p + 810 889 p + 813 889 p + 836 889 p + 838 889 p + 191 888 p + 812 888 p + 811 888 p + 813 888 p + 816 888 p + 839 888 p + 841 888 p + 192 887 p + 815 887 p + 814 887 p + 816 887 p + 819 887 p + 842 887 p + 844 887 p + 193 886 p + 818 886 p + 817 886 p + 819 886 p + 822 886 p + 845 886 p + 849 886 p + 194 885 p + 821 885 p + 820 885 p + 822 885 p + 824 885 p + 847 885 p + 195 884 p + 823 884 p + 824 884 p + 825 884 p + 826 884 p + 848 884 p + 852 884 p + 196 883 p + 827 883 p + 826 883 p + 851 883 p + 197 882 p + 834 882 p + 833 882 p + 854 882 p + 198 881 p + 832 881 p + 831 881 p + 834 881 p + 837 881 p + 855 881 p + 856 881 p + 199 880 p + 836 880 p + 835 880 p + 837 880 p + 840 880 p + 857 880 p + 859 880 p + 200 879 p + 839 879 p + 838 879 p + 840 879 p + 843 879 p + 860 879 p + 862 879 p + 201 878 p + 842 878 p + 841 878 p + 843 878 p + 846 878 p + 863 878 p + 865 878 p + 202 877 p + 845 877 p + 844 877 p + 846 877 p + 850 877 p + 866 877 p + 869 877 p + 870 877 p + 203 876 p + 848 876 p + 847 876 p + 849 876 p + 850 876 p + 853 876 p + 871 876 p + 204 875 p + 851 875 p + 852 875 p + 853 875 p + 873 875 p + 875 875 p + 205 874 p + 855 874 p + 854 874 p + 858 874 p + 876 874 p + 206 873 p + 857 873 p + 856 873 p + 858 873 p + 861 873 p + 877 873 p + 878 873 p + 207 872 p + 860 872 p + 859 872 p + 861 872 p + 864 872 p + 879 872 p + 881 872 p + 208 871 p + 863 871 p + 862 871 p + 864 871 p + 867 871 p + 882 871 p + 884 871 p + 209 870 p + 866 870 p + 865 870 p + 867 870 p + 868 870 p + 885 870 p + 887 870 p + 210 869 p + 869 869 p + 868 869 p + 872 869 p + 888 869 p + 890 869 p + 211 868 p + 871 868 p + 870 868 p + 872 868 p + 873 868 p + 874 868 p + 891 868 p + 894 868 p + 895 868 p + 212 867 p + 875 867 p + 874 867 p + 896 867 p + 899 867 p + 213 866 p + 877 866 p + 876 866 p + 880 866 p + 902 866 p + 904 866 p + 214 865 p + 879 865 p + 878 865 p + 880 865 p + 883 865 p + 903 865 p + 906 865 p + 215 864 p + 882 864 p + 881 864 p + 883 864 p + 886 864 p + 907 864 p + 909 864 p + 216 863 p + 885 863 p + 884 863 p + 886 863 p + 889 863 p + 910 863 p + 912 863 p + 217 862 p + 888 862 p + 887 862 p + 889 862 p + 892 862 p + 913 862 p + 915 862 p + 218 861 p + 891 861 p + 890 861 p + 892 861 p + 893 861 p + 916 861 p + 918 861 p + 219 860 p + 894 860 p + 893 860 p + 897 860 p + 919 860 p + 921 860 p + 220 859 p + 896 859 p + 895 859 p + 897 859 p + 898 859 p + 922 859 p + 924 859 p + 221 858 p + 899 858 p + 898 858 p + 925 858 p + 222 857 p + 905 857 p + 904 857 p + 934 857 p + 936 857 p + 223 856 p + 903 856 p + 902 856 p + 905 856 p + 908 856 p + 935 856 p + 224 855 p + 907 855 p + 906 855 p + 908 855 p + 911 855 p + 938 855 p + 939 855 p + 225 854 p + 910 854 p + 909 854 p + 911 854 p + 914 854 p + 940 854 p + 942 854 p + 226 853 p + 913 853 p + 912 853 p + 914 853 p + 917 853 p + 943 853 p + 945 853 p + 227 852 p + 916 852 p + 915 852 p + 917 852 p + 920 852 p + 946 852 p + 948 852 p + 228 851 p + 919 851 p + 918 851 p + 920 851 p + 923 851 p + 949 851 p + 951 851 p + 229 850 p + 922 850 p + 921 850 p + 923 850 p + 926 850 p + 952 850 p + 955 850 p + 956 850 p + 230 849 p + 925 849 p + 924 849 p + 926 849 p + 957 849 p + 960 849 p + 231 848 p + 937 848 p + 936 848 p + 961 848 p + 232 847 p + 935 847 p + 934 847 p + 937 847 p + 938 847 p + 941 847 p + 962 847 p + 963 847 p + 233 846 p + 940 846 p + 939 846 p + 941 846 p + 944 846 p + 964 846 p + 967 846 p + 970 846 p + 234 845 p + 943 845 p + 942 845 p + 944 845 p + 947 845 p + 968 845 p + 235 844 p + 946 844 p + 945 844 p + 947 844 p + 950 844 p + 969 844 p + 972 844 p + 236 843 p + 949 843 p + 948 843 p + 950 843 p + 953 843 p + 973 843 p + 975 843 p + 237 842 p + 952 842 p + 951 842 p + 953 842 p + 954 842 p + 976 842 p + 978 842 p + 238 841 p + 955 841 p + 954 841 p + 958 841 p + 979 841 p + 981 841 p + 239 840 p + 957 840 p + 956 840 p + 958 840 p + 959 840 p + 982 840 p + 985 840 p + 987 840 p + 240 839 p + 960 839 p + 959 839 p + 986 839 p + 990 839 p + 992 839 p + 241 838 p + 962 838 p + 961 838 p + 965 838 p + 997 838 p + 242 837 p + 964 837 p + 963 837 p + 965 837 p + 966 837 p + 998 837 p + 999 837 p + 243 836 p + 967 836 p + 966 836 p + 971 836 p + 1000 836 p + 1002 836 p + 244 835 p + 969 835 p + 968 835 p + 970 835 p + 971 835 p + 974 835 p + 1003 835 p + 1006 835 p + 1007 835 p + 245 834 p + 973 834 p + 972 834 p + 974 834 p + 977 834 p + 1008 834 p + 1010 834 p + 246 833 p + 976 833 p + 975 833 p + 977 833 p + 980 833 p + 1011 833 p + 1013 833 p + 247 832 p + 979 832 p + 978 832 p + 980 832 p + 983 832 p + 1014 832 p + 1016 832 p + 248 831 p + 982 831 p + 981 831 p + 983 831 p + 984 831 p + 1017 831 p + 1019 831 p + 249 830 p + 985 830 p + 984 830 p + 988 830 p + 1020 830 p + 1022 830 p + 250 829 p + 986 829 p + 987 829 p + 988 829 p + 989 829 p + 1023 829 p + 1026 829 p + 251 828 p + 990 828 p + 989 828 p + 991 828 p + 1025 828 p + 1029 828 p + 252 827 p + 992 827 p + 991 827 p + 1028 827 p + 1030 827 p + 1031 827 p + 1032 827 p + 253 826 p + 998 826 p + 997 826 p + 1001 826 p + 1033 826 p + 254 825 p + 1000 825 p + 999 825 p + 1001 825 p + 1004 825 p + 1034 825 p + 1035 825 p + 255 824 p + 1003 824 p + 1002 824 p + 1004 824 p + 1005 824 p + 1036 824 p + 1041 824 p + 256 823 p + 1006 823 p + 1005 823 p + 1009 823 p + 1042 823 p + 1049 823 p + 1055 823 p + 257 822 p + 1008 822 p + 1007 822 p + 1009 822 p + 1012 822 p + 1050 822 p + 258 821 p + 1011 821 p + 1010 821 p + 1012 821 p + 1015 821 p + 1051 821 p + 1056 821 p + 259 820 p + 1014 820 p + 1013 820 p + 1015 820 p + 1018 820 p + 1057 820 p + 1064 820 p + 1068 820 p + 260 819 p + 1017 819 p + 1016 819 p + 1018 819 p + 1021 819 p + 1069 819 p + 1073 819 p + 261 818 p + 1020 818 p + 1019 818 p + 1021 818 p + 1024 818 p + 1074 818 p + 1078 818 p + 262 817 p + 996 817 p + 995 817 p + 1023 817 p + 1022 817 p + 1024 817 p + 1027 817 p + 263 816 p + 930 816 p + 929 816 p + 931 816 p + 1025 816 p + 1026 816 p + 1027 816 p + 264 815 p + 830 815 p + 829 815 p + 900 815 p + 931 815 p + 1028 815 p + 1029 815 p + 265 814 p + 756 814 p + 755 814 p + 757 814 p + 900 814 p + 1030 814 p + 266 813 p + 712 813 p + 711 813 p + 753 813 p + 757 813 p + 1031 813 p + 267 812 p + 601 812 p + 602 812 p + 603 812 p + 708 812 p + 753 812 p + 1032 812 p + 268 811 p + 1034 811 p + 1033 811 p + 1039 811 p + 1040 811 p + 269 810 p + 1036 810 p + 1035 810 p + 1037 810 p + 1038 810 p + 1040 810 p + 1045 810 p + 270 809 p + 1042 809 p + 1041 809 p + 1043 809 p + 1044 809 p + 1045 809 p + 1048 809 p + 271 808 p + 1046 808 p + 1047 808 p + 1048 808 p + 1049 808 p + 1054 808 p + 272 807 p + 1051 807 p + 1050 807 p + 1052 807 p + 1053 807 p + 1054 807 p + 1055 807 p + 1060 807 p + 273 806 p + 1057 806 p + 1056 806 p + 1058 806 p + 1059 806 p + 1060 806 p + 1063 806 p + 274 805 p + 1061 805 p + 1062 805 p + 1063 805 p + 1064 805 p + 1067 805 p + 275 804 p + 1065 804 p + 1066 804 p + 1067 804 p + 1069 804 p + 1068 804 p + 1072 804 p + 276 803 p + 1070 803 p + 1071 803 p + 1072 803 p + 1074 803 p + 1073 803 p + 1077 803 p + 277 802 p + 994 802 p + 996 802 p + 1075 802 p + 1076 802 p + 1077 802 p + 1078 802 p + 278 801 p + 928 801 p + 930 801 p + 993 801 p + 995 801 p + 994 801 p + 1079 801 p + 279 800 p + 828 800 p + 830 800 p + 927 800 p + 929 800 p + 928 800 p + 933 800 p + 932 800 p + 280 799 p + 754 799 p + 756 799 p + 777 799 p + 829 799 p + 828 799 p + 901 799 p + 281 798 p + 710 798 p + 709 798 p + 712 798 p + 755 798 p + 754 798 p + 776 798 p + 282 797 p + 669 797 p + 668 797 p + 708 797 p + 709 797 p + 711 797 p + 283 796 p + 552 796 p + 551 796 p + 601 796 p + 650 796 p + 668 796 p + 284 795 p + 499 795 p + 498 795 p + 501 795 p + 502 795 p + 551 795 p + 602 795 p + 285 794 p + 404 794 p + 403 794 p + 498 794 p + 500 794 p + 286 793 p + 287 793 p + 288 793 p + 294 793 p + 293 793 p + 23 793 p + 5 793 p + 286 792 p + 287 792 p + 288 792 p + 1037 792 p + 1038 792 p + 5 792 p + 4 792 p + 286 791 p + 287 791 p + 288 791 p + 289 791 p + 290 791 p + 23 791 p + 4 791 p + 289 790 p + 288 790 p + 290 790 p + 357 790 p + 358 790 p + 22 790 p + 23 790 p + 289 789 p + 288 789 p + 290 789 p + 22 789 p + 4 789 p + 291 788 p + 292 788 p + 293 788 p + 298 788 p + 297 788 p + 24 788 p + 6 788 p + 291 787 p + 292 787 p + 293 787 p + 1043 787 p + 1044 787 p + 6 787 p + 5 787 p + 291 786 p + 292 786 p + 293 786 p + 294 786 p + 286 786 p + 24 786 p + 5 786 p + 294 785 p + 293 785 p + 286 785 p + 359 785 p + 360 785 p + 23 785 p + 24 785 p + 295 784 p + 296 784 p + 297 784 p + 302 784 p + 301 784 p + 25 784 p + 7 784 p + 295 783 p + 296 783 p + 297 783 p + 1046 783 p + 1047 783 p + 7 783 p + 6 783 p + 295 782 p + 296 782 p + 297 782 p + 298 782 p + 291 782 p + 25 782 p + 6 782 p + 298 781 p + 297 781 p + 291 781 p + 362 781 p + 363 781 p + 24 781 p + 25 781 p + 299 780 p + 300 780 p + 301 780 p + 306 780 p + 305 780 p + 26 780 p + 8 780 p + 299 779 p + 300 779 p + 301 779 p + 1052 779 p + 1053 779 p + 8 779 p + 7 779 p + 299 778 p + 300 778 p + 301 778 p + 302 778 p + 295 778 p + 26 778 p + 7 778 p + 302 777 p + 301 777 p + 295 777 p + 365 777 p + 366 777 p + 25 777 p + 26 777 p + 303 776 p + 304 776 p + 305 776 p + 310 776 p + 309 776 p + 27 776 p + 9 776 p + 303 775 p + 304 775 p + 305 775 p + 1058 775 p + 1059 775 p + 9 775 p + 8 775 p + 303 774 p + 304 774 p + 305 774 p + 306 774 p + 299 774 p + 27 774 p + 8 774 p + 306 773 p + 305 773 p + 299 773 p + 368 773 p + 369 773 p + 26 773 p + 27 773 p + 307 772 p + 308 772 p + 309 772 p + 314 772 p + 313 772 p + 28 772 p + 10 772 p + 307 771 p + 308 771 p + 309 771 p + 1061 771 p + 1062 771 p + 10 771 p + 9 771 p + 307 770 p + 308 770 p + 309 770 p + 310 770 p + 303 770 p + 28 770 p + 9 770 p + 310 769 p + 309 769 p + 303 769 p + 371 769 p + 372 769 p + 27 769 p + 28 769 p + 311 768 p + 312 768 p + 313 768 p + 318 768 p + 317 768 p + 29 768 p + 11 768 p + 311 767 p + 312 767 p + 313 767 p + 1065 767 p + 1066 767 p + 11 767 p + 10 767 p + 311 766 p + 312 766 p + 313 766 p + 314 766 p + 307 766 p + 29 766 p + 10 766 p + 314 765 p + 313 765 p + 307 765 p + 374 765 p + 375 765 p + 28 765 p + 29 765 p + 315 764 p + 316 764 p + 317 764 p + 322 764 p + 321 764 p + 30 764 p + 12 764 p + 315 763 p + 316 763 p + 317 763 p + 1070 763 p + 1071 763 p + 12 763 p + 11 763 p + 315 762 p + 316 762 p + 317 762 p + 318 762 p + 311 762 p + 30 762 p + 11 762 p + 318 761 p + 317 761 p + 311 761 p + 377 761 p + 378 761 p + 29 761 p + 30 761 p + 319 760 p + 320 760 p + 321 760 p + 326 760 p + 325 760 p + 31 760 p + 13 760 p + 319 759 p + 320 759 p + 321 759 p + 1075 759 p + 1076 759 p + 13 759 p + 12 759 p + 319 758 p + 320 758 p + 321 758 p + 322 758 p + 315 758 p + 31 758 p + 12 758 p + 322 757 p + 321 757 p + 315 757 p + 380 757 p + 381 757 p + 30 757 p + 31 757 p + 323 756 p + 324 756 p + 325 756 p + 332 756 p + 330 756 p + 32 756 p + 14 756 p + 323 755 p + 324 755 p + 325 755 p + 1079 755 p + 993 755 p + 14 755 p + 13 755 p + 323 754 p + 324 754 p + 325 754 p + 326 754 p + 319 754 p + 32 754 p + 13 754 p + 326 753 p + 325 753 p + 319 753 p + 383 753 p + 384 753 p + 31 753 p + 32 753 p + 327 752 p + 328 752 p + 329 752 p + 330 752 p + 331 752 p + 15 752 p + 33 752 p + 327 751 p + 328 751 p + 329 751 p + 336 751 p + 333 751 p + 33 751 p + 16 751 p + 327 750 p + 328 750 p + 329 750 p + 927 750 p + 932 750 p + 15 750 p + 16 750 p + 330 749 p + 327 749 p + 331 749 p + 323 749 p + 332 749 p + 14 749 p + 33 749 p + 330 748 p + 327 748 p + 331 748 p + 932 748 p + 933 748 p + 14 748 p + 15 748 p + 323 747 p + 332 747 p + 330 747 p + 386 747 p + 387 747 p + 32 747 p + 33 747 p + 333 746 p + 334 746 p + 335 746 p + 328 746 p + 336 746 p + 16 746 p + 34 746 p + 333 745 p + 334 745 p + 335 745 p + 337 745 p + 338 745 p + 34 745 p + 17 745 p + 333 744 p + 334 744 p + 335 744 p + 777 744 p + 901 744 p + 16 744 p + 17 744 p + 328 743 p + 336 743 p + 333 743 p + 389 743 p + 390 743 p + 33 743 p + 34 743 p + 334 742 p + 337 742 p + 338 742 p + 392 742 p + 393 742 p + 34 742 p + 35 742 p + 334 741 p + 337 741 p + 338 741 p + 342 741 p + 339 741 p + 17 741 p + 35 741 p + 339 740 p + 340 740 p + 341 740 p + 338 740 p + 342 740 p + 17 740 p + 36 740 p + 339 739 p + 340 739 p + 341 739 p + 346 739 p + 343 739 p + 36 739 p + 18 739 p + 339 738 p + 340 738 p + 341 738 p + 710 738 p + 776 738 p + 17 738 p + 18 738 p + 338 737 p + 342 737 p + 339 737 p + 395 737 p + 396 737 p + 35 737 p + 36 737 p + 343 736 p + 344 736 p + 345 736 p + 340 736 p + 346 736 p + 18 736 p + 37 736 p + 343 735 p + 344 735 p + 345 735 p + 350 735 p + 347 735 p + 37 735 p + 19 735 p + 343 734 p + 344 734 p + 345 734 p + 552 734 p + 650 734 p + 18 734 p + 19 734 p + 340 733 p + 346 733 p + 343 733 p + 401 733 p + 400 733 p + 36 733 p + 37 733 p + 347 732 p + 348 732 p + 349 732 p + 344 732 p + 350 732 p + 19 732 p + 38 732 p + 347 731 p + 348 731 p + 349 731 p + 353 731 p + 354 731 p + 38 731 p + 20 731 p + 347 730 p + 348 730 p + 349 730 p + 499 730 p + 502 730 p + 19 730 p + 20 730 p + 344 729 p + 350 729 p + 347 729 p + 400 729 p + 399 729 p + 37 729 p + 38 729 p + 351 728 p + 352 728 p + 353 728 p + 398 728 p + 399 728 p + 38 728 p + 2 728 p + 351 727 p + 352 727 p + 353 727 p + 2 727 p + 39 727 p + 351 726 p + 352 726 p + 353 726 p + 348 726 p + 354 726 p + 38 726 p + 39 726 p + 354 725 p + 355 725 p + 356 725 p + 348 725 p + 353 725 p + 20 725 p + 39 725 p + 354 724 p + 355 724 p + 356 724 p + 39 724 p + 21 724 p + 354 723 p + 355 723 p + 356 723 p + 403 723 p + 404 723 p + 20 723 p + 21 723 p + 357 722 p + 289 722 p + 358 722 p + 361 722 p + 360 722 p + 40 722 p + 23 722 p + 357 721 p + 289 721 p + 358 721 p + 40 721 p + 22 721 p + 359 720 p + 294 720 p + 360 720 p + 364 720 p + 363 720 p + 41 720 p + 24 720 p + 359 719 p + 294 719 p + 360 719 p + 361 719 p + 357 719 p + 41 719 p + 23 719 p + 361 718 p + 360 718 p + 357 718 p + 405 718 p + 406 718 p + 40 718 p + 41 718 p + 362 717 p + 298 717 p + 363 717 p + 367 717 p + 366 717 p + 42 717 p + 25 717 p + 362 716 p + 298 716 p + 363 716 p + 364 716 p + 359 716 p + 42 716 p + 24 716 p + 364 715 p + 363 715 p + 359 715 p + 409 715 p + 410 715 p + 41 715 p + 42 715 p + 365 714 p + 302 714 p + 366 714 p + 370 714 p + 369 714 p + 43 714 p + 26 714 p + 365 713 p + 302 713 p + 366 713 p + 367 713 p + 362 713 p + 43 713 p + 25 713 p + 367 712 p + 366 712 p + 362 712 p + 412 712 p + 413 712 p + 42 712 p + 43 712 p + 368 711 p + 306 711 p + 369 711 p + 373 711 p + 372 711 p + 44 711 p + 27 711 p + 368 710 p + 306 710 p + 369 710 p + 370 710 p + 365 710 p + 44 710 p + 26 710 p + 370 709 p + 369 709 p + 365 709 p + 415 709 p + 416 709 p + 43 709 p + 44 709 p + 371 708 p + 310 708 p + 372 708 p + 376 708 p + 375 708 p + 45 708 p + 28 708 p + 371 707 p + 310 707 p + 372 707 p + 373 707 p + 368 707 p + 45 707 p + 27 707 p + 373 706 p + 372 706 p + 368 706 p + 418 706 p + 419 706 p + 44 706 p + 45 706 p + 374 705 p + 314 705 p + 375 705 p + 379 705 p + 378 705 p + 46 705 p + 29 705 p + 374 704 p + 314 704 p + 375 704 p + 376 704 p + 371 704 p + 46 704 p + 28 704 p + 376 703 p + 375 703 p + 371 703 p + 422 703 p + 423 703 p + 45 703 p + 46 703 p + 377 702 p + 318 702 p + 378 702 p + 382 702 p + 381 702 p + 47 702 p + 30 702 p + 377 701 p + 318 701 p + 378 701 p + 379 701 p + 374 701 p + 47 701 p + 29 701 p + 379 700 p + 378 700 p + 374 700 p + 421 700 p + 422 700 p + 46 700 p + 47 700 p + 380 699 p + 322 699 p + 381 699 p + 385 699 p + 384 699 p + 48 699 p + 31 699 p + 380 698 p + 322 698 p + 381 698 p + 382 698 p + 377 698 p + 48 698 p + 30 698 p + 382 697 p + 381 697 p + 377 697 p + 427 697 p + 428 697 p + 47 697 p + 48 697 p + 383 696 p + 326 696 p + 384 696 p + 388 696 p + 387 696 p + 49 696 p + 32 696 p + 383 695 p + 326 695 p + 384 695 p + 385 695 p + 380 695 p + 49 695 p + 31 695 p + 385 694 p + 384 694 p + 380 694 p + 430 694 p + 431 694 p + 48 694 p + 49 694 p + 386 693 p + 332 693 p + 387 693 p + 391 693 p + 390 693 p + 50 693 p + 33 693 p + 386 692 p + 332 692 p + 387 692 p + 388 692 p + 383 692 p + 50 692 p + 32 692 p + 388 691 p + 387 691 p + 383 691 p + 433 691 p + 434 691 p + 49 691 p + 50 691 p + 389 690 p + 336 690 p + 390 690 p + 394 690 p + 393 690 p + 51 690 p + 34 690 p + 389 689 p + 336 689 p + 390 689 p + 391 689 p + 386 689 p + 51 689 p + 33 689 p + 391 688 p + 390 688 p + 386 688 p + 436 688 p + 433 688 p + 50 688 p + 51 688 p + 392 687 p + 337 687 p + 393 687 p + 397 687 p + 396 687 p + 52 687 p + 35 687 p + 392 686 p + 337 686 p + 393 686 p + 394 686 p + 389 686 p + 52 686 p + 34 686 p + 394 685 p + 393 685 p + 389 685 p + 438 685 p + 440 685 p + 51 685 p + 52 685 p + 395 684 p + 342 684 p + 396 684 p + 402 684 p + 401 684 p + 53 684 p + 36 684 p + 395 683 p + 342 683 p + 396 683 p + 397 683 p + 392 683 p + 53 683 p + 35 683 p + 397 682 p + 396 682 p + 392 682 p + 437 682 p + 438 682 p + 52 682 p + 53 682 p + 398 681 p + 351 681 p + 399 681 p + 54 681 p + 2 681 p + 398 680 p + 351 680 p + 399 680 p + 400 680 p + 350 680 p + 54 680 p + 38 680 p + 400 679 p + 399 679 p + 350 679 p + 401 679 p + 346 679 p + 37 679 p + 54 679 p + 401 678 p + 400 678 p + 346 678 p + 395 678 p + 402 678 p + 36 678 p + 54 678 p + 395 677 p + 402 677 p + 401 677 p + 437 677 p + 439 677 p + 53 677 p + 54 677 p + 356 676 p + 403 676 p + 404 676 p + 21 676 p + 285 676 p + 356 675 p + 403 675 p + 404 675 p + 498 675 p + 499 675 p + 20 675 p + 285 675 p + 405 674 p + 361 674 p + 406 674 p + 411 674 p + 410 674 p + 56 674 p + 41 674 p + 405 673 p + 361 673 p + 406 673 p + 407 673 p + 408 673 p + 56 673 p + 40 673 p + 407 672 p + 406 672 p + 408 672 p + 442 672 p + 443 672 p + 55 672 p + 56 672 p + 407 671 p + 406 671 p + 408 671 p + 55 671 p + 40 671 p + 409 670 p + 364 670 p + 410 670 p + 414 670 p + 413 670 p + 57 670 p + 42 670 p + 409 669 p + 364 669 p + 410 669 p + 411 669 p + 405 669 p + 57 669 p + 41 669 p + 411 668 p + 410 668 p + 405 668 p + 446 668 p + 447 668 p + 56 668 p + 57 668 p + 412 667 p + 367 667 p + 413 667 p + 417 667 p + 416 667 p + 58 667 p + 43 667 p + 412 666 p + 367 666 p + 413 666 p + 414 666 p + 409 666 p + 58 666 p + 42 666 p + 414 665 p + 413 665 p + 409 665 p + 449 665 p + 450 665 p + 57 665 p + 58 665 p + 415 664 p + 370 664 p + 416 664 p + 420 664 p + 419 664 p + 59 664 p + 44 664 p + 415 663 p + 370 663 p + 416 663 p + 417 663 p + 412 663 p + 59 663 p + 43 663 p + 417 662 p + 416 662 p + 412 662 p + 452 662 p + 453 662 p + 58 662 p + 59 662 p + 418 661 p + 373 661 p + 419 661 p + 424 661 p + 423 661 p + 60 661 p + 45 661 p + 418 660 p + 373 660 p + 419 660 p + 420 660 p + 415 660 p + 60 660 p + 44 660 p + 420 659 p + 419 659 p + 415 659 p + 455 659 p + 456 659 p + 59 659 p + 60 659 p + 421 658 p + 379 658 p + 422 658 p + 425 658 p + 426 658 p + 61 658 p + 47 658 p + 421 657 p + 379 657 p + 422 657 p + 376 657 p + 423 657 p + 61 657 p + 46 657 p + 422 656 p + 376 656 p + 423 656 p + 424 656 p + 418 656 p + 61 656 p + 45 656 p + 424 655 p + 423 655 p + 418 655 p + 459 655 p + 460 655 p + 60 655 p + 61 655 p + 425 654 p + 426 654 p + 421 654 p + 458 654 p + 459 654 p + 61 654 p + 62 654 p + 425 653 p + 426 653 p + 421 653 p + 429 653 p + 428 653 p + 62 653 p + 47 653 p + 427 652 p + 382 652 p + 428 652 p + 432 652 p + 431 652 p + 63 652 p + 48 652 p + 427 651 p + 382 651 p + 428 651 p + 429 651 p + 426 651 p + 63 651 p + 47 651 p + 429 650 p + 428 650 p + 426 650 p + 462 650 p + 463 650 p + 62 650 p + 63 650 p + 430 649 p + 385 649 p + 431 649 p + 435 649 p + 434 649 p + 64 649 p + 49 649 p + 430 648 p + 385 648 p + 431 648 p + 432 648 p + 427 648 p + 64 648 p + 48 648 p + 432 647 p + 431 647 p + 427 647 p + 465 647 p + 466 647 p + 63 647 p + 64 647 p + 433 646 p + 388 646 p + 434 646 p + 436 646 p + 391 646 p + 65 646 p + 50 646 p + 433 645 p + 388 645 p + 434 645 p + 435 645 p + 430 645 p + 65 645 p + 49 645 p + 435 644 p + 434 644 p + 430 644 p + 468 644 p + 469 644 p + 64 644 p + 65 644 p + 436 643 p + 391 643 p + 433 643 p + 441 643 p + 440 643 p + 65 643 p + 51 643 p + 437 642 p + 397 642 p + 438 642 p + 402 642 p + 439 642 p + 66 642 p + 53 642 p + 437 641 p + 397 641 p + 438 641 p + 394 641 p + 440 641 p + 66 641 p + 52 641 p + 402 640 p + 437 640 p + 439 640 p + 54 640 p + 66 640 p + 438 639 p + 394 639 p + 440 639 p + 441 639 p + 436 639 p + 66 639 p + 51 639 p + 441 638 p + 440 638 p + 436 638 p + 468 638 p + 471 638 p + 65 638 p + 66 638 p + 442 637 p + 407 637 p + 443 637 p + 448 637 p + 447 637 p + 68 637 p + 56 637 p + 442 636 p + 407 636 p + 443 636 p + 444 636 p + 445 636 p + 68 636 p + 55 636 p + 444 635 p + 443 635 p + 445 635 p + 472 635 p + 473 635 p + 67 635 p + 68 635 p + 444 634 p + 443 634 p + 445 634 p + 67 634 p + 55 634 p + 446 633 p + 411 633 p + 447 633 p + 451 633 p + 450 633 p + 69 633 p + 57 633 p + 446 632 p + 411 632 p + 447 632 p + 448 632 p + 442 632 p + 69 632 p + 56 632 p + 448 631 p + 447 631 p + 442 631 p + 476 631 p + 472 631 p + 68 631 p + 69 631 p + 449 630 p + 414 630 p + 450 630 p + 454 630 p + 453 630 p + 70 630 p + 58 630 p + 449 629 p + 414 629 p + 450 629 p + 451 629 p + 446 629 p + 70 629 p + 57 629 p + 451 628 p + 450 628 p + 446 628 p + 480 628 p + 481 628 p + 69 628 p + 70 628 p + 452 627 p + 417 627 p + 453 627 p + 457 627 p + 456 627 p + 71 627 p + 59 627 p + 452 626 p + 417 626 p + 453 626 p + 454 626 p + 449 626 p + 71 626 p + 58 626 p + 454 625 p + 453 625 p + 449 625 p + 479 625 p + 480 625 p + 70 625 p + 71 625 p + 455 624 p + 420 624 p + 456 624 p + 461 624 p + 460 624 p + 72 624 p + 60 624 p + 455 623 p + 420 623 p + 456 623 p + 457 623 p + 452 623 p + 72 623 p + 59 623 p + 457 622 p + 456 622 p + 452 622 p + 483 622 p + 484 622 p + 71 622 p + 72 622 p + 458 621 p + 425 621 p + 459 621 p + 464 621 p + 463 621 p + 73 621 p + 62 621 p + 458 620 p + 425 620 p + 459 620 p + 424 620 p + 460 620 p + 73 620 p + 61 620 p + 459 619 p + 424 619 p + 460 619 p + 461 619 p + 455 619 p + 73 619 p + 60 619 p + 461 618 p + 460 618 p + 455 618 p + 486 618 p + 487 618 p + 72 618 p + 73 618 p + 462 617 p + 429 617 p + 463 617 p + 467 617 p + 466 617 p + 74 617 p + 63 617 p + 462 616 p + 429 616 p + 463 616 p + 464 616 p + 458 616 p + 74 616 p + 62 616 p + 464 615 p + 463 615 p + 458 615 p + 492 615 p + 493 615 p + 73 615 p + 74 615 p + 465 614 p + 432 614 p + 466 614 p + 470 614 p + 469 614 p + 75 614 p + 64 614 p + 465 613 p + 432 613 p + 466 613 p + 467 613 p + 462 613 p + 75 613 p + 63 613 p + 467 612 p + 466 612 p + 462 612 p + 491 612 p + 492 612 p + 74 612 p + 75 612 p + 468 611 p + 435 611 p + 469 611 p + 441 611 p + 471 611 p + 76 611 p + 65 611 p + 468 610 p + 435 610 p + 469 610 p + 470 610 p + 465 610 p + 76 610 p + 64 610 p + 470 609 p + 469 609 p + 465 609 p + 495 609 p + 497 609 p + 75 609 p + 76 609 p + 441 608 p + 468 608 p + 471 608 p + 66 608 p + 76 608 p + 472 607 p + 444 607 p + 473 607 p + 476 607 p + 448 607 p + 78 607 p + 68 607 p + 472 606 p + 444 606 p + 473 606 p + 474 606 p + 475 606 p + 78 606 p + 67 606 p + 474 605 p + 473 605 p + 475 605 p + 503 605 p + 504 605 p + 77 605 p + 78 605 p + 474 604 p + 473 604 p + 475 604 p + 77 604 p + 67 604 p + 476 603 p + 448 603 p + 472 603 p + 477 603 p + 478 603 p + 78 603 p + 69 603 p + 477 602 p + 478 602 p + 476 602 p + 507 602 p + 503 602 p + 78 602 p + 79 602 p + 477 601 p + 478 601 p + 476 601 p + 482 601 p + 481 601 p + 79 601 p + 69 601 p + 479 600 p + 454 600 p + 480 600 p + 485 600 p + 484 600 p + 80 600 p + 71 600 p + 479 599 p + 454 599 p + 480 599 p + 451 599 p + 481 599 p + 80 599 p + 70 599 p + 480 598 p + 451 598 p + 481 598 p + 482 598 p + 478 598 p + 80 598 p + 69 598 p + 482 597 p + 481 597 p + 478 597 p + 508 597 p + 509 597 p + 79 597 p + 80 597 p + 483 596 p + 457 596 p + 484 596 p + 488 596 p + 487 596 p + 81 596 p + 72 596 p + 483 595 p + 457 595 p + 484 595 p + 485 595 p + 479 595 p + 81 595 p + 71 595 p + 485 594 p + 484 594 p + 479 594 p + 511 594 p + 512 594 p + 80 594 p + 81 594 p + 486 593 p + 461 593 p + 487 593 p + 489 593 p + 490 593 p + 82 593 p + 73 593 p + 486 592 p + 461 592 p + 487 592 p + 488 592 p + 483 592 p + 82 592 p + 72 592 p + 488 591 p + 487 591 p + 483 591 p + 516 591 p + 517 591 p + 81 591 p + 82 591 p + 489 590 p + 490 590 p + 486 590 p + 519 590 p + 520 590 p + 82 590 p + 83 590 p + 489 589 p + 490 589 p + 486 589 p + 494 589 p + 493 589 p + 83 589 p + 73 589 p + 491 588 p + 467 588 p + 492 588 p + 495 588 p + 496 588 p + 84 588 p + 75 588 p + 491 587 p + 467 587 p + 492 587 p + 464 587 p + 493 587 p + 84 587 p + 74 587 p + 492 586 p + 464 586 p + 493 586 p + 494 586 p + 490 586 p + 84 586 p + 73 586 p + 494 585 p + 493 585 p + 490 585 p + 523 585 p + 524 585 p + 83 585 p + 84 585 p + 495 584 p + 491 584 p + 496 584 p + 470 584 p + 497 584 p + 85 584 p + 75 584 p + 495 583 p + 491 583 p + 496 583 p + 522 583 p + 523 583 p + 85 583 p + 84 583 p + 470 582 p + 495 582 p + 497 582 p + 76 582 p + 85 582 p + 404 581 p + 498 581 p + 499 581 p + 500 581 p + 501 581 p + 285 581 p + 284 581 p + 404 580 p + 498 580 p + 499 580 p + 349 580 p + 502 580 p + 20 580 p + 284 580 p + 498 579 p + 500 579 p + 501 579 p + 285 579 p + 1 579 p + 498 578 p + 500 578 p + 501 578 p + 602 578 p + 603 578 p + 284 578 p + 1 578 p + 349 577 p + 499 577 p + 502 577 p + 551 577 p + 552 577 p + 19 577 p + 284 577 p + 503 576 p + 474 576 p + 504 576 p + 507 576 p + 477 576 p + 87 576 p + 78 576 p + 503 575 p + 474 575 p + 504 575 p + 505 575 p + 506 575 p + 87 575 p + 77 575 p + 505 574 p + 504 574 p + 506 574 p + 528 574 p + 529 574 p + 86 574 p + 87 574 p + 505 573 p + 504 573 p + 506 573 p + 86 573 p + 77 573 p + 507 572 p + 477 572 p + 503 572 p + 510 572 p + 509 572 p + 87 572 p + 79 572 p + 508 571 p + 482 571 p + 509 571 p + 513 571 p + 512 571 p + 88 571 p + 80 571 p + 508 570 p + 482 570 p + 509 570 p + 510 570 p + 507 570 p + 88 570 p + 79 570 p + 510 569 p + 509 569 p + 507 569 p + 530 569 p + 531 569 p + 87 569 p + 88 569 p + 511 568 p + 485 568 p + 512 568 p + 514 568 p + 515 568 p + 89 568 p + 81 568 p + 511 567 p + 485 567 p + 512 567 p + 513 567 p + 508 567 p + 89 567 p + 80 567 p + 513 566 p + 512 566 p + 508 566 p + 533 566 p + 534 566 p + 88 566 p + 89 566 p + 514 565 p + 515 565 p + 511 565 p + 538 565 p + 539 565 p + 89 565 p + 90 565 p + 514 564 p + 515 564 p + 511 564 p + 518 564 p + 517 564 p + 90 564 p + 81 564 p + 516 563 p + 488 563 p + 517 563 p + 521 563 p + 520 563 p + 91 563 p + 82 563 p + 516 562 p + 488 562 p + 517 562 p + 518 562 p + 515 562 p + 91 562 p + 81 562 p + 518 561 p + 517 561 p + 515 561 p + 541 561 p + 542 561 p + 90 561 p + 91 561 p + 519 560 p + 489 560 p + 520 560 p + 525 560 p + 524 560 p + 92 560 p + 83 560 p + 519 559 p + 489 559 p + 520 559 p + 521 559 p + 516 559 p + 92 559 p + 82 559 p + 521 558 p + 520 558 p + 516 558 p + 545 558 p + 546 558 p + 91 558 p + 92 558 p + 522 557 p + 496 557 p + 523 557 p + 526 557 p + 527 557 p + 93 557 p + 85 557 p + 522 556 p + 496 556 p + 523 556 p + 494 556 p + 524 556 p + 93 556 p + 84 556 p + 523 555 p + 494 555 p + 524 555 p + 525 555 p + 519 555 p + 93 555 p + 83 555 p + 525 554 p + 524 554 p + 519 554 p + 544 554 p + 545 554 p + 92 554 p + 93 554 p + 526 553 p + 522 553 p + 527 553 p + 94 553 p + 85 553 p + 526 552 p + 522 552 p + 527 552 p + 548 552 p + 549 552 p + 94 552 p + 93 552 p + 528 551 p + 505 551 p + 529 551 p + 532 551 p + 531 551 p + 95 551 p + 87 551 p + 528 550 p + 505 550 p + 529 550 p + 95 550 p + 86 550 p + 530 549 p + 510 549 p + 531 549 p + 535 549 p + 534 549 p + 96 549 p + 88 549 p + 530 548 p + 510 548 p + 531 548 p + 532 548 p + 528 548 p + 96 548 p + 87 548 p + 532 547 p + 531 547 p + 528 547 p + 553 547 p + 554 547 p + 95 547 p + 96 547 p + 533 546 p + 513 546 p + 534 546 p + 536 546 p + 537 546 p + 97 546 p + 89 546 p + 533 545 p + 513 545 p + 534 545 p + 535 545 p + 530 545 p + 97 545 p + 88 545 p + 535 544 p + 534 544 p + 530 544 p + 557 544 p + 558 544 p + 96 544 p + 97 544 p + 536 543 p + 537 543 p + 533 543 p + 560 543 p + 561 543 p + 97 543 p + 98 543 p + 536 542 p + 537 542 p + 533 542 p + 540 542 p + 539 542 p + 98 542 p + 89 542 p + 538 541 p + 514 541 p + 539 541 p + 543 541 p + 542 541 p + 99 541 p + 90 541 p + 538 540 p + 514 540 p + 539 540 p + 540 540 p + 537 540 p + 99 540 p + 89 540 p + 540 539 p + 539 539 p + 537 539 p + 564 539 p + 565 539 p + 98 539 p + 99 539 p + 541 538 p + 518 538 p + 542 538 p + 547 538 p + 546 538 p + 100 538 p + 91 538 p + 541 537 p + 518 537 p + 542 537 p + 543 537 p + 538 537 p + 100 537 p + 90 537 p + 543 536 p + 542 536 p + 538 536 p + 563 536 p + 564 536 p + 99 536 p + 100 536 p + 544 535 p + 525 535 p + 545 535 p + 550 535 p + 549 535 p + 101 535 p + 93 535 p + 544 534 p + 525 534 p + 545 534 p + 521 534 p + 546 534 p + 101 534 p + 92 534 p + 545 533 p + 521 533 p + 546 533 p + 547 533 p + 541 533 p + 101 533 p + 91 533 p + 547 532 p + 546 532 p + 541 532 p + 567 532 p + 568 532 p + 100 532 p + 101 532 p + 548 531 p + 527 531 p + 549 531 p + 102 531 p + 94 531 p + 548 530 p + 527 530 p + 549 530 p + 550 530 p + 544 530 p + 102 530 p + 93 530 p + 550 529 p + 549 529 p + 544 529 p + 570 529 p + 571 529 p + 101 529 p + 102 529 p + 502 528 p + 551 528 p + 552 528 p + 601 528 p + 602 528 p + 284 528 p + 283 528 p + 502 527 p + 551 527 p + 552 527 p + 345 527 p + 650 527 p + 19 527 p + 283 527 p + 553 526 p + 532 526 p + 554 526 p + 559 526 p + 558 526 p + 104 526 p + 96 526 p + 553 525 p + 532 525 p + 554 525 p + 555 525 p + 556 525 p + 104 525 p + 95 525 p + 555 524 p + 554 524 p + 556 524 p + 575 524 p + 576 524 p + 103 524 p + 104 524 p + 555 523 p + 554 523 p + 556 523 p + 103 523 p + 95 523 p + 557 522 p + 535 522 p + 558 522 p + 562 522 p + 561 522 p + 105 522 p + 97 522 p + 557 521 p + 535 521 p + 558 521 p + 559 521 p + 553 521 p + 105 521 p + 96 521 p + 559 520 p + 558 520 p + 553 520 p + 577 520 p + 578 520 p + 104 520 p + 105 520 p + 560 519 p + 536 519 p + 561 519 p + 566 519 p + 565 519 p + 106 519 p + 98 519 p + 560 518 p + 536 518 p + 561 518 p + 562 518 p + 557 518 p + 106 518 p + 97 518 p + 562 517 p + 561 517 p + 557 517 p + 580 517 p + 581 517 p + 105 517 p + 106 517 p + 563 516 p + 543 516 p + 564 516 p + 569 516 p + 568 516 p + 107 516 p + 100 516 p + 563 515 p + 543 515 p + 564 515 p + 540 515 p + 565 515 p + 107 515 p + 99 515 p + 564 514 p + 540 514 p + 565 514 p + 566 514 p + 560 514 p + 107 514 p + 98 514 p + 566 513 p + 565 513 p + 560 513 p + 583 513 p + 584 513 p + 106 513 p + 107 513 p + 567 512 p + 547 512 p + 568 512 p + 572 512 p + 571 512 p + 108 512 p + 101 512 p + 567 511 p + 547 511 p + 568 511 p + 569 511 p + 563 511 p + 108 511 p + 100 511 p + 569 510 p + 568 510 p + 563 510 p + 586 510 p + 587 510 p + 107 510 p + 108 510 p + 570 509 p + 550 509 p + 571 509 p + 573 509 p + 574 509 p + 109 509 p + 102 509 p + 570 508 p + 550 508 p + 571 508 p + 572 508 p + 567 508 p + 109 508 p + 101 508 p + 572 507 p + 571 507 p + 567 507 p + 591 507 p + 592 507 p + 108 507 p + 109 507 p + 573 506 p + 570 506 p + 574 506 p + 110 506 p + 102 506 p + 573 505 p + 570 505 p + 574 505 p + 594 505 p + 595 505 p + 110 505 p + 109 505 p + 575 504 p + 555 504 p + 576 504 p + 579 504 p + 578 504 p + 111 504 p + 104 504 p + 575 503 p + 555 503 p + 576 503 p + 111 503 p + 103 503 p + 577 502 p + 559 502 p + 578 502 p + 582 502 p + 581 502 p + 112 502 p + 105 502 p + 577 501 p + 559 501 p + 578 501 p + 579 501 p + 575 501 p + 112 501 p + 104 501 p + 579 500 p + 578 500 p + 575 500 p + 604 500 p + 605 500 p + 111 500 p + 112 500 p + 580 499 p + 562 499 p + 581 499 p + 585 499 p + 584 499 p + 113 499 p + 106 499 p + 580 498 p + 562 498 p + 581 498 p + 582 498 p + 577 498 p + 113 498 p + 105 498 p + 582 497 p + 581 497 p + 577 497 p + 608 497 p + 609 497 p + 112 497 p + 113 497 p + 583 496 p + 566 496 p + 584 496 p + 588 496 p + 587 496 p + 114 496 p + 107 496 p + 583 495 p + 566 495 p + 584 495 p + 585 495 p + 580 495 p + 114 495 p + 106 495 p + 585 494 p + 584 494 p + 580 494 p + 611 494 p + 612 494 p + 113 494 p + 114 494 p + 586 493 p + 569 493 p + 587 493 p + 589 493 p + 590 493 p + 115 493 p + 108 493 p + 586 492 p + 569 492 p + 587 492 p + 588 492 p + 583 492 p + 115 492 p + 107 492 p + 588 491 p + 587 491 p + 583 491 p + 614 491 p + 615 491 p + 114 491 p + 115 491 p + 589 490 p + 590 490 p + 586 490 p + 618 490 p + 619 490 p + 115 490 p + 116 490 p + 589 489 p + 590 489 p + 586 489 p + 593 489 p + 592 489 p + 116 489 p + 108 489 p + 591 488 p + 572 488 p + 592 488 p + 596 488 p + 595 488 p + 117 488 p + 109 488 p + 591 487 p + 572 487 p + 592 487 p + 593 487 p + 590 487 p + 117 487 p + 108 487 p + 593 486 p + 592 486 p + 590 486 p + 617 486 p + 618 486 p + 116 486 p + 117 486 p + 594 485 p + 574 485 p + 595 485 p + 597 485 p + 598 485 p + 118 485 p + 110 485 p + 594 484 p + 574 484 p + 595 484 p + 596 484 p + 591 484 p + 118 484 p + 109 484 p + 596 483 p + 595 483 p + 591 483 p + 621 483 p + 622 483 p + 117 483 p + 118 483 p + 597 482 p + 594 482 p + 598 482 p + 119 482 p + 110 482 p + 597 481 p + 594 481 p + 598 481 p + 599 481 p + 600 481 p + 119 481 p + 118 481 p + 599 480 p + 598 480 p + 600 480 p + 3 480 p + 119 480 p + 599 479 p + 598 479 p + 600 479 p + 624 479 p + 626 479 p + 3 479 p + 118 479 p + 601 478 p + 551 478 p + 602 478 p + 708 478 p + 668 478 p + 267 478 p + 283 478 p + 601 477 p + 551 477 p + 602 477 p + 501 477 p + 603 477 p + 267 477 p + 284 477 p + 602 476 p + 501 476 p + 603 476 p + 267 476 p + 1 476 p + 604 475 p + 579 475 p + 605 475 p + 610 475 p + 609 475 p + 121 475 p + 112 475 p + 604 474 p + 579 474 p + 605 474 p + 606 474 p + 607 474 p + 121 474 p + 111 474 p + 606 473 p + 605 473 p + 607 473 p + 630 473 p + 631 473 p + 120 473 p + 121 473 p + 606 472 p + 605 472 p + 607 472 p + 120 472 p + 111 472 p + 608 471 p + 582 471 p + 609 471 p + 613 471 p + 612 471 p + 122 471 p + 113 471 p + 608 470 p + 582 470 p + 609 470 p + 610 470 p + 604 470 p + 122 470 p + 112 470 p + 610 469 p + 609 469 p + 604 469 p + 632 469 p + 633 469 p + 121 469 p + 122 469 p + 611 468 p + 585 468 p + 612 468 p + 616 468 p + 615 468 p + 123 468 p + 114 468 p + 611 467 p + 585 467 p + 612 467 p + 613 467 p + 608 467 p + 123 467 p + 113 467 p + 613 466 p + 612 466 p + 608 466 p + 637 466 p + 638 466 p + 122 466 p + 123 466 p + 614 465 p + 588 465 p + 615 465 p + 620 465 p + 619 465 p + 124 465 p + 115 465 p + 614 464 p + 588 464 p + 615 464 p + 616 464 p + 611 464 p + 124 464 p + 114 464 p + 616 463 p + 615 463 p + 611 463 p + 640 463 p + 641 463 p + 123 463 p + 124 463 p + 617 462 p + 593 462 p + 618 462 p + 623 462 p + 622 462 p + 125 462 p + 117 462 p + 617 461 p + 593 461 p + 618 461 p + 589 461 p + 619 461 p + 125 461 p + 116 461 p + 618 460 p + 589 460 p + 619 460 p + 620 460 p + 614 460 p + 125 460 p + 115 460 p + 620 459 p + 619 459 p + 614 459 p + 644 459 p + 645 459 p + 124 459 p + 125 459 p + 621 458 p + 596 458 p + 622 458 p + 624 458 p + 625 458 p + 126 458 p + 118 458 p + 621 457 p + 596 457 p + 622 457 p + 623 457 p + 617 457 p + 126 457 p + 117 457 p + 623 456 p + 622 456 p + 617 456 p + 643 456 p + 644 456 p + 125 456 p + 126 456 p + 624 455 p + 621 455 p + 625 455 p + 600 455 p + 626 455 p + 127 455 p + 118 455 p + 624 454 p + 621 454 p + 625 454 p + 627 454 p + 628 454 p + 127 454 p + 126 454 p + 600 453 p + 624 453 p + 626 453 p + 629 453 p + 627 453 p + 3 453 p + 127 453 p + 627 452 p + 625 452 p + 628 452 p + 629 452 p + 626 452 p + 128 452 p + 127 452 p + 627 451 p + 625 451 p + 628 451 p + 647 451 p + 649 451 p + 128 451 p + 126 451 p + 629 450 p + 626 450 p + 627 450 p + 128 450 p + 3 450 p + 630 449 p + 606 449 p + 631 449 p + 634 449 p + 633 449 p + 129 449 p + 121 449 p + 630 448 p + 606 448 p + 631 448 p + 129 448 p + 120 448 p + 632 447 p + 610 447 p + 633 447 p + 635 447 p + 636 447 p + 130 447 p + 122 447 p + 632 446 p + 610 446 p + 633 446 p + 634 446 p + 630 446 p + 130 446 p + 121 446 p + 634 445 p + 633 445 p + 630 445 p + 651 445 p + 652 445 p + 129 445 p + 130 445 p + 635 444 p + 636 444 p + 632 444 p + 655 444 p + 656 444 p + 130 444 p + 131 444 p + 635 443 p + 636 443 p + 632 443 p + 639 443 p + 638 443 p + 131 443 p + 122 443 p + 637 442 p + 613 442 p + 638 442 p + 642 442 p + 641 442 p + 132 442 p + 123 442 p + 637 441 p + 613 441 p + 638 441 p + 639 441 p + 636 441 p + 132 441 p + 122 441 p + 639 440 p + 638 440 p + 636 440 p + 659 440 p + 660 440 p + 131 440 p + 132 440 p + 640 439 p + 616 439 p + 641 439 p + 646 439 p + 645 439 p + 133 439 p + 124 439 p + 640 438 p + 616 438 p + 641 438 p + 642 438 p + 637 438 p + 133 438 p + 123 438 p + 642 437 p + 641 437 p + 637 437 p + 658 437 p + 659 437 p + 132 437 p + 133 437 p + 643 436 p + 623 436 p + 644 436 p + 647 436 p + 648 436 p + 134 436 p + 126 436 p + 643 435 p + 623 435 p + 644 435 p + 620 435 p + 645 435 p + 134 435 p + 125 435 p + 644 434 p + 620 434 p + 645 434 p + 646 434 p + 640 434 p + 134 434 p + 124 434 p + 646 433 p + 645 433 p + 640 433 p + 662 433 p + 663 433 p + 133 433 p + 134 433 p + 647 432 p + 643 432 p + 648 432 p + 628 432 p + 649 432 p + 135 432 p + 126 432 p + 647 431 p + 643 431 p + 648 431 p + 665 431 p + 667 431 p + 135 431 p + 134 431 p + 628 430 p + 647 430 p + 649 430 p + 128 430 p + 135 430 p + 345 429 p + 552 429 p + 650 429 p + 668 429 p + 669 429 p + 18 429 p + 283 429 p + 651 428 p + 634 428 p + 652 428 p + 657 428 p + 656 428 p + 137 428 p + 130 428 p + 651 427 p + 634 427 p + 652 427 p + 653 427 p + 654 427 p + 137 427 p + 129 427 p + 653 426 p + 652 426 p + 654 426 p + 670 426 p + 671 426 p + 136 426 p + 137 426 p + 653 425 p + 652 425 p + 654 425 p + 136 425 p + 129 425 p + 655 424 p + 635 424 p + 656 424 p + 661 424 p + 660 424 p + 138 424 p + 131 424 p + 655 423 p + 635 423 p + 656 423 p + 657 423 p + 651 423 p + 138 423 p + 130 423 p + 657 422 p + 656 422 p + 651 422 p + 672 422 p + 673 422 p + 137 422 p + 138 422 p + 658 421 p + 642 421 p + 659 421 p + 664 421 p + 663 421 p + 139 421 p + 133 421 p + 658 420 p + 642 420 p + 659 420 p + 639 420 p + 660 420 p + 139 420 p + 132 420 p + 659 419 p + 639 419 p + 660 419 p + 661 419 p + 655 419 p + 139 419 p + 131 419 p + 661 418 p + 660 418 p + 655 418 p + 675 418 p + 676 418 p + 138 418 p + 139 418 p + 662 417 p + 646 417 p + 663 417 p + 665 417 p + 666 417 p + 140 417 p + 134 417 p + 662 416 p + 646 416 p + 663 416 p + 664 416 p + 658 416 p + 140 416 p + 133 416 p + 664 415 p + 663 415 p + 658 415 p + 678 415 p + 679 415 p + 139 415 p + 140 415 p + 665 414 p + 662 414 p + 666 414 p + 648 414 p + 667 414 p + 141 414 p + 134 414 p + 665 413 p + 662 413 p + 666 413 p + 681 413 p + 683 413 p + 141 413 p + 140 413 p + 648 412 p + 665 412 p + 667 412 p + 135 412 p + 141 412 p + 650 411 p + 668 411 p + 669 411 p + 708 411 p + 601 411 p + 283 411 p + 282 411 p + 650 410 p + 668 410 p + 669 410 p + 709 410 p + 710 410 p + 18 410 p + 282 410 p + 670 409 p + 653 409 p + 671 409 p + 674 409 p + 673 409 p + 142 409 p + 137 409 p + 670 408 p + 653 408 p + 671 408 p + 142 408 p + 136 408 p + 672 407 p + 657 407 p + 673 407 p + 677 407 p + 676 407 p + 143 407 p + 138 407 p + 672 406 p + 657 406 p + 673 406 p + 674 406 p + 670 406 p + 143 406 p + 137 406 p + 674 405 p + 673 405 p + 670 405 p + 684 405 p + 685 405 p + 142 405 p + 143 405 p + 675 404 p + 661 404 p + 676 404 p + 679 404 p + 680 404 p + 144 404 p + 139 404 p + 675 403 p + 661 403 p + 676 403 p + 677 403 p + 672 403 p + 144 403 p + 138 403 p + 677 402 p + 676 402 p + 672 402 p + 688 402 p + 684 402 p + 143 402 p + 144 402 p + 678 401 p + 664 401 p + 679 401 p + 681 401 p + 682 401 p + 145 401 p + 140 401 p + 678 400 p + 664 400 p + 679 400 p + 675 400 p + 680 400 p + 145 400 p + 139 400 p + 679 399 p + 675 399 p + 680 399 p + 692 399 p + 693 399 p + 145 399 p + 144 399 p + 681 398 p + 678 398 p + 682 398 p + 666 398 p + 683 398 p + 146 398 p + 140 398 p + 681 397 p + 678 397 p + 682 397 p + 691 397 p + 692 397 p + 146 397 p + 145 397 p + 666 396 p + 681 396 p + 683 396 p + 141 396 p + 146 396 p + 684 395 p + 674 395 p + 685 395 p + 688 395 p + 677 395 p + 148 395 p + 143 395 p + 684 394 p + 674 394 p + 685 394 p + 686 394 p + 687 394 p + 148 394 p + 142 394 p + 686 393 p + 685 393 p + 687 393 p + 697 393 p + 698 393 p + 147 393 p + 148 393 p + 686 392 p + 685 392 p + 687 392 p + 147 392 p + 142 392 p + 688 391 p + 677 391 p + 684 391 p + 689 391 p + 690 391 p + 148 391 p + 144 391 p + 689 390 p + 690 390 p + 688 390 p + 699 390 p + 700 390 p + 148 390 p + 149 390 p + 689 389 p + 690 389 p + 688 389 p + 694 389 p + 693 389 p + 149 389 p + 144 389 p + 691 388 p + 682 388 p + 692 388 p + 695 388 p + 696 388 p + 150 388 p + 146 388 p + 691 387 p + 682 387 p + 692 387 p + 680 387 p + 693 387 p + 150 387 p + 145 387 p + 692 386 p + 680 386 p + 693 386 p + 694 386 p + 690 386 p + 150 386 p + 144 386 p + 694 385 p + 693 385 p + 690 385 p + 702 385 p + 703 385 p + 149 385 p + 150 385 p + 695 384 p + 691 384 p + 696 384 p + 151 384 p + 146 384 p + 695 383 p + 691 383 p + 696 383 p + 705 383 p + 707 383 p + 151 383 p + 150 383 p + 697 382 p + 686 382 p + 698 382 p + 701 382 p + 700 382 p + 152 382 p + 148 382 p + 697 381 p + 686 381 p + 698 381 p + 152 381 p + 147 381 p + 699 380 p + 689 380 p + 700 380 p + 704 380 p + 703 380 p + 153 380 p + 149 380 p + 699 379 p + 689 379 p + 700 379 p + 701 379 p + 697 379 p + 153 379 p + 148 379 p + 701 378 p + 700 378 p + 697 378 p + 713 378 p + 714 378 p + 152 378 p + 153 378 p + 702 377 p + 694 377 p + 703 377 p + 705 377 p + 706 377 p + 154 377 p + 150 377 p + 702 376 p + 694 376 p + 703 376 p + 704 376 p + 699 376 p + 154 376 p + 149 376 p + 704 375 p + 703 375 p + 699 375 p + 715 375 p + 716 375 p + 153 375 p + 154 375 p + 705 374 p + 702 374 p + 706 374 p + 696 374 p + 707 374 p + 155 374 p + 150 374 p + 705 373 p + 702 373 p + 706 373 p + 720 373 p + 721 373 p + 155 373 p + 154 373 p + 696 372 p + 705 372 p + 707 372 p + 151 372 p + 155 372 p + 708 371 p + 668 371 p + 601 371 p + 753 371 p + 711 371 p + 267 371 p + 282 371 p + 669 370 p + 709 370 p + 710 370 p + 711 370 p + 712 370 p + 282 370 p + 281 370 p + 669 369 p + 709 369 p + 710 369 p + 341 369 p + 776 369 p + 18 369 p + 281 369 p + 709 368 p + 711 368 p + 712 368 p + 708 368 p + 753 368 p + 282 368 p + 266 368 p + 709 367 p + 711 367 p + 712 367 p + 757 367 p + 755 367 p + 281 367 p + 266 367 p + 713 366 p + 701 366 p + 714 366 p + 717 366 p + 716 366 p + 156 366 p + 153 366 p + 713 365 p + 701 365 p + 714 365 p + 156 365 p + 152 365 p + 715 364 p + 704 364 p + 716 364 p + 718 364 p + 719 364 p + 157 364 p + 154 364 p + 715 363 p + 704 363 p + 716 363 p + 717 363 p + 713 363 p + 157 363 p + 153 363 p + 717 362 p + 716 362 p + 713 362 p + 725 362 p + 726 362 p + 156 362 p + 157 362 p + 718 361 p + 719 361 p + 715 361 p + 729 361 p + 730 361 p + 157 361 p + 158 361 p + 718 360 p + 719 360 p + 715 360 p + 722 360 p + 721 360 p + 158 360 p + 154 360 p + 720 359 p + 706 359 p + 721 359 p + 723 359 p + 724 359 p + 159 359 p + 155 359 p + 720 358 p + 706 358 p + 721 358 p + 722 358 p + 719 358 p + 159 358 p + 154 358 p + 722 357 p + 721 357 p + 719 357 p + 732 357 p + 733 357 p + 158 357 p + 159 357 p + 723 356 p + 720 356 p + 724 356 p + 160 356 p + 155 356 p + 723 355 p + 720 355 p + 724 355 p + 735 355 p + 736 355 p + 160 355 p + 159 355 p + 725 354 p + 717 354 p + 726 354 p + 727 354 p + 728 354 p + 161 354 p + 157 354 p + 725 353 p + 717 353 p + 726 353 p + 161 353 p + 156 353 p + 727 352 p + 728 352 p + 725 352 p + 738 352 p + 739 352 p + 161 352 p + 162 352 p + 727 351 p + 728 351 p + 725 351 p + 731 351 p + 730 351 p + 162 351 p + 157 351 p + 729 350 p + 718 350 p + 730 350 p + 734 350 p + 733 350 p + 163 350 p + 158 350 p + 729 349 p + 718 349 p + 730 349 p + 731 349 p + 728 349 p + 163 349 p + 157 349 p + 731 348 p + 730 348 p + 728 348 p + 740 348 p + 741 348 p + 162 348 p + 163 348 p + 732 347 p + 722 347 p + 733 347 p + 737 347 p + 736 347 p + 164 347 p + 159 347 p + 732 346 p + 722 346 p + 733 346 p + 734 346 p + 729 346 p + 164 346 p + 158 346 p + 734 345 p + 733 345 p + 729 345 p + 743 345 p + 744 345 p + 163 345 p + 164 345 p + 735 344 p + 724 344 p + 736 344 p + 165 344 p + 160 344 p + 735 343 p + 724 343 p + 736 343 p + 737 343 p + 732 343 p + 165 343 p + 159 343 p + 737 342 p + 736 342 p + 732 342 p + 748 342 p + 749 342 p + 164 342 p + 165 342 p + 738 341 p + 727 341 p + 739 341 p + 742 341 p + 741 341 p + 166 341 p + 162 341 p + 738 340 p + 727 340 p + 739 340 p + 166 340 p + 161 340 p + 740 339 p + 731 339 p + 741 339 p + 745 339 p + 744 339 p + 167 339 p + 163 339 p + 740 338 p + 731 338 p + 741 338 p + 742 338 p + 738 338 p + 167 338 p + 162 338 p + 742 337 p + 741 337 p + 738 337 p + 758 337 p + 759 337 p + 166 337 p + 167 337 p + 743 336 p + 734 336 p + 744 336 p + 746 336 p + 747 336 p + 168 336 p + 164 336 p + 743 335 p + 734 335 p + 744 335 p + 745 335 p + 740 335 p + 168 335 p + 163 335 p + 745 334 p + 744 334 p + 740 334 p + 762 334 p + 763 334 p + 167 334 p + 168 334 p + 746 333 p + 747 333 p + 743 333 p + 765 333 p + 766 333 p + 168 333 p + 169 333 p + 746 332 p + 747 332 p + 743 332 p + 750 332 p + 749 332 p + 169 332 p + 164 332 p + 748 331 p + 737 331 p + 749 331 p + 751 331 p + 752 331 p + 170 331 p + 165 331 p + 748 330 p + 737 330 p + 749 330 p + 750 330 p + 747 330 p + 170 330 p + 164 330 p + 750 329 p + 749 329 p + 747 329 p + 768 329 p + 769 329 p + 169 329 p + 170 329 p + 751 328 p + 748 328 p + 752 328 p + 171 328 p + 165 328 p + 751 327 p + 748 327 p + 752 327 p + 771 327 p + 772 327 p + 171 327 p + 170 327 p + 708 326 p + 753 326 p + 711 326 p + 1031 326 p + 1032 326 p + 267 326 p + 266 326 p + 754 325 p + 755 325 p + 756 325 p + 776 325 p + 777 325 p + 280 325 p + 281 325 p + 754 324 p + 755 324 p + 756 324 p + 712 324 p + 757 324 p + 281 324 p + 265 324 p + 754 323 p + 755 323 p + 756 323 p + 900 323 p + 829 323 p + 280 323 p + 265 323 p + 712 322 p + 757 322 p + 755 322 p + 1030 322 p + 1031 322 p + 266 322 p + 265 322 p + 758 321 p + 759 321 p + 742 321 p + 760 321 p + 761 321 p + 166 321 p + 173 321 p + 758 320 p + 759 320 p + 742 320 p + 764 320 p + 763 320 p + 173 320 p + 167 320 p + 760 319 p + 761 319 p + 758 319 p + 166 319 p + 172 319 p + 760 318 p + 761 318 p + 758 318 p + 778 318 p + 779 318 p + 172 318 p + 173 318 p + 762 317 p + 745 317 p + 763 317 p + 767 317 p + 766 317 p + 174 317 p + 168 317 p + 762 316 p + 745 316 p + 763 316 p + 764 316 p + 759 316 p + 174 316 p + 167 316 p + 764 315 p + 763 315 p + 759 315 p + 780 315 p + 781 315 p + 173 315 p + 174 315 p + 765 314 p + 746 314 p + 766 314 p + 770 314 p + 769 314 p + 175 314 p + 169 314 p + 765 313 p + 746 313 p + 766 313 p + 767 313 p + 762 313 p + 175 313 p + 168 313 p + 767 312 p + 766 312 p + 762 312 p + 783 312 p + 784 312 p + 174 312 p + 175 312 p + 768 311 p + 750 311 p + 769 311 p + 773 311 p + 772 311 p + 176 311 p + 170 311 p + 768 310 p + 750 310 p + 769 310 p + 770 310 p + 765 310 p + 176 310 p + 169 310 p + 770 309 p + 769 309 p + 765 309 p + 786 309 p + 787 309 p + 175 309 p + 176 309 p + 771 308 p + 752 308 p + 772 308 p + 774 308 p + 775 308 p + 177 308 p + 171 308 p + 771 307 p + 752 307 p + 772 307 p + 773 307 p + 768 307 p + 177 307 p + 170 307 p + 773 306 p + 772 306 p + 768 306 p + 789 306 p + 790 306 p + 176 306 p + 177 306 p + 774 305 p + 771 305 p + 775 305 p + 178 305 p + 171 305 p + 774 304 p + 771 304 p + 775 304 p + 794 304 p + 795 304 p + 178 304 p + 177 304 p + 341 303 p + 710 303 p + 776 303 p + 754 303 p + 777 303 p + 17 303 p + 281 303 p + 776 302 p + 754 302 p + 777 302 p + 335 302 p + 901 302 p + 17 302 p + 280 302 p + 778 301 p + 779 301 p + 761 301 p + 172 301 p + 179 301 p + 778 300 p + 779 300 p + 761 300 p + 782 300 p + 780 300 p + 179 300 p + 173 300 p + 780 299 p + 781 299 p + 764 299 p + 779 299 p + 782 299 p + 173 299 p + 180 299 p + 780 298 p + 781 298 p + 764 298 p + 785 298 p + 783 298 p + 180 298 p + 174 298 p + 779 297 p + 782 297 p + 780 297 p + 803 297 p + 804 297 p + 179 297 p + 180 297 p + 783 296 p + 784 296 p + 767 296 p + 781 296 p + 785 296 p + 174 296 p + 181 296 p + 783 295 p + 784 295 p + 767 295 p + 788 295 p + 787 295 p + 181 295 p + 175 295 p + 781 294 p + 785 294 p + 783 294 p + 805 294 p + 806 294 p + 180 294 p + 181 294 p + 786 293 p + 770 293 p + 787 293 p + 791 293 p + 790 293 p + 182 293 p + 176 293 p + 786 292 p + 770 292 p + 787 292 p + 788 292 p + 784 292 p + 182 292 p + 175 292 p + 788 291 p + 787 291 p + 784 291 p + 808 291 p + 809 291 p + 181 291 p + 182 291 p + 789 290 p + 773 290 p + 790 290 p + 792 290 p + 793 290 p + 183 290 p + 177 290 p + 789 289 p + 773 289 p + 790 289 p + 791 289 p + 786 289 p + 183 289 p + 176 289 p + 791 288 p + 790 288 p + 786 288 p + 811 288 p + 812 288 p + 182 288 p + 183 288 p + 792 287 p + 793 287 p + 789 287 p + 814 287 p + 815 287 p + 183 287 p + 184 287 p + 792 286 p + 793 286 p + 789 286 p + 796 286 p + 795 286 p + 184 286 p + 177 286 p + 794 285 p + 775 285 p + 795 285 p + 797 285 p + 798 285 p + 185 285 p + 178 285 p + 794 284 p + 775 284 p + 795 284 p + 796 284 p + 793 284 p + 185 284 p + 177 284 p + 796 283 p + 795 283 p + 793 283 p + 817 283 p + 818 283 p + 184 283 p + 185 283 p + 797 282 p + 794 282 p + 798 282 p + 187 282 p + 178 282 p + 797 281 p + 794 281 p + 798 281 p + 799 281 p + 800 281 p + 187 281 p + 185 281 p + 799 280 p + 798 280 p + 800 280 p + 801 280 p + 802 280 p + 186 280 p + 187 280 p + 799 279 p + 798 279 p + 800 279 p + 820 279 p + 821 279 p + 186 279 p + 185 279 p + 801 278 p + 799 278 p + 802 278 p + 0 278 p + 187 278 p + 801 277 p + 799 277 p + 802 277 p + 823 277 p + 825 277 p + 0 277 p + 186 277 p + 803 276 p + 804 276 p + 782 276 p + 179 276 p + 188 276 p + 803 275 p + 804 275 p + 782 275 p + 807 275 p + 805 275 p + 188 275 p + 180 275 p + 805 274 p + 806 274 p + 785 274 p + 804 274 p + 807 274 p + 180 274 p + 189 274 p + 805 273 p + 806 273 p + 785 273 p + 810 273 p + 808 273 p + 189 273 p + 181 273 p + 804 272 p + 807 272 p + 805 272 p + 831 272 p + 832 272 p + 188 272 p + 189 272 p + 808 271 p + 809 271 p + 788 271 p + 806 271 p + 810 271 p + 181 271 p + 190 271 p + 808 270 p + 809 270 p + 788 270 p + 813 270 p + 811 270 p + 190 270 p + 182 270 p + 806 269 p + 810 269 p + 808 269 p + 835 269 p + 836 269 p + 189 269 p + 190 269 p + 811 268 p + 812 268 p + 791 268 p + 809 268 p + 813 268 p + 182 268 p + 191 268 p + 811 267 p + 812 267 p + 791 267 p + 816 267 p + 814 267 p + 191 267 p + 183 267 p + 809 266 p + 813 266 p + 811 266 p + 838 266 p + 839 266 p + 190 266 p + 191 266 p + 814 265 p + 815 265 p + 792 265 p + 812 265 p + 816 265 p + 183 265 p + 192 265 p + 814 264 p + 815 264 p + 792 264 p + 819 264 p + 817 264 p + 192 264 p + 184 264 p + 812 263 p + 816 263 p + 814 263 p + 841 263 p + 842 263 p + 191 263 p + 192 263 p + 817 262 p + 818 262 p + 796 262 p + 815 262 p + 819 262 p + 184 262 p + 193 262 p + 817 261 p + 818 261 p + 796 261 p + 822 261 p + 820 261 p + 193 261 p + 185 261 p + 815 260 p + 819 260 p + 817 260 p + 844 260 p + 845 260 p + 192 260 p + 193 260 p + 820 259 p + 821 259 p + 800 259 p + 818 259 p + 822 259 p + 185 259 p + 194 259 p + 820 258 p + 821 258 p + 800 258 p + 823 258 p + 824 258 p + 194 258 p + 186 258 p + 818 257 p + 822 257 p + 820 257 p + 849 257 p + 847 257 p + 193 257 p + 194 257 p + 823 256 p + 821 256 p + 824 256 p + 802 256 p + 825 256 p + 195 256 p + 186 256 p + 823 255 p + 821 255 p + 824 255 p + 847 255 p + 848 255 p + 195 255 p + 194 255 p + 802 254 p + 823 254 p + 825 254 p + 826 254 p + 827 254 p + 0 254 p + 195 254 p + 825 253 p + 826 253 p + 827 253 p + 851 253 p + 852 253 p + 195 253 p + 196 253 p + 825 252 p + 826 252 p + 827 252 p + 0 252 p + 196 252 p + 828 251 p + 829 251 p + 830 251 p + 901 251 p + 927 251 p + 279 251 p + 280 251 p + 828 250 p + 829 250 p + 830 250 p + 756 250 p + 900 250 p + 280 250 p + 264 250 p + 828 249 p + 829 249 p + 830 249 p + 931 249 p + 929 249 p + 279 249 p + 264 249 p + 831 248 p + 832 248 p + 807 248 p + 833 248 p + 834 248 p + 188 248 p + 198 248 p + 831 247 p + 832 247 p + 807 247 p + 837 247 p + 835 247 p + 198 247 p + 189 247 p + 833 246 p + 834 246 p + 831 246 p + 188 246 p + 197 246 p + 833 245 p + 834 245 p + 831 245 p + 854 245 p + 855 245 p + 197 245 p + 198 245 p + 835 244 p + 836 244 p + 810 244 p + 832 244 p + 837 244 p + 189 244 p + 199 244 p + 835 243 p + 836 243 p + 810 243 p + 840 243 p + 838 243 p + 199 243 p + 190 243 p + 832 242 p + 837 242 p + 835 242 p + 856 242 p + 857 242 p + 198 242 p + 199 242 p + 838 241 p + 839 241 p + 813 241 p + 836 241 p + 840 241 p + 190 241 p + 200 241 p + 838 240 p + 839 240 p + 813 240 p + 843 240 p + 841 240 p + 200 240 p + 191 240 p + 836 239 p + 840 239 p + 838 239 p + 859 239 p + 860 239 p + 199 239 p + 200 239 p + 841 238 p + 842 238 p + 816 238 p + 839 238 p + 843 238 p + 191 238 p + 201 238 p + 841 237 p + 842 237 p + 816 237 p + 846 237 p + 844 237 p + 201 237 p + 192 237 p + 839 236 p + 843 236 p + 841 236 p + 862 236 p + 863 236 p + 200 236 p + 201 236 p + 844 235 p + 845 235 p + 819 235 p + 842 235 p + 846 235 p + 192 235 p + 202 235 p + 844 234 p + 845 234 p + 819 234 p + 850 234 p + 849 234 p + 202 234 p + 193 234 p + 842 233 p + 846 233 p + 844 233 p + 865 233 p + 866 233 p + 201 233 p + 202 233 p + 847 232 p + 848 232 p + 824 232 p + 849 232 p + 822 232 p + 194 232 p + 203 232 p + 847 231 p + 848 231 p + 824 231 p + 853 231 p + 852 231 p + 203 231 p + 195 231 p + 849 230 p + 847 230 p + 822 230 p + 845 230 p + 850 230 p + 193 230 p + 203 230 p + 845 229 p + 850 229 p + 849 229 p + 870 229 p + 871 229 p + 202 229 p + 203 229 p + 851 228 p + 826 228 p + 852 228 p + 204 228 p + 196 228 p + 851 227 p + 826 227 p + 852 227 p + 853 227 p + 848 227 p + 204 227 p + 195 227 p + 853 226 p + 852 226 p + 848 226 p + 871 226 p + 873 226 p + 203 226 p + 204 226 p + 854 225 p + 855 225 p + 834 225 p + 197 225 p + 205 225 p + 854 224 p + 855 224 p + 834 224 p + 858 224 p + 856 224 p + 205 224 p + 198 224 p + 856 223 p + 857 223 p + 837 223 p + 855 223 p + 858 223 p + 198 223 p + 206 223 p + 856 222 p + 857 222 p + 837 222 p + 861 222 p + 859 222 p + 206 222 p + 199 222 p + 855 221 p + 858 221 p + 856 221 p + 876 221 p + 877 221 p + 205 221 p + 206 221 p + 859 220 p + 860 220 p + 840 220 p + 857 220 p + 861 220 p + 199 220 p + 207 220 p + 859 219 p + 860 219 p + 840 219 p + 864 219 p + 862 219 p + 207 219 p + 200 219 p + 857 218 p + 861 218 p + 859 218 p + 878 218 p + 879 218 p + 206 218 p + 207 218 p + 862 217 p + 863 217 p + 843 217 p + 860 217 p + 864 217 p + 200 217 p + 208 217 p + 862 216 p + 863 216 p + 843 216 p + 867 216 p + 865 216 p + 208 216 p + 201 216 p + 860 215 p + 864 215 p + 862 215 p + 881 215 p + 882 215 p + 207 215 p + 208 215 p + 865 214 p + 866 214 p + 846 214 p + 863 214 p + 867 214 p + 201 214 p + 209 214 p + 865 213 p + 866 213 p + 846 213 p + 868 213 p + 869 213 p + 209 213 p + 202 213 p + 863 212 p + 867 212 p + 865 212 p + 884 212 p + 885 212 p + 208 212 p + 209 212 p + 866 211 p + 868 211 p + 869 211 p + 887 211 p + 888 211 p + 209 211 p + 210 211 p + 866 210 p + 868 210 p + 869 210 p + 872 210 p + 870 210 p + 202 210 p + 210 210 p + 870 209 p + 871 209 p + 850 209 p + 869 209 p + 872 209 p + 202 209 p + 211 209 p + 870 208 p + 871 208 p + 850 208 p + 873 208 p + 853 208 p + 211 208 p + 203 208 p + 869 207 p + 872 207 p + 870 207 p + 890 207 p + 891 207 p + 210 207 p + 211 207 p + 871 206 p + 873 206 p + 853 206 p + 874 206 p + 875 206 p + 211 206 p + 204 206 p + 873 205 p + 874 205 p + 875 205 p + 895 205 p + 896 205 p + 211 205 p + 212 205 p + 873 204 p + 874 204 p + 875 204 p + 204 204 p + 212 204 p + 876 203 p + 877 203 p + 858 203 p + 205 203 p + 213 203 p + 876 202 p + 877 202 p + 858 202 p + 880 202 p + 878 202 p + 213 202 p + 206 202 p + 878 201 p + 879 201 p + 861 201 p + 877 201 p + 880 201 p + 206 201 p + 214 201 p + 878 200 p + 879 200 p + 861 200 p + 883 200 p + 881 200 p + 214 200 p + 207 200 p + 877 199 p + 880 199 p + 878 199 p + 902 199 p + 903 199 p + 213 199 p + 214 199 p + 881 198 p + 882 198 p + 864 198 p + 879 198 p + 883 198 p + 207 198 p + 215 198 p + 881 197 p + 882 197 p + 864 197 p + 886 197 p + 884 197 p + 215 197 p + 208 197 p + 879 196 p + 883 196 p + 881 196 p + 906 196 p + 907 196 p + 214 196 p + 215 196 p + 884 195 p + 885 195 p + 867 195 p + 882 195 p + 886 195 p + 208 195 p + 216 195 p + 884 194 p + 885 194 p + 867 194 p + 889 194 p + 887 194 p + 216 194 p + 209 194 p + 882 193 p + 886 193 p + 884 193 p + 909 193 p + 910 193 p + 215 193 p + 216 193 p + 887 192 p + 888 192 p + 868 192 p + 885 192 p + 889 192 p + 209 192 p + 217 192 p + 887 191 p + 888 191 p + 868 191 p + 892 191 p + 890 191 p + 217 191 p + 210 191 p + 885 190 p + 889 190 p + 887 190 p + 912 190 p + 913 190 p + 216 190 p + 217 190 p + 890 189 p + 891 189 p + 872 189 p + 888 189 p + 892 189 p + 210 189 p + 218 189 p + 890 188 p + 891 188 p + 872 188 p + 893 188 p + 894 188 p + 218 188 p + 211 188 p + 888 187 p + 892 187 p + 890 187 p + 915 187 p + 916 187 p + 217 187 p + 218 187 p + 891 186 p + 893 186 p + 894 186 p + 918 186 p + 919 186 p + 218 186 p + 219 186 p + 891 185 p + 893 185 p + 894 185 p + 897 185 p + 895 185 p + 211 185 p + 219 185 p + 895 184 p + 896 184 p + 874 184 p + 894 184 p + 897 184 p + 211 184 p + 220 184 p + 895 183 p + 896 183 p + 874 183 p + 898 183 p + 899 183 p + 220 183 p + 212 183 p + 894 182 p + 897 182 p + 895 182 p + 921 182 p + 922 182 p + 219 182 p + 220 182 p + 896 181 p + 898 181 p + 899 181 p + 924 181 p + 925 181 p + 220 181 p + 221 181 p + 896 180 p + 898 180 p + 899 180 p + 212 180 p + 221 180 p + 756 179 p + 900 179 p + 829 179 p + 1028 179 p + 1030 179 p + 265 179 p + 264 179 p + 335 178 p + 777 178 p + 901 178 p + 828 178 p + 927 178 p + 16 178 p + 280 178 p + 902 177 p + 903 177 p + 880 177 p + 904 177 p + 905 177 p + 213 177 p + 223 177 p + 902 176 p + 903 176 p + 880 176 p + 908 176 p + 906 176 p + 223 176 p + 214 176 p + 904 175 p + 905 175 p + 902 175 p + 213 175 p + 222 175 p + 904 174 p + 905 174 p + 902 174 p + 934 174 p + 935 174 p + 222 174 p + 223 174 p + 906 173 p + 907 173 p + 883 173 p + 903 173 p + 908 173 p + 214 173 p + 224 173 p + 906 172 p + 907 172 p + 883 172 p + 911 172 p + 909 172 p + 224 172 p + 215 172 p + 903 171 p + 908 171 p + 906 171 p + 935 171 p + 938 171 p + 223 171 p + 224 171 p + 909 170 p + 910 170 p + 886 170 p + 907 170 p + 911 170 p + 215 170 p + 225 170 p + 909 169 p + 910 169 p + 886 169 p + 914 169 p + 912 169 p + 225 169 p + 216 169 p + 907 168 p + 911 168 p + 909 168 p + 939 168 p + 940 168 p + 224 168 p + 225 168 p + 912 167 p + 913 167 p + 889 167 p + 910 167 p + 914 167 p + 216 167 p + 226 167 p + 912 166 p + 913 166 p + 889 166 p + 917 166 p + 915 166 p + 226 166 p + 217 166 p + 910 165 p + 914 165 p + 912 165 p + 942 165 p + 943 165 p + 225 165 p + 226 165 p + 915 164 p + 916 164 p + 892 164 p + 913 164 p + 917 164 p + 217 164 p + 227 164 p + 915 163 p + 916 163 p + 892 163 p + 920 163 p + 918 163 p + 227 163 p + 218 163 p + 913 162 p + 917 162 p + 915 162 p + 945 162 p + 946 162 p + 226 162 p + 227 162 p + 918 161 p + 919 161 p + 893 161 p + 916 161 p + 920 161 p + 218 161 p + 228 161 p + 918 160 p + 919 160 p + 893 160 p + 923 160 p + 921 160 p + 228 160 p + 219 160 p + 916 159 p + 920 159 p + 918 159 p + 948 159 p + 949 159 p + 227 159 p + 228 159 p + 921 158 p + 922 158 p + 897 158 p + 919 158 p + 923 158 p + 219 158 p + 229 158 p + 921 157 p + 922 157 p + 897 157 p + 926 157 p + 924 157 p + 229 157 p + 220 157 p + 919 156 p + 923 156 p + 921 156 p + 951 156 p + 952 156 p + 228 156 p + 229 156 p + 924 155 p + 925 155 p + 898 155 p + 922 155 p + 926 155 p + 220 155 p + 230 155 p + 924 154 p + 925 154 p + 898 154 p + 230 154 p + 221 154 p + 922 153 p + 926 153 p + 924 153 p + 956 153 p + 957 153 p + 229 153 p + 230 153 p + 901 152 p + 828 152 p + 927 152 p + 329 152 p + 932 152 p + 16 152 p + 279 152 p + 928 151 p + 929 151 p + 930 151 p + 933 151 p + 993 151 p + 278 151 p + 279 151 p + 928 150 p + 929 150 p + 930 150 p + 830 150 p + 931 150 p + 279 150 p + 263 150 p + 928 149 p + 929 149 p + 930 149 p + 1027 149 p + 995 149 p + 278 149 p + 263 149 p + 830 148 p + 931 148 p + 929 148 p + 1029 148 p + 1025 148 p + 264 148 p + 263 148 p + 331 147 p + 932 147 p + 933 147 p + 329 147 p + 927 147 p + 15 147 p + 279 147 p + 331 146 p + 932 146 p + 933 146 p + 928 146 p + 993 146 p + 14 146 p + 279 146 p + 934 145 p + 935 145 p + 905 145 p + 936 145 p + 937 145 p + 222 145 p + 232 145 p + 934 144 p + 935 144 p + 905 144 p + 938 144 p + 908 144 p + 232 144 p + 223 144 p + 936 143 p + 937 143 p + 934 143 p + 222 143 p + 231 143 p + 936 142 p + 937 142 p + 934 142 p + 961 142 p + 962 142 p + 231 142 p + 232 142 p + 935 141 p + 938 141 p + 908 141 p + 941 141 p + 939 141 p + 232 141 p + 224 141 p + 939 140 p + 940 140 p + 911 140 p + 938 140 p + 941 140 p + 224 140 p + 233 140 p + 939 139 p + 940 139 p + 911 139 p + 944 139 p + 942 139 p + 233 139 p + 225 139 p + 938 138 p + 941 138 p + 939 138 p + 963 138 p + 964 138 p + 232 138 p + 233 138 p + 942 137 p + 943 137 p + 914 137 p + 940 137 p + 944 137 p + 225 137 p + 234 137 p + 942 136 p + 943 136 p + 914 136 p + 947 136 p + 945 136 p + 234 136 p + 226 136 p + 940 135 p + 944 135 p + 942 135 p + 970 135 p + 968 135 p + 233 135 p + 234 135 p + 945 134 p + 946 134 p + 917 134 p + 943 134 p + 947 134 p + 226 134 p + 235 134 p + 945 133 p + 946 133 p + 917 133 p + 950 133 p + 948 133 p + 235 133 p + 227 133 p + 943 132 p + 947 132 p + 945 132 p + 968 132 p + 969 132 p + 234 132 p + 235 132 p + 948 131 p + 949 131 p + 920 131 p + 946 131 p + 950 131 p + 227 131 p + 236 131 p + 948 130 p + 949 130 p + 920 130 p + 953 130 p + 951 130 p + 236 130 p + 228 130 p + 946 129 p + 950 129 p + 948 129 p + 972 129 p + 973 129 p + 235 129 p + 236 129 p + 951 128 p + 952 128 p + 923 128 p + 949 128 p + 953 128 p + 228 128 p + 237 128 p + 951 127 p + 952 127 p + 923 127 p + 954 127 p + 955 127 p + 237 127 p + 229 127 p + 949 126 p + 953 126 p + 951 126 p + 975 126 p + 976 126 p + 236 126 p + 237 126 p + 952 125 p + 954 125 p + 955 125 p + 978 125 p + 979 125 p + 237 125 p + 238 125 p + 952 124 p + 954 124 p + 955 124 p + 958 124 p + 956 124 p + 229 124 p + 238 124 p + 956 123 p + 957 123 p + 926 123 p + 955 123 p + 958 123 p + 229 123 p + 239 123 p + 956 122 p + 957 122 p + 926 122 p + 959 122 p + 960 122 p + 239 122 p + 230 122 p + 955 121 p + 958 121 p + 956 121 p + 981 121 p + 982 121 p + 238 121 p + 239 121 p + 957 120 p + 959 120 p + 960 120 p + 986 120 p + 987 120 p + 239 120 p + 240 120 p + 957 119 p + 959 119 p + 960 119 p + 230 119 p + 240 119 p + 961 118 p + 962 118 p + 937 118 p + 231 118 p + 241 118 p + 961 117 p + 962 117 p + 937 117 p + 965 117 p + 963 117 p + 241 117 p + 232 117 p + 963 116 p + 964 116 p + 941 116 p + 962 116 p + 965 116 p + 232 116 p + 242 116 p + 963 115 p + 964 115 p + 941 115 p + 966 115 p + 967 115 p + 242 115 p + 233 115 p + 962 114 p + 965 114 p + 963 114 p + 997 114 p + 998 114 p + 241 114 p + 242 114 p + 964 113 p + 966 113 p + 967 113 p + 999 113 p + 1000 113 p + 242 113 p + 243 113 p + 964 112 p + 966 112 p + 967 112 p + 971 112 p + 970 112 p + 233 112 p + 243 112 p + 968 111 p + 969 111 p + 947 111 p + 970 111 p + 944 111 p + 234 111 p + 244 111 p + 968 110 p + 969 110 p + 947 110 p + 974 110 p + 972 110 p + 244 110 p + 235 110 p + 970 109 p + 968 109 p + 944 109 p + 967 109 p + 971 109 p + 233 109 p + 244 109 p + 967 108 p + 971 108 p + 970 108 p + 1002 108 p + 1003 108 p + 243 108 p + 244 108 p + 972 107 p + 973 107 p + 950 107 p + 969 107 p + 974 107 p + 235 107 p + 245 107 p + 972 106 p + 973 106 p + 950 106 p + 977 106 p + 975 106 p + 245 106 p + 236 106 p + 969 105 p + 974 105 p + 972 105 p + 1007 105 p + 1008 105 p + 244 105 p + 245 105 p + 975 104 p + 976 104 p + 953 104 p + 973 104 p + 977 104 p + 236 104 p + 246 104 p + 975 103 p + 976 103 p + 953 103 p + 980 103 p + 978 103 p + 246 103 p + 237 103 p + 973 102 p + 977 102 p + 975 102 p + 1010 102 p + 1011 102 p + 245 102 p + 246 102 p + 978 101 p + 979 101 p + 954 101 p + 976 101 p + 980 101 p + 237 101 p + 247 101 p + 978 100 p + 979 100 p + 954 100 p + 983 100 p + 981 100 p + 247 100 p + 238 100 p + 976 99 p + 980 99 p + 978 99 p + 1013 99 p + 1014 99 p + 246 99 p + 247 99 p + 981 98 p + 982 98 p + 958 98 p + 979 98 p + 983 98 p + 238 98 p + 248 98 p + 981 97 p + 982 97 p + 958 97 p + 984 97 p + 985 97 p + 248 97 p + 239 97 p + 979 96 p + 983 96 p + 981 96 p + 1016 96 p + 1017 96 p + 247 96 p + 248 96 p + 984 95 p + 985 95 p + 982 95 p + 1019 95 p + 1020 95 p + 248 95 p + 249 95 p + 984 94 p + 985 94 p + 982 94 p + 988 94 p + 987 94 p + 249 94 p + 239 94 p + 986 93 p + 959 93 p + 987 93 p + 989 93 p + 990 93 p + 250 93 p + 240 93 p + 986 92 p + 959 92 p + 987 92 p + 988 92 p + 985 92 p + 250 92 p + 239 92 p + 988 91 p + 987 91 p + 985 91 p + 1022 91 p + 1023 91 p + 249 91 p + 250 91 p + 986 90 p + 989 90 p + 990 90 p + 1025 90 p + 1026 90 p + 250 90 p + 251 90 p + 986 89 p + 989 89 p + 990 89 p + 991 89 p + 992 89 p + 240 89 p + 251 89 p + 990 88 p + 991 88 p + 992 88 p + 1028 88 p + 1029 88 p + 251 88 p + 252 88 p + 990 87 p + 991 87 p + 992 87 p + 240 87 p + 252 87 p + 933 86 p + 928 86 p + 993 86 p + 1079 86 p + 324 86 p + 14 86 p + 278 86 p + 994 85 p + 995 85 p + 996 85 p + 1076 85 p + 1079 85 p + 277 85 p + 278 85 p + 994 84 p + 995 84 p + 996 84 p + 930 84 p + 1027 84 p + 278 84 p + 262 84 p + 994 83 p + 995 83 p + 996 83 p + 1078 83 p + 1024 83 p + 277 83 p + 262 83 p + 997 82 p + 998 82 p + 965 82 p + 241 82 p + 253 82 p + 997 81 p + 998 81 p + 965 81 p + 1001 81 p + 999 81 p + 253 81 p + 242 81 p + 999 80 p + 1000 80 p + 966 80 p + 998 80 p + 1001 80 p + 242 80 p + 254 80 p + 999 79 p + 1000 79 p + 966 79 p + 1004 79 p + 1002 79 p + 254 79 p + 243 79 p + 998 78 p + 1001 78 p + 999 78 p + 1033 78 p + 1034 78 p + 253 78 p + 254 78 p + 1002 77 p + 1003 77 p + 971 77 p + 1000 77 p + 1004 77 p + 243 77 p + 255 77 p + 1002 76 p + 1003 76 p + 971 76 p + 1005 76 p + 1006 76 p + 255 76 p + 244 76 p + 1000 75 p + 1004 75 p + 1002 75 p + 1035 75 p + 1036 75 p + 254 75 p + 255 75 p + 1003 74 p + 1005 74 p + 1006 74 p + 1041 74 p + 1042 74 p + 255 74 p + 256 74 p + 1003 73 p + 1005 73 p + 1006 73 p + 1009 73 p + 1007 73 p + 244 73 p + 256 73 p + 1007 72 p + 1008 72 p + 974 72 p + 1006 72 p + 1009 72 p + 244 72 p + 257 72 p + 1007 71 p + 1008 71 p + 974 71 p + 1012 71 p + 1010 71 p + 257 71 p + 245 71 p + 1006 70 p + 1009 70 p + 1007 70 p + 1055 70 p + 1050 70 p + 256 70 p + 257 70 p + 1010 69 p + 1011 69 p + 977 69 p + 1008 69 p + 1012 69 p + 245 69 p + 258 69 p + 1010 68 p + 1011 68 p + 977 68 p + 1015 68 p + 1013 68 p + 258 68 p + 246 68 p + 1008 67 p + 1012 67 p + 1010 67 p + 1050 67 p + 1051 67 p + 257 67 p + 258 67 p + 1013 66 p + 1014 66 p + 980 66 p + 1011 66 p + 1015 66 p + 246 66 p + 259 66 p + 1013 65 p + 1014 65 p + 980 65 p + 1018 65 p + 1016 65 p + 259 65 p + 247 65 p + 1011 64 p + 1015 64 p + 1013 64 p + 1056 64 p + 1057 64 p + 258 64 p + 259 64 p + 1016 63 p + 1017 63 p + 983 63 p + 1014 63 p + 1018 63 p + 247 63 p + 260 63 p + 1016 62 p + 1017 62 p + 983 62 p + 1021 62 p + 1019 62 p + 260 62 p + 248 62 p + 1014 61 p + 1018 61 p + 1016 61 p + 1068 61 p + 1069 61 p + 259 61 p + 260 61 p + 1019 60 p + 1020 60 p + 984 60 p + 1017 60 p + 1021 60 p + 248 60 p + 261 60 p + 1019 59 p + 1020 59 p + 984 59 p + 1024 59 p + 1022 59 p + 261 59 p + 249 59 p + 1017 58 p + 1021 58 p + 1019 58 p + 1073 58 p + 1074 58 p + 260 58 p + 261 58 p + 1022 57 p + 1023 57 p + 988 57 p + 1020 57 p + 1024 57 p + 249 57 p + 262 57 p + 1022 56 p + 1023 56 p + 988 56 p + 1027 56 p + 1026 56 p + 262 56 p + 250 56 p + 1020 55 p + 1024 55 p + 1022 55 p + 1078 55 p + 996 55 p + 261 55 p + 262 55 p + 1025 54 p + 989 54 p + 1026 54 p + 931 54 p + 1029 54 p + 263 54 p + 251 54 p + 1025 53 p + 989 53 p + 1026 53 p + 1027 53 p + 1023 53 p + 263 53 p + 250 53 p + 1027 52 p + 1026 52 p + 1023 52 p + 930 52 p + 995 52 p + 262 52 p + 263 52 p + 1028 51 p + 991 51 p + 1029 51 p + 900 51 p + 1030 51 p + 264 51 p + 252 51 p + 1028 50 p + 991 50 p + 1029 50 p + 931 50 p + 1025 50 p + 264 50 p + 251 50 p + 1028 49 p + 900 49 p + 1030 49 p + 757 49 p + 1031 49 p + 252 49 p + 265 49 p + 1030 48 p + 757 48 p + 1031 48 p + 753 48 p + 1032 48 p + 252 48 p + 266 48 p + 1031 47 p + 753 47 p + 1032 47 p + 252 47 p + 267 47 p + 1033 46 p + 1034 46 p + 1001 46 p + 253 46 p + 268 46 p + 1033 45 p + 1034 45 p + 1001 45 p + 1040 45 p + 1035 45 p + 268 45 p + 254 45 p + 1035 44 p + 1036 44 p + 1004 44 p + 1034 44 p + 1040 44 p + 254 44 p + 269 44 p + 1035 43 p + 1036 43 p + 1004 43 p + 1045 43 p + 1041 43 p + 269 43 p + 255 43 p + 1037 42 p + 287 42 p + 1038 42 p + 1039 42 p + 1040 42 p + 269 42 p + 4 42 p + 1037 41 p + 287 41 p + 1038 41 p + 1043 41 p + 1045 41 p + 269 41 p + 5 41 p + 1039 40 p + 1037 40 p + 1040 40 p + 268 40 p + 4 40 p + 1039 39 p + 1037 39 p + 1040 39 p + 1034 39 p + 1035 39 p + 268 39 p + 269 39 p + 1041 38 p + 1042 38 p + 1005 38 p + 1036 38 p + 1045 38 p + 255 38 p + 270 38 p + 1041 37 p + 1042 37 p + 1005 37 p + 1048 37 p + 1049 37 p + 270 37 p + 256 37 p + 1043 36 p + 292 36 p + 1044 36 p + 1038 36 p + 1045 36 p + 270 36 p + 5 36 p + 1043 35 p + 292 35 p + 1044 35 p + 1046 35 p + 1048 35 p + 270 35 p + 6 35 p + 1038 34 p + 1043 34 p + 1045 34 p + 1036 34 p + 1041 34 p + 269 34 p + 270 34 p + 1046 33 p + 296 33 p + 1047 33 p + 1044 33 p + 1048 33 p + 271 33 p + 6 33 p + 1046 32 p + 296 32 p + 1047 32 p + 1052 32 p + 1054 32 p + 271 32 p + 7 32 p + 1044 31 p + 1046 31 p + 1048 31 p + 1042 31 p + 1049 31 p + 270 31 p + 271 31 p + 1042 30 p + 1048 30 p + 1049 30 p + 1054 30 p + 1055 30 p + 256 30 p + 271 30 p + 1050 29 p + 1051 29 p + 1012 29 p + 1055 29 p + 1009 29 p + 257 29 p + 272 29 p + 1050 28 p + 1051 28 p + 1012 28 p + 1060 28 p + 1056 28 p + 272 28 p + 258 28 p + 1052 27 p + 300 27 p + 1053 27 p + 1047 27 p + 1054 27 p + 272 27 p + 7 27 p + 1052 26 p + 300 26 p + 1053 26 p + 1058 26 p + 1060 26 p + 272 26 p + 8 26 p + 1047 25 p + 1052 25 p + 1054 25 p + 1049 25 p + 1055 25 p + 271 25 p + 272 25 p + 1055 24 p + 1050 24 p + 1009 24 p + 1049 24 p + 1054 24 p + 256 24 p + 272 24 p + 1056 23 p + 1057 23 p + 1015 23 p + 1051 23 p + 1060 23 p + 258 23 p + 273 23 p + 1056 22 p + 1057 22 p + 1015 22 p + 1063 22 p + 1064 22 p + 273 22 p + 259 22 p + 1058 21 p + 304 21 p + 1059 21 p + 1053 21 p + 1060 21 p + 273 21 p + 8 21 p + 1058 20 p + 304 20 p + 1059 20 p + 1061 20 p + 1063 20 p + 273 20 p + 9 20 p + 1053 19 p + 1058 19 p + 1060 19 p + 1051 19 p + 1056 19 p + 272 19 p + 273 19 p + 1061 18 p + 308 18 p + 1062 18 p + 1059 18 p + 1063 18 p + 274 18 p + 9 18 p + 1061 17 p + 308 17 p + 1062 17 p + 1065 17 p + 1067 17 p + 274 17 p + 10 17 p + 1059 16 p + 1061 16 p + 1063 16 p + 1057 16 p + 1064 16 p + 273 16 p + 274 16 p + 1057 15 p + 1063 15 p + 1064 15 p + 1067 15 p + 1068 15 p + 259 15 p + 274 15 p + 1065 14 p + 312 14 p + 1066 14 p + 1062 14 p + 1067 14 p + 275 14 p + 10 14 p + 1065 13 p + 312 13 p + 1066 13 p + 1070 13 p + 1072 13 p + 275 13 p + 11 13 p + 1062 12 p + 1065 12 p + 1067 12 p + 1064 12 p + 1068 12 p + 274 12 p + 275 12 p + 1068 11 p + 1069 11 p + 1018 11 p + 1064 11 p + 1067 11 p + 259 11 p + 275 11 p + 1068 10 p + 1069 10 p + 1018 10 p + 1072 10 p + 1073 10 p + 275 10 p + 260 10 p + 1070 9 p + 316 9 p + 1071 9 p + 1066 9 p + 1072 9 p + 276 9 p + 11 9 p + 1070 8 p + 316 8 p + 1071 8 p + 1075 8 p + 1077 8 p + 276 8 p + 12 8 p + 1066 7 p + 1070 7 p + 1072 7 p + 1069 7 p + 1073 7 p + 275 7 p + 276 7 p + 1073 6 p + 1074 6 p + 1021 6 p + 1069 6 p + 1072 6 p + 260 6 p + 276 6 p + 1073 5 p + 1074 5 p + 1021 5 p + 1077 5 p + 1078 5 p + 276 5 p + 261 5 p + 1075 4 p + 320 4 p + 1076 4 p + 1071 4 p + 1077 4 p + 277 4 p + 12 4 p + 1075 3 p + 320 3 p + 1076 3 p + 1079 3 p + 994 3 p + 277 3 p + 13 3 p + 1071 2 p + 1075 2 p + 1077 2 p + 1074 2 p + 1078 2 p + 276 2 p + 277 2 p + 1078 1 p + 996 1 p + 1024 1 p + 1074 1 p + 1077 1 p + 261 1 p + 277 1 p + 1079 0 p + 324 0 p + 993 0 p + 1076 0 p + 994 0 p + 278 0 p + 13 0 p +showpage diff --git a/DOC/msh8.pdf b/DOC/msh8.pdf new file mode 100644 index 0000000..ec0f6b2 Binary files /dev/null and b/DOC/msh8.pdf differ diff --git a/DOC/msh8.ps b/DOC/msh8.ps new file mode 100644 index 0000000..2b15651 --- /dev/null +++ b/DOC/msh8.ps @@ -0,0 +1,10937 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: PSPLTM routine +%%BoundingBox: 80 0 530 450 +%%EndComments +/cm {72 mul 2.54 div} def +/mc {72 div 2.54 mul} def +/pnum { 72 div 2.54 mul 20 string +cvs print ( ) print} def +/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def +gsave + /Helvetica findfont 8.33333E-02 cm scalefont setfont + 10.7950 cm 0.500000 cm moveto +( ) Cshow + 3.17500 cm 0.333333 cm translate + 15.2400 cm 6.00000 div dup scale + 0.01 setlinewidth + 0.00 0.00 moveto + 0.00 0.29 lineto +closepath stroke + 0.00 0.00 moveto + 0.39 0.44 lineto +closepath stroke + 0.00 0.00 moveto + 0.63 0.00 lineto +closepath stroke + 6.00 0.00 moveto + 5.80 0.00 lineto +closepath stroke + 6.00 0.00 moveto + 5.80 0.23 lineto +closepath stroke + 6.00 0.00 moveto + 6.00 0.61 lineto +closepath stroke + 6.00 6.00 moveto + 6.00 5.39 lineto +closepath stroke + 6.00 6.00 moveto + 5.80 5.77 lineto +closepath stroke + 6.00 6.00 moveto + 5.80 6.00 lineto +closepath stroke + 0.00 6.00 moveto + 0.63 6.00 lineto +closepath stroke + 0.00 6.00 moveto + 0.39 5.56 lineto +closepath stroke + 0.00 6.00 moveto + 0.00 5.71 lineto +closepath stroke + 4.60 3.00 moveto + 4.66 3.05 lineto +closepath stroke + 4.60 3.00 moveto + 4.68 3.00 lineto +closepath stroke + 4.60 3.00 moveto + 4.59 3.03 lineto +closepath stroke + 4.60 3.00 moveto + 4.66 2.95 lineto +closepath stroke + 4.60 3.00 moveto + 4.59 2.97 lineto +closepath stroke + 4.75 3.00 moveto + 4.68 3.00 lineto +closepath stroke + 4.75 3.00 moveto + 4.74 3.05 lineto +closepath stroke + 4.75 3.00 moveto + 4.82 3.06 lineto +closepath stroke + 4.75 3.00 moveto + 4.83 3.00 lineto +closepath stroke + 4.75 3.00 moveto + 4.82 2.94 lineto +closepath stroke + 4.75 3.00 moveto + 4.74 2.95 lineto +closepath stroke + 4.91 3.00 moveto + 4.83 3.00 lineto +closepath stroke + 4.91 3.00 moveto + 4.90 3.06 lineto +closepath stroke + 4.91 3.00 moveto + 4.99 3.08 lineto +closepath stroke + 4.91 3.00 moveto + 5.01 3.00 lineto +closepath stroke + 4.91 3.00 moveto + 4.99 2.92 lineto +closepath stroke + 4.91 3.00 moveto + 4.90 2.94 lineto +closepath stroke + 5.10 3.00 moveto + 5.01 3.00 lineto +closepath stroke + 5.10 3.00 moveto + 5.08 3.08 lineto +closepath stroke + 5.10 3.00 moveto + 5.18 3.10 lineto +closepath stroke + 5.10 3.00 moveto + 5.20 3.00 lineto +closepath stroke + 5.10 3.00 moveto + 5.18 2.90 lineto +closepath stroke + 5.10 3.00 moveto + 5.08 2.92 lineto +closepath stroke + 5.30 3.00 moveto + 5.20 3.00 lineto +closepath stroke + 5.30 3.00 moveto + 5.28 3.10 lineto +closepath stroke + 5.30 3.00 moveto + 5.38 3.13 lineto +closepath stroke + 5.30 3.00 moveto + 5.41 3.00 lineto +closepath stroke + 5.30 3.00 moveto + 5.38 2.87 lineto +closepath stroke + 5.30 3.00 moveto + 5.28 2.90 lineto +closepath stroke + 5.52 3.00 moveto + 5.41 3.00 lineto +closepath stroke + 5.52 3.00 moveto + 5.49 3.13 lineto +closepath stroke + 5.52 3.00 moveto + 5.61 3.15 lineto +closepath stroke + 5.52 3.00 moveto + 5.76 3.00 lineto +closepath stroke + 5.52 3.00 moveto + 5.61 2.85 lineto +closepath stroke + 5.52 3.00 moveto + 5.49 2.87 lineto +closepath stroke + 6.00 3.00 moveto + 5.76 3.00 lineto +closepath stroke + 6.00 3.00 moveto + 5.85 3.15 lineto +closepath stroke + 6.00 3.00 moveto + 6.00 3.15 lineto +closepath stroke + 6.00 3.00 moveto + 6.00 2.85 lineto +closepath stroke + 6.00 3.00 moveto + 5.85 2.85 lineto +closepath stroke + 4.58 3.06 moveto + 4.65 3.08 lineto +closepath stroke + 4.58 3.06 moveto + 4.59 3.03 lineto +closepath stroke + 4.58 3.06 moveto + 4.62 3.12 lineto +closepath stroke + 4.58 3.06 moveto + 4.56 3.09 lineto +closepath stroke + 4.73 3.09 moveto + 4.74 3.05 lineto +closepath stroke + 4.73 3.09 moveto + 4.66 3.05 lineto +closepath stroke + 4.73 3.09 moveto + 4.65 3.08 lineto +closepath stroke + 4.73 3.09 moveto + 4.81 3.11 lineto +closepath stroke + 4.73 3.09 moveto + 4.70 3.13 lineto +closepath stroke + 4.73 3.09 moveto + 4.77 3.17 lineto +closepath stroke + 4.89 3.13 moveto + 4.90 3.06 lineto +closepath stroke + 4.89 3.13 moveto + 4.82 3.06 lineto +closepath stroke + 4.89 3.13 moveto + 4.81 3.11 lineto +closepath stroke + 4.89 3.13 moveto + 4.98 3.15 lineto +closepath stroke + 4.89 3.13 moveto + 4.85 3.18 lineto +closepath stroke + 4.89 3.13 moveto + 4.93 3.22 lineto +closepath stroke + 5.06 3.16 moveto + 5.08 3.08 lineto +closepath stroke + 5.06 3.16 moveto + 4.99 3.08 lineto +closepath stroke + 5.06 3.16 moveto + 4.98 3.15 lineto +closepath stroke + 5.06 3.16 moveto + 5.16 3.18 lineto +closepath stroke + 5.06 3.16 moveto + 5.02 3.24 lineto +closepath stroke + 5.06 3.16 moveto + 5.10 3.28 lineto +closepath stroke + 5.26 3.21 moveto + 5.28 3.10 lineto +closepath stroke + 5.26 3.21 moveto + 5.18 3.10 lineto +closepath stroke + 5.26 3.21 moveto + 5.16 3.18 lineto +closepath stroke + 5.26 3.21 moveto + 5.36 3.23 lineto +closepath stroke + 5.26 3.21 moveto + 5.20 3.30 lineto +closepath stroke + 5.26 3.21 moveto + 5.30 3.34 lineto +closepath stroke + 5.47 3.25 moveto + 5.49 3.13 lineto +closepath stroke + 5.47 3.25 moveto + 5.38 3.13 lineto +closepath stroke + 5.47 3.25 moveto + 5.36 3.23 lineto +closepath stroke + 5.47 3.25 moveto + 5.59 3.28 lineto +closepath stroke + 5.47 3.25 moveto + 5.41 3.36 lineto +closepath stroke + 5.47 3.25 moveto + 5.51 3.41 lineto +closepath stroke + 5.70 3.30 moveto + 5.85 3.15 lineto +closepath stroke + 5.70 3.30 moveto + 5.61 3.15 lineto +closepath stroke + 5.70 3.30 moveto + 5.59 3.28 lineto +closepath stroke + 5.70 3.30 moveto + 5.85 3.30 lineto +closepath stroke + 5.70 3.30 moveto + 5.63 3.44 lineto +closepath stroke + 5.70 3.30 moveto + 5.85 3.49 lineto +closepath stroke + 6.00 3.30 moveto + 6.00 3.15 lineto +closepath stroke + 6.00 3.30 moveto + 5.85 3.30 lineto +closepath stroke + 6.00 3.30 moveto + 6.00 3.49 lineto +closepath stroke + 4.53 3.12 moveto + 4.60 3.15 lineto +closepath stroke + 4.53 3.12 moveto + 4.56 3.09 lineto +closepath stroke + 4.53 3.12 moveto + 4.55 3.18 lineto +closepath stroke + 4.53 3.12 moveto + 4.49 3.14 lineto +closepath stroke + 4.66 3.18 moveto + 4.70 3.13 lineto +closepath stroke + 4.66 3.18 moveto + 4.62 3.12 lineto +closepath stroke + 4.66 3.18 moveto + 4.60 3.15 lineto +closepath stroke + 4.66 3.18 moveto + 4.74 3.21 lineto +closepath stroke + 4.66 3.18 moveto + 4.61 3.21 lineto +closepath stroke + 4.66 3.18 moveto + 4.68 3.26 lineto +closepath stroke + 4.81 3.24 moveto + 4.85 3.18 lineto +closepath stroke + 4.81 3.24 moveto + 4.77 3.17 lineto +closepath stroke + 4.81 3.24 moveto + 4.74 3.21 lineto +closepath stroke + 4.81 3.24 moveto + 4.89 3.28 lineto +closepath stroke + 4.81 3.24 moveto + 4.75 3.29 lineto +closepath stroke + 4.81 3.24 moveto + 4.82 3.34 lineto +closepath stroke + 4.97 3.31 moveto + 5.02 3.24 lineto +closepath stroke + 4.97 3.31 moveto + 4.93 3.22 lineto +closepath stroke + 4.97 3.31 moveto + 4.89 3.28 lineto +closepath stroke + 4.97 3.31 moveto + 5.06 3.35 lineto +closepath stroke + 4.97 3.31 moveto + 4.90 3.37 lineto +closepath stroke + 4.97 3.31 moveto + 4.97 3.43 lineto +closepath stroke + 5.15 3.39 moveto + 5.20 3.30 lineto +closepath stroke + 5.15 3.39 moveto + 5.10 3.28 lineto +closepath stroke + 5.15 3.39 moveto + 5.06 3.35 lineto +closepath stroke + 5.15 3.39 moveto + 5.24 3.44 lineto +closepath stroke + 5.15 3.39 moveto + 5.06 3.47 lineto +closepath stroke + 5.15 3.39 moveto + 5.14 3.53 lineto +closepath stroke + 5.34 3.48 moveto + 5.41 3.36 lineto +closepath stroke + 5.34 3.48 moveto + 5.30 3.34 lineto +closepath stroke + 5.34 3.48 moveto + 5.24 3.44 lineto +closepath stroke + 5.34 3.48 moveto + 5.45 3.53 lineto +closepath stroke + 5.34 3.48 moveto + 5.24 3.57 lineto +closepath stroke + 5.34 3.48 moveto + 5.33 3.64 lineto +closepath stroke + 5.55 3.57 moveto + 5.63 3.44 lineto +closepath stroke + 5.55 3.57 moveto + 5.51 3.41 lineto +closepath stroke + 5.55 3.57 moveto + 5.45 3.53 lineto +closepath stroke + 5.55 3.57 moveto + 5.78 3.63 lineto +closepath stroke + 5.55 3.57 moveto + 5.44 3.69 lineto +closepath stroke + 5.55 3.57 moveto + 5.54 3.76 lineto +closepath stroke + 6.00 3.68 moveto + 6.00 3.49 lineto +closepath stroke + 6.00 3.68 moveto + 5.85 3.49 lineto +closepath stroke + 6.00 3.68 moveto + 5.78 3.63 lineto +closepath stroke + 6.00 3.68 moveto + 5.76 3.81 lineto +closepath stroke + 6.00 3.68 moveto + 5.87 3.89 lineto +closepath stroke + 6.00 3.68 moveto + 6.00 3.89 lineto +closepath stroke + 4.45 3.16 moveto + 4.51 3.21 lineto +closepath stroke + 4.45 3.16 moveto + 4.49 3.14 lineto +closepath stroke + 4.45 3.16 moveto + 4.45 3.23 lineto +closepath stroke + 4.45 3.16 moveto + 4.40 3.18 lineto +closepath stroke + 4.57 3.25 moveto + 4.61 3.21 lineto +closepath stroke + 4.57 3.25 moveto + 4.55 3.18 lineto +closepath stroke + 4.57 3.25 moveto + 4.51 3.21 lineto +closepath stroke + 4.57 3.25 moveto + 4.63 3.29 lineto +closepath stroke + 4.57 3.25 moveto + 4.50 3.27 lineto +closepath stroke + 4.57 3.25 moveto + 4.55 3.33 lineto +closepath stroke + 4.69 3.34 moveto + 4.75 3.29 lineto +closepath stroke + 4.69 3.34 moveto + 4.68 3.26 lineto +closepath stroke + 4.69 3.34 moveto + 4.63 3.29 lineto +closepath stroke + 4.69 3.34 moveto + 4.76 3.39 lineto +closepath stroke + 4.69 3.34 moveto + 4.62 3.37 lineto +closepath stroke + 4.69 3.34 moveto + 4.67 3.43 lineto +closepath stroke + 4.83 3.44 moveto + 4.90 3.37 lineto +closepath stroke + 4.83 3.44 moveto + 4.82 3.34 lineto +closepath stroke + 4.83 3.44 moveto + 4.76 3.39 lineto +closepath stroke + 4.83 3.44 moveto + 4.90 3.49 lineto +closepath stroke + 4.83 3.44 moveto + 4.74 3.48 lineto +closepath stroke + 4.83 3.44 moveto + 4.80 3.55 lineto +closepath stroke + 4.98 3.55 moveto + 5.06 3.47 lineto +closepath stroke + 4.98 3.55 moveto + 4.97 3.43 lineto +closepath stroke + 4.98 3.55 moveto + 4.90 3.49 lineto +closepath stroke + 4.98 3.55 moveto + 5.06 3.61 lineto +closepath stroke + 4.98 3.55 moveto + 4.87 3.60 lineto +closepath stroke + 4.98 3.55 moveto + 4.94 3.67 lineto +closepath stroke + 5.14 3.67 moveto + 5.24 3.57 lineto +closepath stroke + 5.14 3.67 moveto + 5.14 3.53 lineto +closepath stroke + 5.14 3.67 moveto + 5.06 3.61 lineto +closepath stroke + 5.14 3.67 moveto + 5.23 3.73 lineto +closepath stroke + 5.14 3.67 moveto + 5.02 3.73 lineto +closepath stroke + 5.14 3.67 moveto + 5.09 3.81 lineto +closepath stroke + 5.32 3.80 moveto + 5.44 3.69 lineto +closepath stroke + 5.32 3.80 moveto + 5.33 3.64 lineto +closepath stroke + 5.32 3.80 moveto + 5.23 3.73 lineto +closepath stroke + 5.32 3.80 moveto + 5.42 3.87 lineto +closepath stroke + 5.32 3.80 moveto + 5.18 3.88 lineto +closepath stroke + 5.32 3.80 moveto + 5.26 3.97 lineto +closepath stroke + 5.52 3.94 moveto + 5.76 3.81 lineto +closepath stroke + 5.52 3.94 moveto + 5.54 3.76 lineto +closepath stroke + 5.52 3.94 moveto + 5.42 3.87 lineto +closepath stroke + 5.52 3.94 moveto + 5.63 4.02 lineto +closepath stroke + 5.52 3.94 moveto + 5.36 4.04 lineto +closepath stroke + 5.52 3.94 moveto + 5.45 4.14 lineto +closepath stroke + 5.74 4.10 moveto + 5.87 3.89 lineto +closepath stroke + 5.74 4.10 moveto + 5.63 4.02 lineto +closepath stroke + 5.74 4.10 moveto + 5.87 4.10 lineto +closepath stroke + 5.74 4.10 moveto + 5.56 4.22 lineto +closepath stroke + 5.74 4.10 moveto + 5.65 4.32 lineto +closepath stroke + 6.00 4.10 moveto + 6.00 3.89 lineto +closepath stroke + 6.00 4.10 moveto + 5.87 4.10 lineto +closepath stroke + 6.00 4.10 moveto + 5.78 4.32 lineto +closepath stroke + 6.00 4.10 moveto + 6.00 4.44 lineto +closepath stroke + 4.36 3.20 moveto + 4.40 3.25 lineto +closepath stroke + 4.36 3.20 moveto + 4.40 3.18 lineto +closepath stroke + 4.36 3.20 moveto + 4.34 3.26 lineto +closepath stroke + 4.36 3.20 moveto + 4.30 3.21 lineto +closepath stroke + 4.44 3.30 moveto + 4.50 3.27 lineto +closepath stroke + 4.44 3.30 moveto + 4.45 3.23 lineto +closepath stroke + 4.44 3.30 moveto + 4.40 3.25 lineto +closepath stroke + 4.44 3.30 moveto + 4.49 3.35 lineto +closepath stroke + 4.44 3.30 moveto + 4.38 3.31 lineto +closepath stroke + 4.44 3.30 moveto + 4.41 3.37 lineto +closepath stroke + 4.54 3.40 moveto + 4.62 3.37 lineto +closepath stroke + 4.54 3.40 moveto + 4.55 3.33 lineto +closepath stroke + 4.54 3.40 moveto + 4.49 3.35 lineto +closepath stroke + 4.54 3.40 moveto + 4.60 3.46 lineto +closepath stroke + 4.54 3.40 moveto + 4.46 3.43 lineto +closepath stroke + 4.54 3.40 moveto + 4.50 3.49 lineto +closepath stroke + 4.65 3.52 moveto + 4.74 3.48 lineto +closepath stroke + 4.65 3.52 moveto + 4.67 3.43 lineto +closepath stroke + 4.65 3.52 moveto + 4.60 3.46 lineto +closepath stroke + 4.65 3.52 moveto + 4.71 3.59 lineto +closepath stroke + 4.65 3.52 moveto + 4.55 3.55 lineto +closepath stroke + 4.65 3.52 moveto + 4.60 3.62 lineto +closepath stroke + 4.77 3.66 moveto + 4.87 3.60 lineto +closepath stroke + 4.77 3.66 moveto + 4.80 3.55 lineto +closepath stroke + 4.77 3.66 moveto + 4.71 3.59 lineto +closepath stroke + 4.77 3.66 moveto + 4.83 3.73 lineto +closepath stroke + 4.77 3.66 moveto + 4.66 3.69 lineto +closepath stroke + 4.77 3.66 moveto + 4.70 3.77 lineto +closepath stroke + 4.90 3.80 moveto + 5.02 3.73 lineto +closepath stroke + 4.90 3.80 moveto + 4.94 3.67 lineto +closepath stroke + 4.90 3.80 moveto + 4.83 3.73 lineto +closepath stroke + 4.90 3.80 moveto + 4.97 3.88 lineto +closepath stroke + 4.90 3.80 moveto + 4.77 3.84 lineto +closepath stroke + 4.90 3.80 moveto + 4.82 3.93 lineto +closepath stroke + 5.04 3.96 moveto + 5.18 3.88 lineto +closepath stroke + 5.04 3.96 moveto + 5.09 3.81 lineto +closepath stroke + 5.04 3.96 moveto + 4.97 3.88 lineto +closepath stroke + 5.04 3.96 moveto + 5.12 4.05 lineto +closepath stroke + 5.04 3.96 moveto + 4.89 4.01 lineto +closepath stroke + 5.04 3.96 moveto + 4.95 4.11 lineto +closepath stroke + 5.20 4.13 moveto + 5.36 4.04 lineto +closepath stroke + 5.20 4.13 moveto + 5.26 3.97 lineto +closepath stroke + 5.20 4.13 moveto + 5.12 4.05 lineto +closepath stroke + 5.20 4.13 moveto + 5.29 4.23 lineto +closepath stroke + 5.20 4.13 moveto + 5.02 4.19 lineto +closepath stroke + 5.20 4.13 moveto + 5.09 4.30 lineto +closepath stroke + 5.37 4.33 moveto + 5.56 4.22 lineto +closepath stroke + 5.37 4.33 moveto + 5.45 4.14 lineto +closepath stroke + 5.37 4.33 moveto + 5.29 4.23 lineto +closepath stroke + 5.37 4.33 moveto + 5.47 4.43 lineto +closepath stroke + 5.37 4.33 moveto + 5.17 4.40 lineto +closepath stroke + 5.37 4.33 moveto + 5.24 4.51 lineto +closepath stroke + 5.56 4.54 moveto + 5.78 4.32 lineto +closepath stroke + 5.56 4.54 moveto + 5.65 4.32 lineto +closepath stroke + 5.56 4.54 moveto + 5.47 4.43 lineto +closepath stroke + 5.56 4.54 moveto + 5.78 4.66 lineto +closepath stroke + 5.56 4.54 moveto + 5.33 4.62 lineto +closepath stroke + 5.56 4.54 moveto + 5.41 4.75 lineto +closepath stroke + 5.56 4.54 moveto + 5.49 4.89 lineto +closepath stroke + 6.00 4.77 moveto + 6.00 4.44 lineto +closepath stroke + 6.00 4.77 moveto + 5.78 4.66 lineto +closepath stroke + 6.00 4.77 moveto + 5.71 5.00 lineto +closepath stroke + 6.00 4.77 moveto + 5.80 5.16 lineto +closepath stroke + 6.00 4.77 moveto + 6.00 5.39 lineto +closepath stroke + 4.25 3.22 moveto + 4.28 3.27 lineto +closepath stroke + 4.25 3.22 moveto + 4.30 3.21 lineto +closepath stroke + 4.25 3.22 moveto + 4.22 3.28 lineto +closepath stroke + 4.25 3.22 moveto + 4.20 3.22 lineto +closepath stroke + 4.31 3.33 moveto + 4.38 3.31 lineto +closepath stroke + 4.31 3.33 moveto + 4.34 3.26 lineto +closepath stroke + 4.31 3.33 moveto + 4.28 3.27 lineto +closepath stroke + 4.31 3.33 moveto + 4.35 3.39 lineto +closepath stroke + 4.31 3.33 moveto + 4.25 3.33 lineto +closepath stroke + 4.31 3.33 moveto + 4.27 3.40 lineto +closepath stroke + 4.38 3.45 moveto + 4.46 3.43 lineto +closepath stroke + 4.38 3.45 moveto + 4.41 3.37 lineto +closepath stroke + 4.38 3.45 moveto + 4.35 3.39 lineto +closepath stroke + 4.38 3.45 moveto + 4.42 3.51 lineto +closepath stroke + 4.38 3.45 moveto + 4.30 3.46 lineto +closepath stroke + 4.38 3.45 moveto + 4.33 3.53 lineto +closepath stroke + 4.46 3.58 moveto + 4.55 3.55 lineto +closepath stroke + 4.46 3.58 moveto + 4.50 3.49 lineto +closepath stroke + 4.46 3.58 moveto + 4.42 3.51 lineto +closepath stroke + 4.46 3.58 moveto + 4.50 3.65 lineto +closepath stroke + 4.46 3.58 moveto + 4.36 3.59 lineto +closepath stroke + 4.46 3.58 moveto + 4.39 3.67 lineto +closepath stroke + 4.54 3.72 moveto + 4.66 3.69 lineto +closepath stroke + 4.54 3.72 moveto + 4.60 3.62 lineto +closepath stroke + 4.54 3.72 moveto + 4.50 3.65 lineto +closepath stroke + 4.54 3.72 moveto + 4.59 3.80 lineto +closepath stroke + 4.54 3.72 moveto + 4.43 3.74 lineto +closepath stroke + 4.54 3.72 moveto + 4.46 3.82 lineto +closepath stroke + 4.64 3.88 moveto + 4.77 3.84 lineto +closepath stroke + 4.64 3.88 moveto + 4.70 3.77 lineto +closepath stroke + 4.64 3.88 moveto + 4.59 3.80 lineto +closepath stroke + 4.64 3.88 moveto + 4.69 3.97 lineto +closepath stroke + 4.64 3.88 moveto + 4.50 3.90 lineto +closepath stroke + 4.64 3.88 moveto + 4.53 3.99 lineto +closepath stroke + 4.74 4.06 moveto + 4.89 4.01 lineto +closepath stroke + 4.74 4.06 moveto + 4.82 3.93 lineto +closepath stroke + 4.74 4.06 moveto + 4.69 3.97 lineto +closepath stroke + 4.74 4.06 moveto + 4.79 4.15 lineto +closepath stroke + 4.74 4.06 moveto + 4.58 4.08 lineto +closepath stroke + 4.74 4.06 moveto + 4.62 4.18 lineto +closepath stroke + 4.85 4.25 moveto + 5.02 4.19 lineto +closepath stroke + 4.85 4.25 moveto + 4.95 4.11 lineto +closepath stroke + 4.85 4.25 moveto + 4.79 4.15 lineto +closepath stroke + 4.85 4.25 moveto + 4.91 4.36 lineto +closepath stroke + 4.85 4.25 moveto + 4.67 4.28 lineto +closepath stroke + 4.85 4.25 moveto + 4.71 4.39 lineto +closepath stroke + 4.97 4.46 moveto + 5.17 4.40 lineto +closepath stroke + 4.97 4.46 moveto + 5.09 4.30 lineto +closepath stroke + 4.97 4.46 moveto + 4.91 4.36 lineto +closepath stroke + 4.97 4.46 moveto + 5.04 4.58 lineto +closepath stroke + 4.97 4.46 moveto + 4.77 4.50 lineto +closepath stroke + 4.97 4.46 moveto + 4.81 4.62 lineto +closepath stroke + 5.11 4.70 moveto + 5.33 4.62 lineto +closepath stroke + 5.11 4.70 moveto + 5.24 4.51 lineto +closepath stroke + 5.11 4.70 moveto + 5.04 4.58 lineto +closepath stroke + 5.11 4.70 moveto + 5.18 4.83 lineto +closepath stroke + 5.11 4.70 moveto + 4.88 4.73 lineto +closepath stroke + 5.11 4.70 moveto + 4.92 4.87 lineto +closepath stroke + 5.25 4.95 moveto + 5.41 4.75 lineto +closepath stroke + 5.25 4.95 moveto + 5.18 4.83 lineto +closepath stroke + 5.25 4.95 moveto + 5.34 5.10 lineto +closepath stroke + 5.25 4.95 moveto + 5.00 5.00 lineto +closepath stroke + 5.25 4.95 moveto + 5.04 5.14 lineto +closepath stroke + 5.42 5.24 moveto + 5.71 5.00 lineto +closepath stroke + 5.42 5.24 moveto + 5.49 4.89 lineto +closepath stroke + 5.42 5.24 moveto + 5.34 5.10 lineto +closepath stroke + 5.42 5.24 moveto + 5.51 5.39 lineto +closepath stroke + 5.42 5.24 moveto + 5.12 5.29 lineto +closepath stroke + 5.60 5.55 moveto + 5.80 5.77 lineto +closepath stroke + 5.60 5.55 moveto + 5.80 5.16 lineto +closepath stroke + 5.60 5.55 moveto + 5.51 5.39 lineto +closepath stroke + 5.60 5.55 moveto + 5.60 5.77 lineto +closepath stroke + 5.60 5.55 moveto + 5.21 5.44 lineto +closepath stroke + 5.60 5.55 moveto + 5.27 5.77 lineto +closepath stroke + 5.60 6.00 moveto + 5.80 6.00 lineto +closepath stroke + 5.60 6.00 moveto + 5.60 5.77 lineto +closepath stroke + 5.60 6.00 moveto + 5.27 6.00 lineto +closepath stroke + 4.15 3.23 moveto + 4.17 3.28 lineto +closepath stroke + 4.15 3.23 moveto + 4.20 3.22 lineto +closepath stroke + 4.15 3.23 moveto + 4.10 3.29 lineto +closepath stroke + 4.15 3.23 moveto + 4.10 3.23 lineto +closepath stroke + 4.18 3.34 moveto + 4.25 3.33 lineto +closepath stroke + 4.18 3.34 moveto + 4.22 3.28 lineto +closepath stroke + 4.18 3.34 moveto + 4.17 3.28 lineto +closepath stroke + 4.18 3.34 moveto + 4.21 3.40 lineto +closepath stroke + 4.18 3.34 moveto + 4.12 3.34 lineto +closepath stroke + 4.18 3.34 moveto + 4.13 3.41 lineto +closepath stroke + 4.23 3.47 moveto + 4.30 3.46 lineto +closepath stroke + 4.23 3.47 moveto + 4.27 3.40 lineto +closepath stroke + 4.23 3.47 moveto + 4.21 3.40 lineto +closepath stroke + 4.23 3.47 moveto + 4.25 3.53 lineto +closepath stroke + 4.23 3.47 moveto + 4.15 3.47 lineto +closepath stroke + 4.23 3.47 moveto + 4.16 3.54 lineto +closepath stroke + 4.27 3.60 moveto + 4.36 3.59 lineto +closepath stroke + 4.27 3.60 moveto + 4.33 3.53 lineto +closepath stroke + 4.27 3.60 moveto + 4.25 3.53 lineto +closepath stroke + 4.27 3.60 moveto + 4.29 3.68 lineto +closepath stroke + 4.27 3.60 moveto + 4.18 3.61 lineto +closepath stroke + 4.27 3.60 moveto + 4.19 3.68 lineto +closepath stroke + 4.32 3.75 moveto + 4.43 3.74 lineto +closepath stroke + 4.32 3.75 moveto + 4.39 3.67 lineto +closepath stroke + 4.32 3.75 moveto + 4.29 3.68 lineto +closepath stroke + 4.32 3.75 moveto + 4.35 3.84 lineto +closepath stroke + 4.32 3.75 moveto + 4.21 3.76 lineto +closepath stroke + 4.32 3.75 moveto + 4.22 3.84 lineto +closepath stroke + 4.37 3.92 moveto + 4.50 3.90 lineto +closepath stroke + 4.37 3.92 moveto + 4.46 3.82 lineto +closepath stroke + 4.37 3.92 moveto + 4.35 3.84 lineto +closepath stroke + 4.37 3.92 moveto + 4.40 4.01 lineto +closepath stroke + 4.37 3.92 moveto + 4.25 3.93 lineto +closepath stroke + 4.37 3.92 moveto + 4.26 4.02 lineto +closepath stroke + 4.43 4.10 moveto + 4.58 4.08 lineto +closepath stroke + 4.43 4.10 moveto + 4.53 3.99 lineto +closepath stroke + 4.43 4.10 moveto + 4.40 4.01 lineto +closepath stroke + 4.43 4.10 moveto + 4.47 4.21 lineto +closepath stroke + 4.43 4.10 moveto + 4.29 4.11 lineto +closepath stroke + 4.43 4.10 moveto + 4.30 4.21 lineto +closepath stroke + 4.50 4.31 moveto + 4.67 4.28 lineto +closepath stroke + 4.50 4.31 moveto + 4.62 4.18 lineto +closepath stroke + 4.50 4.31 moveto + 4.47 4.21 lineto +closepath stroke + 4.50 4.31 moveto + 4.53 4.42 lineto +closepath stroke + 4.50 4.31 moveto + 4.33 4.31 lineto +closepath stroke + 4.50 4.31 moveto + 4.34 4.43 lineto +closepath stroke + 4.57 4.53 moveto + 4.77 4.50 lineto +closepath stroke + 4.57 4.53 moveto + 4.71 4.39 lineto +closepath stroke + 4.57 4.53 moveto + 4.53 4.42 lineto +closepath stroke + 4.57 4.53 moveto + 4.61 4.65 lineto +closepath stroke + 4.57 4.53 moveto + 4.38 4.54 lineto +closepath stroke + 4.57 4.53 moveto + 4.39 4.66 lineto +closepath stroke + 4.65 4.77 moveto + 4.88 4.73 lineto +closepath stroke + 4.65 4.77 moveto + 4.81 4.62 lineto +closepath stroke + 4.65 4.77 moveto + 4.61 4.65 lineto +closepath stroke + 4.65 4.77 moveto + 4.69 4.91 lineto +closepath stroke + 4.65 4.77 moveto + 4.43 4.78 lineto +closepath stroke + 4.65 4.77 moveto + 4.45 4.92 lineto +closepath stroke + 4.74 5.04 moveto + 5.00 5.00 lineto +closepath stroke + 4.74 5.04 moveto + 4.92 4.87 lineto +closepath stroke + 4.74 5.04 moveto + 4.69 4.91 lineto +closepath stroke + 4.74 5.04 moveto + 4.78 5.19 lineto +closepath stroke + 4.74 5.04 moveto + 4.49 5.05 lineto +closepath stroke + 4.74 5.04 moveto + 4.50 5.20 lineto +closepath stroke + 4.83 5.33 moveto + 5.21 5.44 lineto +closepath stroke + 4.83 5.33 moveto + 5.12 5.29 lineto +closepath stroke + 4.83 5.33 moveto + 5.04 5.14 lineto +closepath stroke + 4.83 5.33 moveto + 4.78 5.19 lineto +closepath stroke + 4.83 5.33 moveto + 4.88 5.67 lineto +closepath stroke + 4.83 5.33 moveto + 4.55 5.35 lineto +closepath stroke + 4.83 5.33 moveto + 4.57 5.67 lineto +closepath stroke + 4.94 6.00 moveto + 5.27 5.77 lineto +closepath stroke + 4.94 6.00 moveto + 4.88 5.67 lineto +closepath stroke + 4.94 6.00 moveto + 5.27 6.00 lineto +closepath stroke + 4.94 6.00 moveto + 4.62 6.00 lineto +closepath stroke + 4.05 3.23 moveto + 4.05 3.29 lineto +closepath stroke + 4.05 3.23 moveto + 4.10 3.23 lineto +closepath stroke + 4.05 3.23 moveto + 4.00 3.23 lineto +closepath stroke + 4.06 3.34 moveto + 4.12 3.34 lineto +closepath stroke + 4.06 3.34 moveto + 4.10 3.29 lineto +closepath stroke + 4.06 3.34 moveto + 4.05 3.29 lineto +closepath stroke + 4.06 3.34 moveto + 4.07 3.41 lineto +closepath stroke + 4.06 3.34 moveto + 4.01 3.29 lineto +closepath stroke + 4.06 3.34 moveto + 4.00 3.34 lineto +closepath stroke + 4.07 3.47 moveto + 4.15 3.47 lineto +closepath stroke + 4.07 3.47 moveto + 4.13 3.41 lineto +closepath stroke + 4.07 3.47 moveto + 4.07 3.41 lineto +closepath stroke + 4.07 3.47 moveto + 4.08 3.54 lineto +closepath stroke + 4.07 3.47 moveto + 4.01 3.41 lineto +closepath stroke + 4.07 3.47 moveto + 4.00 3.47 lineto +closepath stroke + 4.09 3.61 moveto + 4.18 3.61 lineto +closepath stroke + 4.09 3.61 moveto + 4.16 3.54 lineto +closepath stroke + 4.09 3.61 moveto + 4.08 3.54 lineto +closepath stroke + 4.09 3.61 moveto + 4.10 3.69 lineto +closepath stroke + 4.09 3.61 moveto + 4.01 3.54 lineto +closepath stroke + 4.09 3.61 moveto + 4.00 3.61 lineto +closepath stroke + 4.10 3.76 moveto + 4.21 3.76 lineto +closepath stroke + 4.10 3.76 moveto + 4.19 3.68 lineto +closepath stroke + 4.10 3.76 moveto + 4.10 3.69 lineto +closepath stroke + 4.10 3.76 moveto + 4.11 3.85 lineto +closepath stroke + 4.10 3.76 moveto + 4.01 3.69 lineto +closepath stroke + 4.10 3.76 moveto + 4.00 3.76 lineto +closepath stroke + 4.12 3.93 moveto + 4.25 3.93 lineto +closepath stroke + 4.12 3.93 moveto + 4.22 3.84 lineto +closepath stroke + 4.12 3.93 moveto + 4.11 3.85 lineto +closepath stroke + 4.12 3.93 moveto + 4.13 4.02 lineto +closepath stroke + 4.12 3.93 moveto + 4.01 3.85 lineto +closepath stroke + 4.12 3.93 moveto + 4.00 3.93 lineto +closepath stroke + 4.14 4.12 moveto + 4.29 4.11 lineto +closepath stroke + 4.14 4.12 moveto + 4.26 4.02 lineto +closepath stroke + 4.14 4.12 moveto + 4.13 4.02 lineto +closepath stroke + 4.14 4.12 moveto + 4.15 4.22 lineto +closepath stroke + 4.14 4.12 moveto + 4.01 4.02 lineto +closepath stroke + 4.14 4.12 moveto + 4.00 4.12 lineto +closepath stroke + 4.16 4.32 moveto + 4.33 4.31 lineto +closepath stroke + 4.16 4.32 moveto + 4.30 4.21 lineto +closepath stroke + 4.16 4.32 moveto + 4.15 4.22 lineto +closepath stroke + 4.16 4.32 moveto + 4.17 4.43 lineto +closepath stroke + 4.16 4.32 moveto + 4.01 4.22 lineto +closepath stroke + 4.16 4.32 moveto + 4.00 4.32 lineto +closepath stroke + 4.19 4.54 moveto + 4.38 4.54 lineto +closepath stroke + 4.19 4.54 moveto + 4.34 4.43 lineto +closepath stroke + 4.19 4.54 moveto + 4.17 4.43 lineto +closepath stroke + 4.19 4.54 moveto + 4.20 4.67 lineto +closepath stroke + 4.19 4.54 moveto + 4.01 4.43 lineto +closepath stroke + 4.19 4.54 moveto + 4.00 4.54 lineto +closepath stroke + 4.21 4.79 moveto + 4.43 4.78 lineto +closepath stroke + 4.21 4.79 moveto + 4.39 4.66 lineto +closepath stroke + 4.21 4.79 moveto + 4.20 4.67 lineto +closepath stroke + 4.21 4.79 moveto + 4.23 4.93 lineto +closepath stroke + 4.21 4.79 moveto + 4.01 4.67 lineto +closepath stroke + 4.21 4.79 moveto + 4.00 4.79 lineto +closepath stroke + 4.24 5.06 moveto + 4.49 5.05 lineto +closepath stroke + 4.24 5.06 moveto + 4.45 4.92 lineto +closepath stroke + 4.24 5.06 moveto + 4.23 4.93 lineto +closepath stroke + 4.24 5.06 moveto + 4.26 5.21 lineto +closepath stroke + 4.24 5.06 moveto + 4.01 4.93 lineto +closepath stroke + 4.24 5.06 moveto + 4.00 5.06 lineto +closepath stroke + 4.27 5.36 moveto + 4.55 5.35 lineto +closepath stroke + 4.27 5.36 moveto + 4.50 5.20 lineto +closepath stroke + 4.27 5.36 moveto + 4.26 5.21 lineto +closepath stroke + 4.27 5.36 moveto + 4.29 5.68 lineto +closepath stroke + 4.27 5.36 moveto + 4.02 5.21 lineto +closepath stroke + 4.27 5.36 moveto + 4.00 5.36 lineto +closepath stroke + 4.31 6.00 moveto + 4.62 6.00 lineto +closepath stroke + 4.31 6.00 moveto + 4.57 5.67 lineto +closepath stroke + 4.31 6.00 moveto + 4.29 5.68 lineto +closepath stroke + 4.31 6.00 moveto + 4.02 5.68 lineto +closepath stroke + 4.31 6.00 moveto + 4.00 6.00 lineto +closepath stroke + 3.95 3.23 moveto + 4.01 3.29 lineto +closepath stroke + 3.95 3.23 moveto + 4.00 3.23 lineto +closepath stroke + 3.95 3.23 moveto + 3.95 3.29 lineto +closepath stroke + 3.95 3.23 moveto + 3.90 3.23 lineto +closepath stroke + 3.94 3.35 moveto + 4.01 3.41 lineto +closepath stroke + 3.94 3.35 moveto + 4.00 3.34 lineto +closepath stroke + 3.94 3.35 moveto + 3.95 3.29 lineto +closepath stroke + 3.94 3.35 moveto + 3.93 3.41 lineto +closepath stroke + 3.94 3.35 moveto + 3.89 3.29 lineto +closepath stroke + 3.94 3.35 moveto + 3.88 3.35 lineto +closepath stroke + 3.93 3.47 moveto + 4.01 3.54 lineto +closepath stroke + 3.93 3.47 moveto + 4.00 3.47 lineto +closepath stroke + 3.93 3.47 moveto + 3.93 3.41 lineto +closepath stroke + 3.93 3.47 moveto + 3.92 3.54 lineto +closepath stroke + 3.93 3.47 moveto + 3.87 3.41 lineto +closepath stroke + 3.93 3.47 moveto + 3.85 3.47 lineto +closepath stroke + 3.91 3.61 moveto + 4.01 3.69 lineto +closepath stroke + 3.91 3.61 moveto + 4.00 3.61 lineto +closepath stroke + 3.91 3.61 moveto + 3.92 3.54 lineto +closepath stroke + 3.91 3.61 moveto + 3.90 3.69 lineto +closepath stroke + 3.91 3.61 moveto + 3.84 3.54 lineto +closepath stroke + 3.91 3.61 moveto + 3.82 3.61 lineto +closepath stroke + 3.90 3.76 moveto + 4.01 3.85 lineto +closepath stroke + 3.90 3.76 moveto + 4.00 3.76 lineto +closepath stroke + 3.90 3.76 moveto + 3.90 3.69 lineto +closepath stroke + 3.90 3.76 moveto + 3.89 3.85 lineto +closepath stroke + 3.90 3.76 moveto + 3.81 3.69 lineto +closepath stroke + 3.90 3.76 moveto + 3.79 3.77 lineto +closepath stroke + 3.88 3.93 moveto + 4.01 4.02 lineto +closepath stroke + 3.88 3.93 moveto + 4.00 3.93 lineto +closepath stroke + 3.88 3.93 moveto + 3.89 3.85 lineto +closepath stroke + 3.88 3.93 moveto + 3.87 4.02 lineto +closepath stroke + 3.88 3.93 moveto + 3.78 3.85 lineto +closepath stroke + 3.88 3.93 moveto + 3.75 3.94 lineto +closepath stroke + 3.86 4.12 moveto + 4.01 4.22 lineto +closepath stroke + 3.86 4.12 moveto + 4.00 4.12 lineto +closepath stroke + 3.86 4.12 moveto + 3.87 4.02 lineto +closepath stroke + 3.86 4.12 moveto + 3.85 4.22 lineto +closepath stroke + 3.86 4.12 moveto + 3.74 4.03 lineto +closepath stroke + 3.86 4.12 moveto + 3.71 4.12 lineto +closepath stroke + 3.84 4.32 moveto + 4.01 4.43 lineto +closepath stroke + 3.84 4.32 moveto + 4.00 4.32 lineto +closepath stroke + 3.84 4.32 moveto + 3.85 4.22 lineto +closepath stroke + 3.84 4.32 moveto + 3.83 4.43 lineto +closepath stroke + 3.84 4.32 moveto + 3.70 4.22 lineto +closepath stroke + 3.84 4.32 moveto + 3.66 4.33 lineto +closepath stroke + 3.81 4.55 moveto + 4.01 4.67 lineto +closepath stroke + 3.81 4.55 moveto + 4.00 4.54 lineto +closepath stroke + 3.81 4.55 moveto + 3.83 4.43 lineto +closepath stroke + 3.81 4.55 moveto + 3.80 4.67 lineto +closepath stroke + 3.81 4.55 moveto + 3.65 4.44 lineto +closepath stroke + 3.81 4.55 moveto + 3.62 4.55 lineto +closepath stroke + 3.79 4.79 moveto + 4.01 4.93 lineto +closepath stroke + 3.79 4.79 moveto + 4.00 4.79 lineto +closepath stroke + 3.79 4.79 moveto + 3.80 4.67 lineto +closepath stroke + 3.79 4.79 moveto + 3.77 4.93 lineto +closepath stroke + 3.79 4.79 moveto + 3.60 4.67 lineto +closepath stroke + 3.79 4.79 moveto + 3.56 4.80 lineto +closepath stroke + 3.76 5.06 moveto + 4.02 5.21 lineto +closepath stroke + 3.76 5.06 moveto + 4.00 5.06 lineto +closepath stroke + 3.76 5.06 moveto + 3.77 4.93 lineto +closepath stroke + 3.76 5.06 moveto + 3.74 5.21 lineto +closepath stroke + 3.76 5.06 moveto + 3.55 4.93 lineto +closepath stroke + 3.76 5.06 moveto + 3.50 5.07 lineto +closepath stroke + 3.73 5.36 moveto + 4.02 5.68 lineto +closepath stroke + 3.73 5.36 moveto + 4.00 5.36 lineto +closepath stroke + 3.73 5.36 moveto + 3.74 5.21 lineto +closepath stroke + 3.73 5.36 moveto + 3.71 5.68 lineto +closepath stroke + 3.73 5.36 moveto + 3.49 5.22 lineto +closepath stroke + 3.73 5.36 moveto + 3.44 5.37 lineto +closepath stroke + 3.69 6.00 moveto + 4.00 6.00 lineto +closepath stroke + 3.69 6.00 moveto + 3.71 5.68 lineto +closepath stroke + 3.69 6.00 moveto + 3.42 5.69 lineto +closepath stroke + 3.69 6.00 moveto + 3.37 6.00 lineto +closepath stroke + 3.85 3.23 moveto + 3.89 3.29 lineto +closepath stroke + 3.85 3.23 moveto + 3.90 3.23 lineto +closepath stroke + 3.85 3.23 moveto + 3.83 3.29 lineto +closepath stroke + 3.85 3.23 moveto + 3.79 3.23 lineto +closepath stroke + 3.81 3.35 moveto + 3.87 3.41 lineto +closepath stroke + 3.81 3.35 moveto + 3.88 3.35 lineto +closepath stroke + 3.81 3.35 moveto + 3.83 3.29 lineto +closepath stroke + 3.81 3.35 moveto + 3.79 3.41 lineto +closepath stroke + 3.81 3.35 moveto + 3.77 3.29 lineto +closepath stroke + 3.81 3.35 moveto + 3.74 3.35 lineto +closepath stroke + 3.77 3.47 moveto + 3.84 3.54 lineto +closepath stroke + 3.77 3.47 moveto + 3.85 3.47 lineto +closepath stroke + 3.77 3.47 moveto + 3.79 3.41 lineto +closepath stroke + 3.77 3.47 moveto + 3.75 3.54 lineto +closepath stroke + 3.77 3.47 moveto + 3.72 3.41 lineto +closepath stroke + 3.77 3.47 moveto + 3.68 3.48 lineto +closepath stroke + 3.72 3.61 moveto + 3.81 3.69 lineto +closepath stroke + 3.72 3.61 moveto + 3.82 3.61 lineto +closepath stroke + 3.72 3.61 moveto + 3.75 3.54 lineto +closepath stroke + 3.72 3.61 moveto + 3.70 3.69 lineto +closepath stroke + 3.72 3.61 moveto + 3.65 3.55 lineto +closepath stroke + 3.72 3.61 moveto + 3.61 3.62 lineto +closepath stroke + 3.67 3.77 moveto + 3.78 3.85 lineto +closepath stroke + 3.67 3.77 moveto + 3.79 3.77 lineto +closepath stroke + 3.67 3.77 moveto + 3.70 3.69 lineto +closepath stroke + 3.67 3.77 moveto + 3.65 3.85 lineto +closepath stroke + 3.67 3.77 moveto + 3.59 3.70 lineto +closepath stroke + 3.67 3.77 moveto + 3.54 3.78 lineto +closepath stroke + 3.62 3.94 moveto + 3.74 4.03 lineto +closepath stroke + 3.62 3.94 moveto + 3.75 3.94 lineto +closepath stroke + 3.62 3.94 moveto + 3.65 3.85 lineto +closepath stroke + 3.62 3.94 moveto + 3.59 4.03 lineto +closepath stroke + 3.62 3.94 moveto + 3.52 3.86 lineto +closepath stroke + 3.62 3.94 moveto + 3.47 3.95 lineto +closepath stroke + 3.56 4.13 moveto + 3.70 4.22 lineto +closepath stroke + 3.56 4.13 moveto + 3.71 4.12 lineto +closepath stroke + 3.56 4.13 moveto + 3.59 4.03 lineto +closepath stroke + 3.56 4.13 moveto + 3.53 4.23 lineto +closepath stroke + 3.56 4.13 moveto + 3.44 4.04 lineto +closepath stroke + 3.56 4.13 moveto + 3.38 4.14 lineto +closepath stroke + 3.49 4.33 moveto + 3.65 4.44 lineto +closepath stroke + 3.49 4.33 moveto + 3.66 4.33 lineto +closepath stroke + 3.49 4.33 moveto + 3.53 4.23 lineto +closepath stroke + 3.49 4.33 moveto + 3.46 4.44 lineto +closepath stroke + 3.49 4.33 moveto + 3.35 4.24 lineto +closepath stroke + 3.49 4.33 moveto + 3.29 4.34 lineto +closepath stroke + 3.42 4.56 moveto + 3.60 4.67 lineto +closepath stroke + 3.42 4.56 moveto + 3.62 4.55 lineto +closepath stroke + 3.42 4.56 moveto + 3.46 4.44 lineto +closepath stroke + 3.42 4.56 moveto + 3.38 4.68 lineto +closepath stroke + 3.42 4.56 moveto + 3.25 4.46 lineto +closepath stroke + 3.42 4.56 moveto + 3.18 4.57 lineto +closepath stroke + 3.34 4.80 moveto + 3.55 4.93 lineto +closepath stroke + 3.34 4.80 moveto + 3.56 4.80 lineto +closepath stroke + 3.34 4.80 moveto + 3.38 4.68 lineto +closepath stroke + 3.34 4.80 moveto + 3.29 4.94 lineto +closepath stroke + 3.34 4.80 moveto + 3.14 4.69 lineto +closepath stroke + 3.34 4.80 moveto + 3.07 4.82 lineto +closepath stroke + 3.25 5.08 moveto + 3.49 5.22 lineto +closepath stroke + 3.25 5.08 moveto + 3.50 5.07 lineto +closepath stroke + 3.25 5.08 moveto + 3.29 4.94 lineto +closepath stroke + 3.25 5.08 moveto + 3.20 5.23 lineto +closepath stroke + 3.25 5.08 moveto + 3.03 4.96 lineto +closepath stroke + 3.25 5.08 moveto + 2.95 5.10 lineto +closepath stroke + 3.15 5.38 moveto + 3.42 5.69 lineto +closepath stroke + 3.15 5.38 moveto + 3.44 5.37 lineto +closepath stroke + 3.15 5.38 moveto + 3.20 5.23 lineto +closepath stroke + 3.15 5.38 moveto + 3.10 5.69 lineto +closepath stroke + 3.15 5.38 moveto + 2.90 5.25 lineto +closepath stroke + 3.15 5.38 moveto + 2.81 5.40 lineto +closepath stroke + 3.04 6.00 moveto + 3.37 6.00 lineto +closepath stroke + 3.04 6.00 moveto + 3.10 5.69 lineto +closepath stroke + 3.04 6.00 moveto + 2.76 5.71 lineto +closepath stroke + 3.04 6.00 moveto + 2.66 6.00 lineto +closepath stroke + 3.73 3.24 moveto + 3.77 3.29 lineto +closepath stroke + 3.73 3.24 moveto + 3.79 3.23 lineto +closepath stroke + 3.73 3.24 moveto + 3.69 3.29 lineto +closepath stroke + 3.73 3.24 moveto + 3.65 3.24 lineto +closepath stroke + 3.66 3.35 moveto + 3.72 3.41 lineto +closepath stroke + 3.66 3.35 moveto + 3.74 3.35 lineto +closepath stroke + 3.66 3.35 moveto + 3.69 3.29 lineto +closepath stroke + 3.66 3.35 moveto + 3.62 3.42 lineto +closepath stroke + 3.66 3.35 moveto + 3.61 3.30 lineto +closepath stroke + 3.66 3.35 moveto + 3.56 3.36 lineto +closepath stroke + 3.58 3.48 moveto + 3.65 3.55 lineto +closepath stroke + 3.58 3.48 moveto + 3.68 3.48 lineto +closepath stroke + 3.58 3.48 moveto + 3.62 3.42 lineto +closepath stroke + 3.58 3.48 moveto + 3.54 3.55 lineto +closepath stroke + 3.58 3.48 moveto + 3.52 3.42 lineto +closepath stroke + 3.58 3.48 moveto + 3.46 3.49 lineto +closepath stroke + 3.50 3.63 moveto + 3.59 3.70 lineto +closepath stroke + 3.50 3.63 moveto + 3.61 3.62 lineto +closepath stroke + 3.50 3.63 moveto + 3.54 3.55 lineto +closepath stroke + 3.50 3.63 moveto + 3.46 3.70 lineto +closepath stroke + 3.50 3.63 moveto + 3.42 3.56 lineto +closepath stroke + 3.50 3.63 moveto + 3.36 3.63 lineto +closepath stroke + 3.41 3.78 moveto + 3.52 3.86 lineto +closepath stroke + 3.41 3.78 moveto + 3.54 3.78 lineto +closepath stroke + 3.41 3.78 moveto + 3.46 3.70 lineto +closepath stroke + 3.41 3.78 moveto + 3.36 3.87 lineto +closepath stroke + 3.41 3.78 moveto + 3.31 3.71 lineto +closepath stroke + 3.31 3.96 moveto + 3.44 4.04 lineto +closepath stroke + 3.31 3.96 moveto + 3.47 3.95 lineto +closepath stroke + 3.31 3.96 moveto + 3.36 3.87 lineto +closepath stroke + 3.31 3.96 moveto + 3.26 4.05 lineto +closepath stroke + 3.31 3.96 moveto + 3.26 3.80 lineto +closepath stroke + 3.31 3.96 moveto + 3.19 3.88 lineto +closepath stroke + 3.20 4.15 moveto + 3.35 4.24 lineto +closepath stroke + 3.20 4.15 moveto + 3.38 4.14 lineto +closepath stroke + 3.20 4.15 moveto + 3.26 4.05 lineto +closepath stroke + 3.20 4.15 moveto + 3.14 4.25 lineto +closepath stroke + 3.20 4.15 moveto + 3.13 3.97 lineto +closepath stroke + 3.20 4.15 moveto + 3.06 4.06 lineto +closepath stroke + 3.08 4.35 moveto + 3.25 4.46 lineto +closepath stroke + 3.08 4.35 moveto + 3.29 4.34 lineto +closepath stroke + 3.08 4.35 moveto + 3.14 4.25 lineto +closepath stroke + 3.08 4.35 moveto + 3.02 4.47 lineto +closepath stroke + 3.08 4.35 moveto + 3.00 4.16 lineto +closepath stroke + 3.08 4.35 moveto + 2.91 4.26 lineto +closepath stroke + 2.95 4.58 moveto + 3.14 4.69 lineto +closepath stroke + 2.95 4.58 moveto + 3.18 4.57 lineto +closepath stroke + 2.95 4.58 moveto + 3.02 4.47 lineto +closepath stroke + 2.95 4.58 moveto + 2.88 4.71 lineto +closepath stroke + 2.95 4.58 moveto + 2.84 4.37 lineto +closepath stroke + 2.95 4.58 moveto + 2.75 4.48 lineto +closepath stroke + 2.80 4.84 moveto + 3.03 4.96 lineto +closepath stroke + 2.80 4.84 moveto + 3.07 4.82 lineto +closepath stroke + 2.80 4.84 moveto + 2.88 4.71 lineto +closepath stroke + 2.80 4.84 moveto + 2.72 4.98 lineto +closepath stroke + 2.80 4.84 moveto + 2.67 4.61 lineto +closepath stroke + 2.80 4.84 moveto + 2.57 4.72 lineto +closepath stroke + 2.64 5.12 moveto + 2.90 5.25 lineto +closepath stroke + 2.64 5.12 moveto + 2.95 5.10 lineto +closepath stroke + 2.64 5.12 moveto + 2.72 4.98 lineto +closepath stroke + 2.64 5.12 moveto + 2.55 5.27 lineto +closepath stroke + 2.64 5.12 moveto + 2.49 4.86 lineto +closepath stroke + 2.64 5.12 moveto + 2.37 4.99 lineto +closepath stroke + 2.47 5.42 moveto + 2.76 5.71 lineto +closepath stroke + 2.47 5.42 moveto + 2.81 5.40 lineto +closepath stroke + 2.47 5.42 moveto + 2.55 5.27 lineto +closepath stroke + 2.47 5.42 moveto + 2.37 5.71 lineto +closepath stroke + 2.47 5.42 moveto + 2.28 5.14 lineto +closepath stroke + 2.47 5.42 moveto + 2.16 5.29 lineto +closepath stroke + 2.47 5.42 moveto + 2.02 5.44 lineto +closepath stroke + 2.27 6.00 moveto + 2.66 6.00 lineto +closepath stroke + 2.27 6.00 moveto + 2.37 5.71 lineto +closepath stroke + 2.27 6.00 moveto + 1.92 5.73 lineto +closepath stroke + 2.27 6.00 moveto + 1.77 6.00 lineto +closepath stroke + 3.57 3.24 moveto + 3.61 3.30 lineto +closepath stroke + 3.57 3.24 moveto + 3.65 3.24 lineto +closepath stroke + 3.57 3.24 moveto + 3.51 3.30 lineto +closepath stroke + 3.57 3.24 moveto + 3.46 3.24 lineto +closepath stroke + 3.46 3.36 moveto + 3.52 3.42 lineto +closepath stroke + 3.46 3.36 moveto + 3.56 3.36 lineto +closepath stroke + 3.46 3.36 moveto + 3.51 3.30 lineto +closepath stroke + 3.46 3.36 moveto + 3.40 3.43 lineto +closepath stroke + 3.46 3.36 moveto + 3.41 3.30 lineto +closepath stroke + 3.34 3.49 moveto + 3.42 3.56 lineto +closepath stroke + 3.34 3.49 moveto + 3.46 3.49 lineto +closepath stroke + 3.34 3.49 moveto + 3.40 3.43 lineto +closepath stroke + 3.34 3.49 moveto + 3.28 3.56 lineto +closepath stroke + 3.34 3.49 moveto + 3.35 3.36 lineto +closepath stroke + 3.34 3.49 moveto + 3.27 3.42 lineto +closepath stroke + 3.21 3.64 moveto + 3.31 3.71 lineto +closepath stroke + 3.21 3.64 moveto + 3.36 3.63 lineto +closepath stroke + 3.21 3.64 moveto + 3.28 3.56 lineto +closepath stroke + 3.21 3.64 moveto + 3.26 3.80 lineto +closepath stroke + 3.21 3.64 moveto + 3.14 3.72 lineto +closepath stroke + 3.21 3.64 moveto + 3.20 3.49 lineto +closepath stroke + 3.21 3.64 moveto + 3.11 3.56 lineto +closepath stroke + 3.07 3.80 moveto + 3.13 3.97 lineto +closepath stroke + 3.07 3.80 moveto + 3.19 3.88 lineto +closepath stroke + 3.07 3.80 moveto + 3.14 3.72 lineto +closepath stroke + 3.07 3.80 moveto + 2.99 3.88 lineto +closepath stroke + 3.07 3.80 moveto + 3.04 3.64 lineto +closepath stroke + 3.07 3.80 moveto + 2.94 3.71 lineto +closepath stroke + 2.91 3.97 moveto + 3.00 4.16 lineto +closepath stroke + 2.91 3.97 moveto + 3.06 4.06 lineto +closepath stroke + 2.91 3.97 moveto + 2.99 3.88 lineto +closepath stroke + 2.91 3.97 moveto + 2.82 4.07 lineto +closepath stroke + 2.91 3.97 moveto + 2.86 3.80 lineto +closepath stroke + 2.91 3.97 moveto + 2.75 3.88 lineto +closepath stroke + 2.73 4.17 moveto + 2.84 4.37 lineto +closepath stroke + 2.73 4.17 moveto + 2.91 4.26 lineto +closepath stroke + 2.73 4.17 moveto + 2.82 4.07 lineto +closepath stroke + 2.73 4.17 moveto + 2.64 4.27 lineto +closepath stroke + 2.73 4.17 moveto + 2.67 3.97 lineto +closepath stroke + 2.73 4.17 moveto + 2.55 4.06 lineto +closepath stroke + 2.54 4.38 moveto + 2.67 4.61 lineto +closepath stroke + 2.54 4.38 moveto + 2.75 4.48 lineto +closepath stroke + 2.54 4.38 moveto + 2.64 4.27 lineto +closepath stroke + 2.54 4.38 moveto + 2.44 4.49 lineto +closepath stroke + 2.54 4.38 moveto + 2.45 4.17 lineto +closepath stroke + 2.54 4.38 moveto + 2.32 4.26 lineto +closepath stroke + 2.33 4.61 moveto + 2.49 4.86 lineto +closepath stroke + 2.33 4.61 moveto + 2.57 4.72 lineto +closepath stroke + 2.33 4.61 moveto + 2.44 4.49 lineto +closepath stroke + 2.33 4.61 moveto + 2.22 4.74 lineto +closepath stroke + 2.33 4.61 moveto + 2.22 4.38 lineto +closepath stroke + 2.33 4.61 moveto + 2.07 4.48 lineto +closepath stroke + 2.10 4.87 moveto + 2.28 5.14 lineto +closepath stroke + 2.10 4.87 moveto + 2.37 4.99 lineto +closepath stroke + 2.10 4.87 moveto + 2.22 4.74 lineto +closepath stroke + 2.10 4.87 moveto + 1.97 5.01 lineto +closepath stroke + 2.10 4.87 moveto + 1.96 4.61 lineto +closepath stroke + 2.10 4.87 moveto + 1.80 4.72 lineto +closepath stroke + 1.85 5.15 moveto + 2.16 5.29 lineto +closepath stroke + 1.85 5.15 moveto + 1.97 5.01 lineto +closepath stroke + 1.85 5.15 moveto + 1.71 5.31 lineto +closepath stroke + 1.85 5.15 moveto + 1.67 4.87 lineto +closepath stroke + 1.85 5.15 moveto + 1.50 4.99 lineto +closepath stroke + 1.57 5.46 moveto + 1.92 5.73 lineto +closepath stroke + 1.57 5.46 moveto + 2.02 5.44 lineto +closepath stroke + 1.57 5.46 moveto + 1.71 5.31 lineto +closepath stroke + 1.57 5.46 moveto + 1.41 5.73 lineto +closepath stroke + 1.57 5.46 moveto + 1.36 5.15 lineto +closepath stroke + 1.57 5.46 moveto + 1.17 5.29 lineto +closepath stroke + 1.26 6.00 moveto + 1.77 6.00 lineto +closepath stroke + 1.26 6.00 moveto + 1.41 5.73 lineto +closepath stroke + 1.26 6.00 moveto + 1.02 5.56 lineto +closepath stroke + 1.26 6.00 moveto + 0.63 6.00 lineto +closepath stroke + 3.35 3.24 moveto + 3.41 3.30 lineto +closepath stroke + 3.35 3.24 moveto + 3.46 3.24 lineto +closepath stroke + 3.35 3.24 moveto + 3.35 3.36 lineto +closepath stroke + 3.35 3.24 moveto + 3.27 3.29 lineto +closepath stroke + 3.35 3.24 moveto + 3.21 3.22 lineto +closepath stroke + 3.19 3.35 moveto + 3.20 3.49 lineto +closepath stroke + 3.19 3.35 moveto + 3.27 3.42 lineto +closepath stroke + 3.19 3.35 moveto + 3.27 3.29 lineto +closepath stroke + 3.19 3.35 moveto + 3.10 3.42 lineto +closepath stroke + 3.19 3.35 moveto + 3.13 3.28 lineto +closepath stroke + 3.01 3.48 moveto + 3.04 3.64 lineto +closepath stroke + 3.01 3.48 moveto + 3.11 3.56 lineto +closepath stroke + 3.01 3.48 moveto + 3.10 3.42 lineto +closepath stroke + 3.01 3.48 moveto + 2.91 3.55 lineto +closepath stroke + 3.01 3.48 moveto + 3.04 3.35 lineto +closepath stroke + 3.01 3.48 moveto + 2.92 3.40 lineto +closepath stroke + 2.82 3.62 moveto + 2.86 3.80 lineto +closepath stroke + 2.82 3.62 moveto + 2.94 3.71 lineto +closepath stroke + 2.82 3.62 moveto + 2.91 3.55 lineto +closepath stroke + 2.82 3.62 moveto + 2.71 3.70 lineto +closepath stroke + 2.82 3.62 moveto + 2.82 3.47 lineto +closepath stroke + 2.82 3.62 moveto + 2.70 3.53 lineto +closepath stroke + 2.60 3.78 moveto + 2.67 3.97 lineto +closepath stroke + 2.60 3.78 moveto + 2.75 3.88 lineto +closepath stroke + 2.60 3.78 moveto + 2.71 3.70 lineto +closepath stroke + 2.60 3.78 moveto + 2.48 3.87 lineto +closepath stroke + 2.60 3.78 moveto + 2.59 3.60 lineto +closepath stroke + 2.60 3.78 moveto + 2.45 3.67 lineto +closepath stroke + 2.36 3.95 moveto + 2.45 4.17 lineto +closepath stroke + 2.36 3.95 moveto + 2.55 4.06 lineto +closepath stroke + 2.36 3.95 moveto + 2.48 3.87 lineto +closepath stroke + 2.36 3.95 moveto + 2.23 4.05 lineto +closepath stroke + 2.36 3.95 moveto + 2.33 3.75 lineto +closepath stroke + 2.36 3.95 moveto + 2.17 3.82 lineto +closepath stroke + 2.10 4.14 moveto + 2.22 4.38 lineto +closepath stroke + 2.10 4.14 moveto + 2.32 4.26 lineto +closepath stroke + 2.10 4.14 moveto + 2.23 4.05 lineto +closepath stroke + 2.10 4.14 moveto + 1.96 4.25 lineto +closepath stroke + 2.10 4.14 moveto + 2.04 3.92 lineto +closepath stroke + 2.10 4.14 moveto + 1.87 3.99 lineto +closepath stroke + 1.82 4.35 moveto + 1.96 4.61 lineto +closepath stroke + 1.82 4.35 moveto + 2.07 4.48 lineto +closepath stroke + 1.82 4.35 moveto + 1.96 4.25 lineto +closepath stroke + 1.82 4.35 moveto + 1.66 4.47 lineto +closepath stroke + 1.82 4.35 moveto + 1.73 4.10 lineto +closepath stroke + 1.82 4.35 moveto + 1.54 4.18 lineto +closepath stroke + 1.50 4.58 moveto + 1.67 4.87 lineto +closepath stroke + 1.50 4.58 moveto + 1.80 4.72 lineto +closepath stroke + 1.50 4.58 moveto + 1.66 4.47 lineto +closepath stroke + 1.50 4.58 moveto + 1.33 4.71 lineto +closepath stroke + 1.50 4.58 moveto + 1.38 4.30 lineto +closepath stroke + 1.50 4.58 moveto + 1.18 4.39 lineto +closepath stroke + 1.15 4.83 moveto + 1.36 5.15 lineto +closepath stroke + 1.15 4.83 moveto + 1.50 4.99 lineto +closepath stroke + 1.15 4.83 moveto + 1.33 4.71 lineto +closepath stroke + 1.15 4.83 moveto + 0.96 4.97 lineto +closepath stroke + 1.15 4.83 moveto + 1.00 4.51 lineto +closepath stroke + 0.77 5.11 moveto + 1.02 5.56 lineto +closepath stroke + 0.77 5.11 moveto + 1.17 5.29 lineto +closepath stroke + 0.77 5.11 moveto + 0.96 4.97 lineto +closepath stroke + 0.77 5.11 moveto + 0.39 5.56 lineto +closepath stroke + 0.77 5.11 moveto + 0.39 5.26 lineto +closepath stroke + 0.77 5.11 moveto + 0.81 4.65 lineto +closepath stroke + 0.77 5.11 moveto + 0.39 4.75 lineto +closepath stroke + 0.00 5.42 moveto + 0.00 5.71 lineto +closepath stroke + 0.00 5.42 moveto + 0.39 5.26 lineto +closepath stroke + 0.00 5.42 moveto + 0.00 4.91 lineto +closepath stroke + 3.07 3.21 moveto + 3.13 3.28 lineto +closepath stroke + 3.07 3.21 moveto + 3.21 3.22 lineto +closepath stroke + 3.07 3.21 moveto + 3.04 3.35 lineto +closepath stroke + 3.07 3.21 moveto + 2.95 3.26 lineto +closepath stroke + 3.07 3.21 moveto + 2.89 3.17 lineto +closepath stroke + 2.83 3.31 moveto + 2.82 3.47 lineto +closepath stroke + 2.83 3.31 moveto + 2.92 3.40 lineto +closepath stroke + 2.83 3.31 moveto + 2.95 3.26 lineto +closepath stroke + 2.83 3.31 moveto + 2.70 3.37 lineto +closepath stroke + 2.83 3.31 moveto + 2.77 3.22 lineto +closepath stroke + 2.58 3.43 moveto + 2.59 3.60 lineto +closepath stroke + 2.58 3.43 moveto + 2.70 3.53 lineto +closepath stroke + 2.58 3.43 moveto + 2.70 3.37 lineto +closepath stroke + 2.58 3.43 moveto + 2.43 3.49 lineto +closepath stroke + 2.58 3.43 moveto + 2.64 3.28 lineto +closepath stroke + 2.58 3.43 moveto + 2.48 3.32 lineto +closepath stroke + 2.29 3.55 moveto + 2.33 3.75 lineto +closepath stroke + 2.29 3.55 moveto + 2.45 3.67 lineto +closepath stroke + 2.29 3.55 moveto + 2.43 3.49 lineto +closepath stroke + 2.29 3.55 moveto + 2.14 3.62 lineto +closepath stroke + 2.29 3.55 moveto + 2.34 3.38 lineto +closepath stroke + 2.29 3.55 moveto + 2.16 3.42 lineto +closepath stroke + 1.98 3.69 moveto + 2.04 3.92 lineto +closepath stroke + 1.98 3.69 moveto + 2.17 3.82 lineto +closepath stroke + 1.98 3.69 moveto + 2.14 3.62 lineto +closepath stroke + 1.98 3.69 moveto + 1.81 3.77 lineto +closepath stroke + 1.98 3.69 moveto + 2.00 3.49 lineto +closepath stroke + 1.98 3.69 moveto + 1.81 3.53 lineto +closepath stroke + 1.64 3.84 moveto + 1.73 4.10 lineto +closepath stroke + 1.64 3.84 moveto + 1.87 3.99 lineto +closepath stroke + 1.64 3.84 moveto + 1.81 3.77 lineto +closepath stroke + 1.64 3.84 moveto + 1.45 3.93 lineto +closepath stroke + 1.64 3.84 moveto + 1.64 3.60 lineto +closepath stroke + 1.64 3.84 moveto + 1.42 3.65 lineto +closepath stroke + 1.26 4.01 moveto + 1.38 4.30 lineto +closepath stroke + 1.26 4.01 moveto + 1.54 4.18 lineto +closepath stroke + 1.26 4.01 moveto + 1.45 3.93 lineto +closepath stroke + 1.26 4.01 moveto + 1.06 4.10 lineto +closepath stroke + 1.26 4.01 moveto + 1.23 3.73 lineto +closepath stroke + 1.26 4.01 moveto + 1.00 3.78 lineto +closepath stroke + 0.85 4.19 moveto + 0.81 4.65 lineto +closepath stroke + 0.85 4.19 moveto + 1.00 4.51 lineto +closepath stroke + 0.85 4.19 moveto + 1.18 4.39 lineto +closepath stroke + 0.85 4.19 moveto + 1.06 4.10 lineto +closepath stroke + 0.85 4.19 moveto + 0.43 4.30 lineto +closepath stroke + 0.85 4.19 moveto + 0.79 3.88 lineto +closepath stroke + 0.85 4.19 moveto + 0.43 3.93 lineto +closepath stroke + 0.00 4.40 moveto + 0.39 4.75 lineto +closepath stroke + 0.00 4.40 moveto + 0.43 4.30 lineto +closepath stroke + 0.00 4.40 moveto + 0.00 4.91 lineto +closepath stroke + 0.00 4.40 moveto + 0.00 4.03 lineto +closepath stroke + 2.70 3.14 moveto + 2.77 3.22 lineto +closepath stroke + 2.70 3.14 moveto + 2.89 3.17 lineto +closepath stroke + 2.70 3.14 moveto + 2.64 3.28 lineto +closepath stroke + 2.70 3.14 moveto + 2.54 3.17 lineto +closepath stroke + 2.70 3.14 moveto + 2.49 3.07 lineto +closepath stroke + 2.38 3.21 moveto + 2.34 3.38 lineto +closepath stroke + 2.38 3.21 moveto + 2.48 3.32 lineto +closepath stroke + 2.38 3.21 moveto + 2.54 3.17 lineto +closepath stroke + 2.38 3.21 moveto + 2.20 3.24 lineto +closepath stroke + 2.38 3.21 moveto + 2.33 3.10 lineto +closepath stroke + 2.02 3.28 moveto + 2.00 3.49 lineto +closepath stroke + 2.02 3.28 moveto + 2.16 3.42 lineto +closepath stroke + 2.02 3.28 moveto + 2.20 3.24 lineto +closepath stroke + 2.02 3.28 moveto + 1.83 3.32 lineto +closepath stroke + 2.02 3.28 moveto + 2.15 3.14 lineto +closepath stroke + 2.02 3.28 moveto + 1.94 3.14 lineto +closepath stroke + 1.63 3.37 moveto + 1.64 3.60 lineto +closepath stroke + 1.63 3.37 moveto + 1.81 3.53 lineto +closepath stroke + 1.63 3.37 moveto + 1.83 3.32 lineto +closepath stroke + 1.63 3.37 moveto + 1.42 3.41 lineto +closepath stroke + 1.63 3.37 moveto + 1.74 3.18 lineto +closepath stroke + 1.63 3.37 moveto + 1.50 3.18 lineto +closepath stroke + 1.20 3.46 moveto + 1.23 3.73 lineto +closepath stroke + 1.20 3.46 moveto + 1.42 3.65 lineto +closepath stroke + 1.20 3.46 moveto + 1.42 3.41 lineto +closepath stroke + 1.20 3.46 moveto + 0.96 3.51 lineto +closepath stroke + 1.20 3.46 moveto + 1.29 3.23 lineto +closepath stroke + 1.20 3.46 moveto + 1.03 3.23 lineto +closepath stroke + 0.73 3.56 moveto + 0.79 3.88 lineto +closepath stroke + 0.73 3.56 moveto + 1.00 3.78 lineto +closepath stroke + 0.73 3.56 moveto + 0.96 3.51 lineto +closepath stroke + 0.73 3.56 moveto + 0.36 3.61 lineto +closepath stroke + 0.73 3.56 moveto + 0.79 3.28 lineto +closepath stroke + 0.73 3.56 moveto + 0.36 3.28 lineto +closepath stroke + 0.00 3.67 moveto + 0.00 4.03 lineto +closepath stroke + 0.00 3.67 moveto + 0.43 3.93 lineto +closepath stroke + 0.00 3.67 moveto + 0.36 3.61 lineto +closepath stroke + 0.00 3.67 moveto + 0.00 3.33 lineto +closepath stroke + 2.28 3.00 moveto + 2.33 3.10 lineto +closepath stroke + 2.28 3.00 moveto + 2.49 3.07 lineto +closepath stroke + 2.28 3.00 moveto + 2.15 3.14 lineto +closepath stroke + 2.28 3.00 moveto + 2.06 3.00 lineto +closepath stroke + 2.28 3.00 moveto + 2.49 2.93 lineto +closepath stroke + 2.28 3.00 moveto + 2.33 2.90 lineto +closepath stroke + 2.28 3.00 moveto + 2.15 2.86 lineto +closepath stroke + 1.85 3.00 moveto + 1.74 3.18 lineto +closepath stroke + 1.85 3.00 moveto + 1.94 3.14 lineto +closepath stroke + 1.85 3.00 moveto + 2.06 3.00 lineto +closepath stroke + 1.85 3.00 moveto + 1.61 3.00 lineto +closepath stroke + 1.85 3.00 moveto + 1.94 2.86 lineto +closepath stroke + 1.85 3.00 moveto + 1.74 2.82 lineto +closepath stroke + 1.38 3.00 moveto + 1.29 3.23 lineto +closepath stroke + 1.38 3.00 moveto + 1.50 3.18 lineto +closepath stroke + 1.38 3.00 moveto + 1.61 3.00 lineto +closepath stroke + 1.38 3.00 moveto + 1.12 3.00 lineto +closepath stroke + 1.38 3.00 moveto + 1.50 2.82 lineto +closepath stroke + 1.38 3.00 moveto + 1.29 2.77 lineto +closepath stroke + 0.86 3.00 moveto + 0.79 3.28 lineto +closepath stroke + 0.86 3.00 moveto + 1.03 3.23 lineto +closepath stroke + 0.86 3.00 moveto + 1.12 3.00 lineto +closepath stroke + 0.86 3.00 moveto + 0.43 3.00 lineto +closepath stroke + 0.86 3.00 moveto + 1.03 2.77 lineto +closepath stroke + 0.86 3.00 moveto + 0.79 2.72 lineto +closepath stroke + 0.00 3.00 moveto + 0.00 3.33 lineto +closepath stroke + 0.00 3.00 moveto + 0.36 3.28 lineto +closepath stroke + 0.00 3.00 moveto + 0.43 3.00 lineto +closepath stroke + 0.00 3.00 moveto + 0.36 2.72 lineto +closepath stroke + 0.00 3.00 moveto + 0.00 2.67 lineto +closepath stroke + 2.70 2.86 moveto + 2.54 2.83 lineto +closepath stroke + 2.70 2.86 moveto + 2.49 2.93 lineto +closepath stroke + 2.70 2.86 moveto + 2.89 2.83 lineto +closepath stroke + 2.70 2.86 moveto + 2.77 2.78 lineto +closepath stroke + 2.70 2.86 moveto + 2.64 2.72 lineto +closepath stroke + 2.38 2.79 moveto + 2.33 2.90 lineto +closepath stroke + 2.38 2.79 moveto + 2.54 2.83 lineto +closepath stroke + 2.38 2.79 moveto + 2.20 2.76 lineto +closepath stroke + 2.38 2.79 moveto + 2.48 2.68 lineto +closepath stroke + 2.38 2.79 moveto + 2.34 2.62 lineto +closepath stroke + 2.02 2.72 moveto + 1.94 2.86 lineto +closepath stroke + 2.02 2.72 moveto + 2.15 2.86 lineto +closepath stroke + 2.02 2.72 moveto + 2.20 2.76 lineto +closepath stroke + 2.02 2.72 moveto + 1.83 2.68 lineto +closepath stroke + 2.02 2.72 moveto + 2.16 2.58 lineto +closepath stroke + 2.02 2.72 moveto + 2.00 2.51 lineto +closepath stroke + 1.63 2.63 moveto + 1.50 2.82 lineto +closepath stroke + 1.63 2.63 moveto + 1.74 2.82 lineto +closepath stroke + 1.63 2.63 moveto + 1.83 2.68 lineto +closepath stroke + 1.63 2.63 moveto + 1.42 2.59 lineto +closepath stroke + 1.63 2.63 moveto + 1.81 2.47 lineto +closepath stroke + 1.63 2.63 moveto + 1.64 2.40 lineto +closepath stroke + 1.20 2.54 moveto + 1.03 2.77 lineto +closepath stroke + 1.20 2.54 moveto + 1.29 2.77 lineto +closepath stroke + 1.20 2.54 moveto + 1.42 2.59 lineto +closepath stroke + 1.20 2.54 moveto + 0.96 2.49 lineto +closepath stroke + 1.20 2.54 moveto + 1.42 2.35 lineto +closepath stroke + 1.20 2.54 moveto + 1.23 2.27 lineto +closepath stroke + 0.73 2.44 moveto + 0.36 2.72 lineto +closepath stroke + 0.73 2.44 moveto + 0.79 2.72 lineto +closepath stroke + 0.73 2.44 moveto + 0.96 2.49 lineto +closepath stroke + 0.73 2.44 moveto + 0.36 2.39 lineto +closepath stroke + 0.73 2.44 moveto + 1.00 2.22 lineto +closepath stroke + 0.73 2.44 moveto + 0.79 2.12 lineto +closepath stroke + 0.00 2.33 moveto + 0.00 2.67 lineto +closepath stroke + 0.00 2.33 moveto + 0.36 2.39 lineto +closepath stroke + 0.00 2.33 moveto + 0.43 2.07 lineto +closepath stroke + 0.00 2.33 moveto + 0.00 1.97 lineto +closepath stroke + 3.07 2.79 moveto + 2.95 2.74 lineto +closepath stroke + 3.07 2.79 moveto + 2.89 2.83 lineto +closepath stroke + 3.07 2.79 moveto + 3.21 2.78 lineto +closepath stroke + 3.07 2.79 moveto + 3.13 2.72 lineto +closepath stroke + 3.07 2.79 moveto + 3.04 2.65 lineto +closepath stroke + 2.83 2.69 moveto + 2.77 2.78 lineto +closepath stroke + 2.83 2.69 moveto + 2.95 2.74 lineto +closepath stroke + 2.83 2.69 moveto + 2.70 2.63 lineto +closepath stroke + 2.83 2.69 moveto + 2.92 2.60 lineto +closepath stroke + 2.83 2.69 moveto + 2.82 2.53 lineto +closepath stroke + 2.58 2.57 moveto + 2.64 2.72 lineto +closepath stroke + 2.58 2.57 moveto + 2.70 2.63 lineto +closepath stroke + 2.58 2.57 moveto + 2.48 2.68 lineto +closepath stroke + 2.58 2.57 moveto + 2.43 2.51 lineto +closepath stroke + 2.58 2.57 moveto + 2.70 2.47 lineto +closepath stroke + 2.58 2.57 moveto + 2.59 2.40 lineto +closepath stroke + 2.29 2.45 moveto + 2.16 2.58 lineto +closepath stroke + 2.29 2.45 moveto + 2.34 2.62 lineto +closepath stroke + 2.29 2.45 moveto + 2.43 2.51 lineto +closepath stroke + 2.29 2.45 moveto + 2.14 2.38 lineto +closepath stroke + 2.29 2.45 moveto + 2.45 2.33 lineto +closepath stroke + 2.29 2.45 moveto + 2.33 2.25 lineto +closepath stroke + 1.98 2.31 moveto + 1.81 2.47 lineto +closepath stroke + 1.98 2.31 moveto + 2.00 2.51 lineto +closepath stroke + 1.98 2.31 moveto + 2.14 2.38 lineto +closepath stroke + 1.98 2.31 moveto + 1.81 2.23 lineto +closepath stroke + 1.98 2.31 moveto + 2.17 2.18 lineto +closepath stroke + 1.98 2.31 moveto + 2.04 2.08 lineto +closepath stroke + 1.64 2.16 moveto + 1.42 2.35 lineto +closepath stroke + 1.64 2.16 moveto + 1.64 2.40 lineto +closepath stroke + 1.64 2.16 moveto + 1.81 2.23 lineto +closepath stroke + 1.64 2.16 moveto + 1.45 2.07 lineto +closepath stroke + 1.64 2.16 moveto + 1.87 2.01 lineto +closepath stroke + 1.64 2.16 moveto + 1.73 1.90 lineto +closepath stroke + 1.26 1.99 moveto + 1.00 2.22 lineto +closepath stroke + 1.26 1.99 moveto + 1.23 2.27 lineto +closepath stroke + 1.26 1.99 moveto + 1.45 2.07 lineto +closepath stroke + 1.26 1.99 moveto + 1.06 1.90 lineto +closepath stroke + 1.26 1.99 moveto + 1.54 1.82 lineto +closepath stroke + 1.26 1.99 moveto + 1.38 1.70 lineto +closepath stroke + 0.85 1.81 moveto + 0.43 2.07 lineto +closepath stroke + 0.85 1.81 moveto + 0.79 2.12 lineto +closepath stroke + 0.85 1.81 moveto + 1.06 1.90 lineto +closepath stroke + 0.85 1.81 moveto + 0.43 1.70 lineto +closepath stroke + 0.85 1.81 moveto + 1.18 1.61 lineto +closepath stroke + 0.85 1.81 moveto + 1.00 1.49 lineto +closepath stroke + 0.85 1.81 moveto + 0.81 1.35 lineto +closepath stroke + 0.00 1.60 moveto + 0.00 1.97 lineto +closepath stroke + 0.00 1.60 moveto + 0.43 1.70 lineto +closepath stroke + 0.00 1.60 moveto + 0.39 1.25 lineto +closepath stroke + 0.00 1.60 moveto + 0.00 1.09 lineto +closepath stroke + 3.35 2.76 moveto + 3.27 2.71 lineto +closepath stroke + 3.35 2.76 moveto + 3.21 2.78 lineto +closepath stroke + 3.35 2.76 moveto + 3.46 2.76 lineto +closepath stroke + 3.35 2.76 moveto + 3.41 2.70 lineto +closepath stroke + 3.35 2.76 moveto + 3.35 2.64 lineto +closepath stroke + 3.19 2.65 moveto + 3.13 2.72 lineto +closepath stroke + 3.19 2.65 moveto + 3.27 2.71 lineto +closepath stroke + 3.19 2.65 moveto + 3.10 2.58 lineto +closepath stroke + 3.19 2.65 moveto + 3.27 2.58 lineto +closepath stroke + 3.19 2.65 moveto + 3.20 2.51 lineto +closepath stroke + 3.01 2.52 moveto + 3.04 2.65 lineto +closepath stroke + 3.01 2.52 moveto + 3.10 2.58 lineto +closepath stroke + 3.01 2.52 moveto + 2.92 2.60 lineto +closepath stroke + 3.01 2.52 moveto + 2.91 2.45 lineto +closepath stroke + 3.01 2.52 moveto + 3.11 2.44 lineto +closepath stroke + 3.01 2.52 moveto + 3.04 2.36 lineto +closepath stroke + 2.82 2.38 moveto + 2.82 2.53 lineto +closepath stroke + 2.82 2.38 moveto + 2.91 2.45 lineto +closepath stroke + 2.82 2.38 moveto + 2.70 2.47 lineto +closepath stroke + 2.82 2.38 moveto + 2.71 2.30 lineto +closepath stroke + 2.82 2.38 moveto + 2.94 2.29 lineto +closepath stroke + 2.82 2.38 moveto + 2.86 2.20 lineto +closepath stroke + 2.60 2.22 moveto + 2.59 2.40 lineto +closepath stroke + 2.60 2.22 moveto + 2.71 2.30 lineto +closepath stroke + 2.60 2.22 moveto + 2.45 2.33 lineto +closepath stroke + 2.60 2.22 moveto + 2.48 2.13 lineto +closepath stroke + 2.60 2.22 moveto + 2.75 2.12 lineto +closepath stroke + 2.60 2.22 moveto + 2.67 2.03 lineto +closepath stroke + 2.36 2.05 moveto + 2.33 2.25 lineto +closepath stroke + 2.36 2.05 moveto + 2.48 2.13 lineto +closepath stroke + 2.36 2.05 moveto + 2.17 2.18 lineto +closepath stroke + 2.36 2.05 moveto + 2.23 1.95 lineto +closepath stroke + 2.36 2.05 moveto + 2.55 1.94 lineto +closepath stroke + 2.36 2.05 moveto + 2.45 1.83 lineto +closepath stroke + 2.10 1.86 moveto + 2.04 2.08 lineto +closepath stroke + 2.10 1.86 moveto + 2.23 1.95 lineto +closepath stroke + 2.10 1.86 moveto + 1.87 2.01 lineto +closepath stroke + 2.10 1.86 moveto + 1.96 1.75 lineto +closepath stroke + 2.10 1.86 moveto + 2.32 1.74 lineto +closepath stroke + 2.10 1.86 moveto + 2.22 1.62 lineto +closepath stroke + 1.82 1.65 moveto + 1.54 1.82 lineto +closepath stroke + 1.82 1.65 moveto + 1.73 1.90 lineto +closepath stroke + 1.82 1.65 moveto + 1.96 1.75 lineto +closepath stroke + 1.82 1.65 moveto + 1.66 1.53 lineto +closepath stroke + 1.82 1.65 moveto + 2.07 1.52 lineto +closepath stroke + 1.82 1.65 moveto + 1.96 1.39 lineto +closepath stroke + 1.50 1.42 moveto + 1.18 1.61 lineto +closepath stroke + 1.50 1.42 moveto + 1.38 1.70 lineto +closepath stroke + 1.50 1.42 moveto + 1.66 1.53 lineto +closepath stroke + 1.50 1.42 moveto + 1.33 1.29 lineto +closepath stroke + 1.50 1.42 moveto + 1.80 1.28 lineto +closepath stroke + 1.50 1.42 moveto + 1.67 1.13 lineto +closepath stroke + 1.15 1.17 moveto + 1.00 1.49 lineto +closepath stroke + 1.15 1.17 moveto + 1.33 1.29 lineto +closepath stroke + 1.15 1.17 moveto + 0.96 1.03 lineto +closepath stroke + 1.15 1.17 moveto + 1.50 1.01 lineto +closepath stroke + 1.15 1.17 moveto + 1.36 0.85 lineto +closepath stroke + 0.77 0.89 moveto + 0.39 1.25 lineto +closepath stroke + 0.77 0.89 moveto + 0.81 1.35 lineto +closepath stroke + 0.77 0.89 moveto + 0.96 1.03 lineto +closepath stroke + 0.77 0.89 moveto + 0.39 0.74 lineto +closepath stroke + 0.77 0.89 moveto + 0.39 0.44 lineto +closepath stroke + 0.77 0.89 moveto + 1.17 0.71 lineto +closepath stroke + 0.77 0.89 moveto + 1.02 0.44 lineto +closepath stroke + 0.00 0.58 moveto + 0.00 1.09 lineto +closepath stroke + 0.00 0.58 moveto + 0.39 0.74 lineto +closepath stroke + 0.00 0.58 moveto + 0.00 0.29 lineto +closepath stroke + 3.57 2.76 moveto + 3.51 2.70 lineto +closepath stroke + 3.57 2.76 moveto + 3.46 2.76 lineto +closepath stroke + 3.57 2.76 moveto + 3.61 2.70 lineto +closepath stroke + 3.57 2.76 moveto + 3.65 2.76 lineto +closepath stroke + 3.46 2.64 moveto + 3.41 2.70 lineto +closepath stroke + 3.46 2.64 moveto + 3.51 2.70 lineto +closepath stroke + 3.46 2.64 moveto + 3.40 2.57 lineto +closepath stroke + 3.46 2.64 moveto + 3.56 2.64 lineto +closepath stroke + 3.46 2.64 moveto + 3.52 2.58 lineto +closepath stroke + 3.34 2.51 moveto + 3.27 2.58 lineto +closepath stroke + 3.34 2.51 moveto + 3.35 2.64 lineto +closepath stroke + 3.34 2.51 moveto + 3.40 2.57 lineto +closepath stroke + 3.34 2.51 moveto + 3.28 2.44 lineto +closepath stroke + 3.34 2.51 moveto + 3.46 2.51 lineto +closepath stroke + 3.34 2.51 moveto + 3.42 2.44 lineto +closepath stroke + 3.21 2.36 moveto + 3.20 2.51 lineto +closepath stroke + 3.21 2.36 moveto + 3.28 2.44 lineto +closepath stroke + 3.21 2.36 moveto + 3.11 2.44 lineto +closepath stroke + 3.21 2.36 moveto + 3.14 2.28 lineto +closepath stroke + 3.21 2.36 moveto + 3.36 2.37 lineto +closepath stroke + 3.21 2.36 moveto + 3.31 2.29 lineto +closepath stroke + 3.21 2.36 moveto + 3.26 2.20 lineto +closepath stroke + 3.07 2.20 moveto + 3.04 2.36 lineto +closepath stroke + 3.07 2.20 moveto + 3.14 2.28 lineto +closepath stroke + 3.07 2.20 moveto + 2.94 2.29 lineto +closepath stroke + 3.07 2.20 moveto + 2.99 2.12 lineto +closepath stroke + 3.07 2.20 moveto + 3.19 2.12 lineto +closepath stroke + 3.07 2.20 moveto + 3.13 2.03 lineto +closepath stroke + 2.91 2.03 moveto + 2.86 2.20 lineto +closepath stroke + 2.91 2.03 moveto + 2.99 2.12 lineto +closepath stroke + 2.91 2.03 moveto + 2.75 2.12 lineto +closepath stroke + 2.91 2.03 moveto + 2.82 1.93 lineto +closepath stroke + 2.91 2.03 moveto + 3.06 1.94 lineto +closepath stroke + 2.91 2.03 moveto + 3.00 1.84 lineto +closepath stroke + 2.73 1.83 moveto + 2.67 2.03 lineto +closepath stroke + 2.73 1.83 moveto + 2.82 1.93 lineto +closepath stroke + 2.73 1.83 moveto + 2.55 1.94 lineto +closepath stroke + 2.73 1.83 moveto + 2.64 1.73 lineto +closepath stroke + 2.73 1.83 moveto + 2.91 1.74 lineto +closepath stroke + 2.73 1.83 moveto + 2.84 1.63 lineto +closepath stroke + 2.54 1.62 moveto + 2.45 1.83 lineto +closepath stroke + 2.54 1.62 moveto + 2.64 1.73 lineto +closepath stroke + 2.54 1.62 moveto + 2.32 1.74 lineto +closepath stroke + 2.54 1.62 moveto + 2.44 1.51 lineto +closepath stroke + 2.54 1.62 moveto + 2.75 1.52 lineto +closepath stroke + 2.54 1.62 moveto + 2.67 1.39 lineto +closepath stroke + 2.33 1.39 moveto + 2.22 1.62 lineto +closepath stroke + 2.33 1.39 moveto + 2.44 1.51 lineto +closepath stroke + 2.33 1.39 moveto + 2.07 1.52 lineto +closepath stroke + 2.33 1.39 moveto + 2.22 1.26 lineto +closepath stroke + 2.33 1.39 moveto + 2.57 1.28 lineto +closepath stroke + 2.33 1.39 moveto + 2.49 1.14 lineto +closepath stroke + 2.10 1.13 moveto + 1.96 1.39 lineto +closepath stroke + 2.10 1.13 moveto + 2.22 1.26 lineto +closepath stroke + 2.10 1.13 moveto + 1.80 1.28 lineto +closepath stroke + 2.10 1.13 moveto + 1.97 0.99 lineto +closepath stroke + 2.10 1.13 moveto + 2.37 1.01 lineto +closepath stroke + 2.10 1.13 moveto + 2.28 0.86 lineto +closepath stroke + 1.85 0.85 moveto + 1.67 1.13 lineto +closepath stroke + 1.85 0.85 moveto + 1.97 0.99 lineto +closepath stroke + 1.85 0.85 moveto + 1.50 1.01 lineto +closepath stroke + 1.85 0.85 moveto + 1.71 0.69 lineto +closepath stroke + 1.85 0.85 moveto + 2.16 0.71 lineto +closepath stroke + 1.57 0.54 moveto + 1.36 0.85 lineto +closepath stroke + 1.57 0.54 moveto + 1.71 0.69 lineto +closepath stroke + 1.57 0.54 moveto + 1.17 0.71 lineto +closepath stroke + 1.57 0.54 moveto + 1.41 0.27 lineto +closepath stroke + 1.57 0.54 moveto + 2.02 0.56 lineto +closepath stroke + 1.57 0.54 moveto + 1.92 0.27 lineto +closepath stroke + 1.26 0.00 moveto + 1.02 0.44 lineto +closepath stroke + 1.26 0.00 moveto + 1.41 0.27 lineto +closepath stroke + 1.26 0.00 moveto + 0.63 0.00 lineto +closepath stroke + 1.26 0.00 moveto + 1.77 0.00 lineto +closepath stroke + 3.73 2.76 moveto + 3.69 2.71 lineto +closepath stroke + 3.73 2.76 moveto + 3.65 2.76 lineto +closepath stroke + 3.73 2.76 moveto + 3.77 2.71 lineto +closepath stroke + 3.73 2.76 moveto + 3.79 2.77 lineto +closepath stroke + 3.66 2.65 moveto + 3.56 2.64 lineto +closepath stroke + 3.66 2.65 moveto + 3.61 2.70 lineto +closepath stroke + 3.66 2.65 moveto + 3.69 2.71 lineto +closepath stroke + 3.66 2.65 moveto + 3.62 2.58 lineto +closepath stroke + 3.66 2.65 moveto + 3.74 2.65 lineto +closepath stroke + 3.66 2.65 moveto + 3.72 2.59 lineto +closepath stroke + 3.58 2.52 moveto + 3.46 2.51 lineto +closepath stroke + 3.58 2.52 moveto + 3.52 2.58 lineto +closepath stroke + 3.58 2.52 moveto + 3.62 2.58 lineto +closepath stroke + 3.58 2.52 moveto + 3.54 2.45 lineto +closepath stroke + 3.58 2.52 moveto + 3.68 2.52 lineto +closepath stroke + 3.58 2.52 moveto + 3.65 2.45 lineto +closepath stroke + 3.50 2.37 moveto + 3.36 2.37 lineto +closepath stroke + 3.50 2.37 moveto + 3.42 2.44 lineto +closepath stroke + 3.50 2.37 moveto + 3.54 2.45 lineto +closepath stroke + 3.50 2.37 moveto + 3.46 2.30 lineto +closepath stroke + 3.50 2.37 moveto + 3.61 2.38 lineto +closepath stroke + 3.50 2.37 moveto + 3.59 2.30 lineto +closepath stroke + 3.41 2.22 moveto + 3.31 2.29 lineto +closepath stroke + 3.41 2.22 moveto + 3.46 2.30 lineto +closepath stroke + 3.41 2.22 moveto + 3.36 2.13 lineto +closepath stroke + 3.41 2.22 moveto + 3.54 2.22 lineto +closepath stroke + 3.41 2.22 moveto + 3.52 2.14 lineto +closepath stroke + 3.31 2.04 moveto + 3.26 2.20 lineto +closepath stroke + 3.31 2.04 moveto + 3.36 2.13 lineto +closepath stroke + 3.31 2.04 moveto + 3.19 2.12 lineto +closepath stroke + 3.31 2.04 moveto + 3.26 1.95 lineto +closepath stroke + 3.31 2.04 moveto + 3.47 2.05 lineto +closepath stroke + 3.31 2.04 moveto + 3.44 1.96 lineto +closepath stroke + 3.20 1.85 moveto + 3.13 2.03 lineto +closepath stroke + 3.20 1.85 moveto + 3.26 1.95 lineto +closepath stroke + 3.20 1.85 moveto + 3.06 1.94 lineto +closepath stroke + 3.20 1.85 moveto + 3.14 1.75 lineto +closepath stroke + 3.20 1.85 moveto + 3.38 1.86 lineto +closepath stroke + 3.20 1.85 moveto + 3.35 1.76 lineto +closepath stroke + 3.08 1.65 moveto + 3.00 1.84 lineto +closepath stroke + 3.08 1.65 moveto + 3.14 1.75 lineto +closepath stroke + 3.08 1.65 moveto + 2.91 1.74 lineto +closepath stroke + 3.08 1.65 moveto + 3.02 1.53 lineto +closepath stroke + 3.08 1.65 moveto + 3.29 1.66 lineto +closepath stroke + 3.08 1.65 moveto + 3.25 1.54 lineto +closepath stroke + 2.95 1.42 moveto + 2.84 1.63 lineto +closepath stroke + 2.95 1.42 moveto + 3.02 1.53 lineto +closepath stroke + 2.95 1.42 moveto + 2.75 1.52 lineto +closepath stroke + 2.95 1.42 moveto + 2.88 1.29 lineto +closepath stroke + 2.95 1.42 moveto + 3.18 1.43 lineto +closepath stroke + 2.95 1.42 moveto + 3.14 1.31 lineto +closepath stroke + 2.80 1.16 moveto + 2.67 1.39 lineto +closepath stroke + 2.80 1.16 moveto + 2.88 1.29 lineto +closepath stroke + 2.80 1.16 moveto + 2.57 1.28 lineto +closepath stroke + 2.80 1.16 moveto + 2.72 1.02 lineto +closepath stroke + 2.80 1.16 moveto + 3.07 1.18 lineto +closepath stroke + 2.80 1.16 moveto + 3.03 1.04 lineto +closepath stroke + 2.64 0.88 moveto + 2.49 1.14 lineto +closepath stroke + 2.64 0.88 moveto + 2.72 1.02 lineto +closepath stroke + 2.64 0.88 moveto + 2.37 1.01 lineto +closepath stroke + 2.64 0.88 moveto + 2.55 0.73 lineto +closepath stroke + 2.64 0.88 moveto + 2.95 0.90 lineto +closepath stroke + 2.64 0.88 moveto + 2.90 0.75 lineto +closepath stroke + 2.47 0.58 moveto + 2.02 0.56 lineto +closepath stroke + 2.47 0.58 moveto + 2.16 0.71 lineto +closepath stroke + 2.47 0.58 moveto + 2.28 0.86 lineto +closepath stroke + 2.47 0.58 moveto + 2.55 0.73 lineto +closepath stroke + 2.47 0.58 moveto + 2.37 0.29 lineto +closepath stroke + 2.47 0.58 moveto + 2.81 0.60 lineto +closepath stroke + 2.47 0.58 moveto + 2.76 0.29 lineto +closepath stroke + 2.27 0.00 moveto + 1.77 0.00 lineto +closepath stroke + 2.27 0.00 moveto + 1.92 0.27 lineto +closepath stroke + 2.27 0.00 moveto + 2.37 0.29 lineto +closepath stroke + 2.27 0.00 moveto + 2.66 0.00 lineto +closepath stroke + 3.85 2.77 moveto + 3.83 2.71 lineto +closepath stroke + 3.85 2.77 moveto + 3.79 2.77 lineto +closepath stroke + 3.85 2.77 moveto + 3.89 2.71 lineto +closepath stroke + 3.85 2.77 moveto + 3.90 2.77 lineto +closepath stroke + 3.81 2.65 moveto + 3.74 2.65 lineto +closepath stroke + 3.81 2.65 moveto + 3.77 2.71 lineto +closepath stroke + 3.81 2.65 moveto + 3.83 2.71 lineto +closepath stroke + 3.81 2.65 moveto + 3.79 2.59 lineto +closepath stroke + 3.81 2.65 moveto + 3.88 2.65 lineto +closepath stroke + 3.81 2.65 moveto + 3.87 2.59 lineto +closepath stroke + 3.77 2.53 moveto + 3.68 2.52 lineto +closepath stroke + 3.77 2.53 moveto + 3.72 2.59 lineto +closepath stroke + 3.77 2.53 moveto + 3.79 2.59 lineto +closepath stroke + 3.77 2.53 moveto + 3.75 2.46 lineto +closepath stroke + 3.77 2.53 moveto + 3.85 2.53 lineto +closepath stroke + 3.77 2.53 moveto + 3.84 2.46 lineto +closepath stroke + 3.72 2.39 moveto + 3.61 2.38 lineto +closepath stroke + 3.72 2.39 moveto + 3.65 2.45 lineto +closepath stroke + 3.72 2.39 moveto + 3.75 2.46 lineto +closepath stroke + 3.72 2.39 moveto + 3.70 2.31 lineto +closepath stroke + 3.72 2.39 moveto + 3.82 2.39 lineto +closepath stroke + 3.72 2.39 moveto + 3.81 2.31 lineto +closepath stroke + 3.67 2.23 moveto + 3.54 2.22 lineto +closepath stroke + 3.67 2.23 moveto + 3.59 2.30 lineto +closepath stroke + 3.67 2.23 moveto + 3.70 2.31 lineto +closepath stroke + 3.67 2.23 moveto + 3.65 2.15 lineto +closepath stroke + 3.67 2.23 moveto + 3.79 2.23 lineto +closepath stroke + 3.67 2.23 moveto + 3.78 2.15 lineto +closepath stroke + 3.62 2.06 moveto + 3.52 2.14 lineto +closepath stroke + 3.62 2.06 moveto + 3.65 2.15 lineto +closepath stroke + 3.62 2.06 moveto + 3.47 2.05 lineto +closepath stroke + 3.62 2.06 moveto + 3.59 1.97 lineto +closepath stroke + 3.62 2.06 moveto + 3.75 2.06 lineto +closepath stroke + 3.62 2.06 moveto + 3.74 1.97 lineto +closepath stroke + 3.56 1.87 moveto + 3.44 1.96 lineto +closepath stroke + 3.56 1.87 moveto + 3.59 1.97 lineto +closepath stroke + 3.56 1.87 moveto + 3.38 1.86 lineto +closepath stroke + 3.56 1.87 moveto + 3.53 1.77 lineto +closepath stroke + 3.56 1.87 moveto + 3.71 1.88 lineto +closepath stroke + 3.56 1.87 moveto + 3.70 1.78 lineto +closepath stroke + 3.49 1.67 moveto + 3.35 1.76 lineto +closepath stroke + 3.49 1.67 moveto + 3.53 1.77 lineto +closepath stroke + 3.49 1.67 moveto + 3.29 1.66 lineto +closepath stroke + 3.49 1.67 moveto + 3.46 1.56 lineto +closepath stroke + 3.49 1.67 moveto + 3.66 1.67 lineto +closepath stroke + 3.49 1.67 moveto + 3.65 1.56 lineto +closepath stroke + 3.42 1.44 moveto + 3.25 1.54 lineto +closepath stroke + 3.42 1.44 moveto + 3.46 1.56 lineto +closepath stroke + 3.42 1.44 moveto + 3.18 1.43 lineto +closepath stroke + 3.42 1.44 moveto + 3.38 1.32 lineto +closepath stroke + 3.42 1.44 moveto + 3.62 1.45 lineto +closepath stroke + 3.42 1.44 moveto + 3.60 1.33 lineto +closepath stroke + 3.34 1.20 moveto + 3.14 1.31 lineto +closepath stroke + 3.34 1.20 moveto + 3.38 1.32 lineto +closepath stroke + 3.34 1.20 moveto + 3.07 1.18 lineto +closepath stroke + 3.34 1.20 moveto + 3.29 1.06 lineto +closepath stroke + 3.34 1.20 moveto + 3.56 1.20 lineto +closepath stroke + 3.34 1.20 moveto + 3.55 1.07 lineto +closepath stroke + 3.25 0.92 moveto + 3.03 1.04 lineto +closepath stroke + 3.25 0.92 moveto + 3.29 1.06 lineto +closepath stroke + 3.25 0.92 moveto + 2.95 0.90 lineto +closepath stroke + 3.25 0.92 moveto + 3.20 0.77 lineto +closepath stroke + 3.25 0.92 moveto + 3.50 0.93 lineto +closepath stroke + 3.25 0.92 moveto + 3.49 0.78 lineto +closepath stroke + 3.15 0.62 moveto + 2.90 0.75 lineto +closepath stroke + 3.15 0.62 moveto + 3.20 0.77 lineto +closepath stroke + 3.15 0.62 moveto + 2.81 0.60 lineto +closepath stroke + 3.15 0.62 moveto + 3.10 0.31 lineto +closepath stroke + 3.15 0.62 moveto + 3.44 0.63 lineto +closepath stroke + 3.15 0.62 moveto + 3.42 0.31 lineto +closepath stroke + 3.04 0.00 moveto + 2.76 0.29 lineto +closepath stroke + 3.04 0.00 moveto + 3.10 0.31 lineto +closepath stroke + 3.04 0.00 moveto + 2.66 0.00 lineto +closepath stroke + 3.04 0.00 moveto + 3.37 0.00 lineto +closepath stroke + 3.95 2.77 moveto + 3.95 2.71 lineto +closepath stroke + 3.95 2.77 moveto + 3.90 2.77 lineto +closepath stroke + 3.95 2.77 moveto + 4.01 2.71 lineto +closepath stroke + 3.95 2.77 moveto + 4.00 2.77 lineto +closepath stroke + 3.94 2.65 moveto + 3.88 2.65 lineto +closepath stroke + 3.94 2.65 moveto + 3.89 2.71 lineto +closepath stroke + 3.94 2.65 moveto + 3.95 2.71 lineto +closepath stroke + 3.94 2.65 moveto + 3.93 2.59 lineto +closepath stroke + 3.94 2.65 moveto + 4.00 2.66 lineto +closepath stroke + 3.94 2.65 moveto + 4.01 2.59 lineto +closepath stroke + 3.93 2.53 moveto + 3.85 2.53 lineto +closepath stroke + 3.93 2.53 moveto + 3.87 2.59 lineto +closepath stroke + 3.93 2.53 moveto + 3.93 2.59 lineto +closepath stroke + 3.93 2.53 moveto + 3.92 2.46 lineto +closepath stroke + 3.93 2.53 moveto + 4.00 2.53 lineto +closepath stroke + 3.93 2.53 moveto + 4.01 2.46 lineto +closepath stroke + 3.91 2.39 moveto + 3.82 2.39 lineto +closepath stroke + 3.91 2.39 moveto + 3.84 2.46 lineto +closepath stroke + 3.91 2.39 moveto + 3.92 2.46 lineto +closepath stroke + 3.91 2.39 moveto + 3.90 2.31 lineto +closepath stroke + 3.91 2.39 moveto + 4.00 2.39 lineto +closepath stroke + 3.91 2.39 moveto + 4.01 2.31 lineto +closepath stroke + 3.90 2.24 moveto + 3.79 2.23 lineto +closepath stroke + 3.90 2.24 moveto + 3.81 2.31 lineto +closepath stroke + 3.90 2.24 moveto + 3.90 2.31 lineto +closepath stroke + 3.90 2.24 moveto + 3.89 2.15 lineto +closepath stroke + 3.90 2.24 moveto + 4.00 2.24 lineto +closepath stroke + 3.90 2.24 moveto + 4.01 2.15 lineto +closepath stroke + 3.88 2.07 moveto + 3.75 2.06 lineto +closepath stroke + 3.88 2.07 moveto + 3.78 2.15 lineto +closepath stroke + 3.88 2.07 moveto + 3.89 2.15 lineto +closepath stroke + 3.88 2.07 moveto + 3.87 1.98 lineto +closepath stroke + 3.88 2.07 moveto + 4.00 2.07 lineto +closepath stroke + 3.88 2.07 moveto + 4.01 1.98 lineto +closepath stroke + 3.86 1.88 moveto + 3.71 1.88 lineto +closepath stroke + 3.86 1.88 moveto + 3.74 1.97 lineto +closepath stroke + 3.86 1.88 moveto + 3.87 1.98 lineto +closepath stroke + 3.86 1.88 moveto + 3.85 1.78 lineto +closepath stroke + 3.86 1.88 moveto + 4.00 1.88 lineto +closepath stroke + 3.86 1.88 moveto + 4.01 1.78 lineto +closepath stroke + 3.84 1.68 moveto + 3.70 1.78 lineto +closepath stroke + 3.84 1.68 moveto + 3.85 1.78 lineto +closepath stroke + 3.84 1.68 moveto + 3.66 1.67 lineto +closepath stroke + 3.84 1.68 moveto + 3.83 1.57 lineto +closepath stroke + 3.84 1.68 moveto + 4.00 1.68 lineto +closepath stroke + 3.84 1.68 moveto + 4.01 1.57 lineto +closepath stroke + 3.81 1.45 moveto + 3.65 1.56 lineto +closepath stroke + 3.81 1.45 moveto + 3.83 1.57 lineto +closepath stroke + 3.81 1.45 moveto + 3.62 1.45 lineto +closepath stroke + 3.81 1.45 moveto + 3.80 1.33 lineto +closepath stroke + 3.81 1.45 moveto + 4.00 1.46 lineto +closepath stroke + 3.81 1.45 moveto + 4.01 1.33 lineto +closepath stroke + 3.79 1.21 moveto + 3.60 1.33 lineto +closepath stroke + 3.79 1.21 moveto + 3.80 1.33 lineto +closepath stroke + 3.79 1.21 moveto + 3.56 1.20 lineto +closepath stroke + 3.79 1.21 moveto + 3.77 1.07 lineto +closepath stroke + 3.79 1.21 moveto + 4.00 1.21 lineto +closepath stroke + 3.79 1.21 moveto + 4.01 1.07 lineto +closepath stroke + 3.76 0.94 moveto + 3.55 1.07 lineto +closepath stroke + 3.76 0.94 moveto + 3.77 1.07 lineto +closepath stroke + 3.76 0.94 moveto + 3.50 0.93 lineto +closepath stroke + 3.76 0.94 moveto + 3.74 0.79 lineto +closepath stroke + 3.76 0.94 moveto + 4.00 0.94 lineto +closepath stroke + 3.76 0.94 moveto + 4.02 0.79 lineto +closepath stroke + 3.73 0.64 moveto + 3.49 0.78 lineto +closepath stroke + 3.73 0.64 moveto + 3.74 0.79 lineto +closepath stroke + 3.73 0.64 moveto + 3.44 0.63 lineto +closepath stroke + 3.73 0.64 moveto + 3.71 0.32 lineto +closepath stroke + 3.73 0.64 moveto + 4.00 0.64 lineto +closepath stroke + 3.73 0.64 moveto + 4.02 0.32 lineto +closepath stroke + 3.69 0.00 moveto + 3.42 0.31 lineto +closepath stroke + 3.69 0.00 moveto + 3.71 0.32 lineto +closepath stroke + 3.69 0.00 moveto + 3.37 0.00 lineto +closepath stroke + 3.69 0.00 moveto + 4.00 0.00 lineto +closepath stroke + 4.05 2.77 moveto + 4.05 2.71 lineto +closepath stroke + 4.05 2.77 moveto + 4.00 2.77 lineto +closepath stroke + 4.05 2.77 moveto + 4.10 2.77 lineto +closepath stroke + 4.06 2.66 moveto + 4.00 2.66 lineto +closepath stroke + 4.06 2.66 moveto + 4.01 2.71 lineto +closepath stroke + 4.06 2.66 moveto + 4.05 2.71 lineto +closepath stroke + 4.06 2.66 moveto + 4.07 2.59 lineto +closepath stroke + 4.06 2.66 moveto + 4.10 2.71 lineto +closepath stroke + 4.06 2.66 moveto + 4.12 2.66 lineto +closepath stroke + 4.07 2.53 moveto + 4.00 2.53 lineto +closepath stroke + 4.07 2.53 moveto + 4.01 2.59 lineto +closepath stroke + 4.07 2.53 moveto + 4.07 2.59 lineto +closepath stroke + 4.07 2.53 moveto + 4.08 2.46 lineto +closepath stroke + 4.07 2.53 moveto + 4.13 2.59 lineto +closepath stroke + 4.07 2.53 moveto + 4.15 2.53 lineto +closepath stroke + 4.09 2.39 moveto + 4.00 2.39 lineto +closepath stroke + 4.09 2.39 moveto + 4.01 2.46 lineto +closepath stroke + 4.09 2.39 moveto + 4.08 2.46 lineto +closepath stroke + 4.09 2.39 moveto + 4.10 2.31 lineto +closepath stroke + 4.09 2.39 moveto + 4.16 2.46 lineto +closepath stroke + 4.09 2.39 moveto + 4.18 2.39 lineto +closepath stroke + 4.10 2.24 moveto + 4.00 2.24 lineto +closepath stroke + 4.10 2.24 moveto + 4.01 2.31 lineto +closepath stroke + 4.10 2.24 moveto + 4.10 2.31 lineto +closepath stroke + 4.10 2.24 moveto + 4.11 2.15 lineto +closepath stroke + 4.10 2.24 moveto + 4.19 2.32 lineto +closepath stroke + 4.10 2.24 moveto + 4.21 2.24 lineto +closepath stroke + 4.12 2.07 moveto + 4.00 2.07 lineto +closepath stroke + 4.12 2.07 moveto + 4.01 2.15 lineto +closepath stroke + 4.12 2.07 moveto + 4.11 2.15 lineto +closepath stroke + 4.12 2.07 moveto + 4.13 1.98 lineto +closepath stroke + 4.12 2.07 moveto + 4.22 2.16 lineto +closepath stroke + 4.12 2.07 moveto + 4.25 2.07 lineto +closepath stroke + 4.14 1.88 moveto + 4.00 1.88 lineto +closepath stroke + 4.14 1.88 moveto + 4.01 1.98 lineto +closepath stroke + 4.14 1.88 moveto + 4.13 1.98 lineto +closepath stroke + 4.14 1.88 moveto + 4.15 1.78 lineto +closepath stroke + 4.14 1.88 moveto + 4.26 1.98 lineto +closepath stroke + 4.14 1.88 moveto + 4.29 1.89 lineto +closepath stroke + 4.16 1.68 moveto + 4.00 1.68 lineto +closepath stroke + 4.16 1.68 moveto + 4.01 1.78 lineto +closepath stroke + 4.16 1.68 moveto + 4.15 1.78 lineto +closepath stroke + 4.16 1.68 moveto + 4.17 1.57 lineto +closepath stroke + 4.16 1.68 moveto + 4.30 1.79 lineto +closepath stroke + 4.16 1.68 moveto + 4.33 1.69 lineto +closepath stroke + 4.19 1.46 moveto + 4.01 1.57 lineto +closepath stroke + 4.19 1.46 moveto + 4.17 1.57 lineto +closepath stroke + 4.19 1.46 moveto + 4.00 1.46 lineto +closepath stroke + 4.19 1.46 moveto + 4.20 1.33 lineto +closepath stroke + 4.19 1.46 moveto + 4.34 1.57 lineto +closepath stroke + 4.19 1.46 moveto + 4.38 1.46 lineto +closepath stroke + 4.21 1.21 moveto + 4.01 1.33 lineto +closepath stroke + 4.21 1.21 moveto + 4.20 1.33 lineto +closepath stroke + 4.21 1.21 moveto + 4.00 1.21 lineto +closepath stroke + 4.21 1.21 moveto + 4.23 1.07 lineto +closepath stroke + 4.21 1.21 moveto + 4.39 1.34 lineto +closepath stroke + 4.21 1.21 moveto + 4.43 1.22 lineto +closepath stroke + 4.24 0.94 moveto + 4.01 1.07 lineto +closepath stroke + 4.24 0.94 moveto + 4.23 1.07 lineto +closepath stroke + 4.24 0.94 moveto + 4.00 0.94 lineto +closepath stroke + 4.24 0.94 moveto + 4.26 0.79 lineto +closepath stroke + 4.24 0.94 moveto + 4.45 1.08 lineto +closepath stroke + 4.24 0.94 moveto + 4.49 0.95 lineto +closepath stroke + 4.27 0.64 moveto + 4.02 0.79 lineto +closepath stroke + 4.27 0.64 moveto + 4.26 0.79 lineto +closepath stroke + 4.27 0.64 moveto + 4.00 0.64 lineto +closepath stroke + 4.27 0.64 moveto + 4.29 0.32 lineto +closepath stroke + 4.27 0.64 moveto + 4.50 0.80 lineto +closepath stroke + 4.27 0.64 moveto + 4.55 0.65 lineto +closepath stroke + 4.31 0.00 moveto + 4.02 0.32 lineto +closepath stroke + 4.31 0.00 moveto + 4.29 0.32 lineto +closepath stroke + 4.31 0.00 moveto + 4.00 0.00 lineto +closepath stroke + 4.31 0.00 moveto + 4.57 0.33 lineto +closepath stroke + 4.31 0.00 moveto + 4.62 0.00 lineto +closepath stroke + 4.15 2.77 moveto + 4.10 2.71 lineto +closepath stroke + 4.15 2.77 moveto + 4.10 2.77 lineto +closepath stroke + 4.15 2.77 moveto + 4.17 2.72 lineto +closepath stroke + 4.15 2.77 moveto + 4.20 2.78 lineto +closepath stroke + 4.18 2.66 moveto + 4.13 2.59 lineto +closepath stroke + 4.18 2.66 moveto + 4.12 2.66 lineto +closepath stroke + 4.18 2.66 moveto + 4.17 2.72 lineto +closepath stroke + 4.18 2.66 moveto + 4.21 2.60 lineto +closepath stroke + 4.18 2.66 moveto + 4.22 2.72 lineto +closepath stroke + 4.18 2.66 moveto + 4.25 2.67 lineto +closepath stroke + 4.23 2.53 moveto + 4.16 2.46 lineto +closepath stroke + 4.23 2.53 moveto + 4.15 2.53 lineto +closepath stroke + 4.23 2.53 moveto + 4.21 2.60 lineto +closepath stroke + 4.23 2.53 moveto + 4.25 2.47 lineto +closepath stroke + 4.23 2.53 moveto + 4.27 2.60 lineto +closepath stroke + 4.23 2.53 moveto + 4.30 2.54 lineto +closepath stroke + 4.27 2.40 moveto + 4.19 2.32 lineto +closepath stroke + 4.27 2.40 moveto + 4.18 2.39 lineto +closepath stroke + 4.27 2.40 moveto + 4.25 2.47 lineto +closepath stroke + 4.27 2.40 moveto + 4.29 2.32 lineto +closepath stroke + 4.27 2.40 moveto + 4.33 2.47 lineto +closepath stroke + 4.27 2.40 moveto + 4.36 2.41 lineto +closepath stroke + 4.32 2.25 moveto + 4.22 2.16 lineto +closepath stroke + 4.32 2.25 moveto + 4.21 2.24 lineto +closepath stroke + 4.32 2.25 moveto + 4.29 2.32 lineto +closepath stroke + 4.32 2.25 moveto + 4.35 2.16 lineto +closepath stroke + 4.32 2.25 moveto + 4.39 2.33 lineto +closepath stroke + 4.32 2.25 moveto + 4.43 2.26 lineto +closepath stroke + 4.37 2.08 moveto + 4.26 1.98 lineto +closepath stroke + 4.37 2.08 moveto + 4.25 2.07 lineto +closepath stroke + 4.37 2.08 moveto + 4.35 2.16 lineto +closepath stroke + 4.37 2.08 moveto + 4.40 1.99 lineto +closepath stroke + 4.37 2.08 moveto + 4.46 2.18 lineto +closepath stroke + 4.37 2.08 moveto + 4.50 2.10 lineto +closepath stroke + 4.43 1.90 moveto + 4.30 1.79 lineto +closepath stroke + 4.43 1.90 moveto + 4.29 1.89 lineto +closepath stroke + 4.43 1.90 moveto + 4.40 1.99 lineto +closepath stroke + 4.43 1.90 moveto + 4.47 1.79 lineto +closepath stroke + 4.43 1.90 moveto + 4.53 2.01 lineto +closepath stroke + 4.43 1.90 moveto + 4.58 1.92 lineto +closepath stroke + 4.50 1.69 moveto + 4.34 1.57 lineto +closepath stroke + 4.50 1.69 moveto + 4.33 1.69 lineto +closepath stroke + 4.50 1.69 moveto + 4.47 1.79 lineto +closepath stroke + 4.50 1.69 moveto + 4.53 1.58 lineto +closepath stroke + 4.50 1.69 moveto + 4.62 1.82 lineto +closepath stroke + 4.50 1.69 moveto + 4.67 1.72 lineto +closepath stroke + 4.57 1.47 moveto + 4.38 1.46 lineto +closepath stroke + 4.57 1.47 moveto + 4.53 1.58 lineto +closepath stroke + 4.57 1.47 moveto + 4.39 1.34 lineto +closepath stroke + 4.57 1.47 moveto + 4.61 1.35 lineto +closepath stroke + 4.57 1.47 moveto + 4.71 1.61 lineto +closepath stroke + 4.57 1.47 moveto + 4.77 1.50 lineto +closepath stroke + 4.65 1.23 moveto + 4.43 1.22 lineto +closepath stroke + 4.65 1.23 moveto + 4.61 1.35 lineto +closepath stroke + 4.65 1.23 moveto + 4.45 1.08 lineto +closepath stroke + 4.65 1.23 moveto + 4.69 1.09 lineto +closepath stroke + 4.65 1.23 moveto + 4.81 1.38 lineto +closepath stroke + 4.65 1.23 moveto + 4.88 1.27 lineto +closepath stroke + 4.74 0.96 moveto + 4.49 0.95 lineto +closepath stroke + 4.74 0.96 moveto + 4.69 1.09 lineto +closepath stroke + 4.74 0.96 moveto + 4.50 0.80 lineto +closepath stroke + 4.74 0.96 moveto + 4.78 0.81 lineto +closepath stroke + 4.74 0.96 moveto + 4.92 1.13 lineto +closepath stroke + 4.74 0.96 moveto + 5.00 1.00 lineto +closepath stroke + 4.83 0.67 moveto + 4.55 0.65 lineto +closepath stroke + 4.83 0.67 moveto + 4.78 0.81 lineto +closepath stroke + 4.83 0.67 moveto + 4.57 0.33 lineto +closepath stroke + 4.83 0.67 moveto + 4.88 0.33 lineto +closepath stroke + 4.83 0.67 moveto + 5.04 0.86 lineto +closepath stroke + 4.83 0.67 moveto + 5.12 0.71 lineto +closepath stroke + 4.83 0.67 moveto + 5.21 0.56 lineto +closepath stroke + 4.94 0.00 moveto + 4.62 0.00 lineto +closepath stroke + 4.94 0.00 moveto + 4.88 0.33 lineto +closepath stroke + 4.94 0.00 moveto + 5.27 0.23 lineto +closepath stroke + 4.94 0.00 moveto + 5.27 0.00 lineto +closepath stroke + 4.25 2.78 moveto + 4.22 2.72 lineto +closepath stroke + 4.25 2.78 moveto + 4.20 2.78 lineto +closepath stroke + 4.25 2.78 moveto + 4.28 2.73 lineto +closepath stroke + 4.25 2.78 moveto + 4.30 2.79 lineto +closepath stroke + 4.31 2.67 moveto + 4.27 2.60 lineto +closepath stroke + 4.31 2.67 moveto + 4.25 2.67 lineto +closepath stroke + 4.31 2.67 moveto + 4.28 2.73 lineto +closepath stroke + 4.31 2.67 moveto + 4.35 2.61 lineto +closepath stroke + 4.31 2.67 moveto + 4.34 2.74 lineto +closepath stroke + 4.31 2.67 moveto + 4.38 2.69 lineto +closepath stroke + 4.38 2.55 moveto + 4.33 2.47 lineto +closepath stroke + 4.38 2.55 moveto + 4.30 2.54 lineto +closepath stroke + 4.38 2.55 moveto + 4.35 2.61 lineto +closepath stroke + 4.38 2.55 moveto + 4.42 2.49 lineto +closepath stroke + 4.38 2.55 moveto + 4.41 2.63 lineto +closepath stroke + 4.38 2.55 moveto + 4.46 2.57 lineto +closepath stroke + 4.46 2.42 moveto + 4.39 2.33 lineto +closepath stroke + 4.46 2.42 moveto + 4.36 2.41 lineto +closepath stroke + 4.46 2.42 moveto + 4.42 2.49 lineto +closepath stroke + 4.46 2.42 moveto + 4.50 2.35 lineto +closepath stroke + 4.46 2.42 moveto + 4.50 2.51 lineto +closepath stroke + 4.46 2.42 moveto + 4.55 2.45 lineto +closepath stroke + 4.54 2.28 moveto + 4.46 2.18 lineto +closepath stroke + 4.54 2.28 moveto + 4.43 2.26 lineto +closepath stroke + 4.54 2.28 moveto + 4.50 2.35 lineto +closepath stroke + 4.54 2.28 moveto + 4.59 2.20 lineto +closepath stroke + 4.54 2.28 moveto + 4.60 2.38 lineto +closepath stroke + 4.54 2.28 moveto + 4.66 2.31 lineto +closepath stroke + 4.64 2.12 moveto + 4.53 2.01 lineto +closepath stroke + 4.64 2.12 moveto + 4.50 2.10 lineto +closepath stroke + 4.64 2.12 moveto + 4.59 2.20 lineto +closepath stroke + 4.64 2.12 moveto + 4.69 2.03 lineto +closepath stroke + 4.64 2.12 moveto + 4.70 2.23 lineto +closepath stroke + 4.64 2.12 moveto + 4.77 2.16 lineto +closepath stroke + 4.74 1.94 moveto + 4.62 1.82 lineto +closepath stroke + 4.74 1.94 moveto + 4.58 1.92 lineto +closepath stroke + 4.74 1.94 moveto + 4.69 2.03 lineto +closepath stroke + 4.74 1.94 moveto + 4.79 1.85 lineto +closepath stroke + 4.74 1.94 moveto + 4.82 2.07 lineto +closepath stroke + 4.74 1.94 moveto + 4.89 1.99 lineto +closepath stroke + 4.85 1.75 moveto + 4.71 1.61 lineto +closepath stroke + 4.85 1.75 moveto + 4.67 1.72 lineto +closepath stroke + 4.85 1.75 moveto + 4.79 1.85 lineto +closepath stroke + 4.85 1.75 moveto + 4.91 1.64 lineto +closepath stroke + 4.85 1.75 moveto + 4.95 1.89 lineto +closepath stroke + 4.85 1.75 moveto + 5.02 1.81 lineto +closepath stroke + 4.97 1.54 moveto + 4.81 1.38 lineto +closepath stroke + 4.97 1.54 moveto + 4.77 1.50 lineto +closepath stroke + 4.97 1.54 moveto + 4.91 1.64 lineto +closepath stroke + 4.97 1.54 moveto + 5.04 1.42 lineto +closepath stroke + 4.97 1.54 moveto + 5.09 1.70 lineto +closepath stroke + 4.97 1.54 moveto + 5.17 1.60 lineto +closepath stroke + 5.11 1.30 moveto + 4.92 1.13 lineto +closepath stroke + 5.11 1.30 moveto + 4.88 1.27 lineto +closepath stroke + 5.11 1.30 moveto + 5.04 1.42 lineto +closepath stroke + 5.11 1.30 moveto + 5.18 1.17 lineto +closepath stroke + 5.11 1.30 moveto + 5.24 1.49 lineto +closepath stroke + 5.11 1.30 moveto + 5.33 1.38 lineto +closepath stroke + 5.25 1.05 moveto + 5.00 1.00 lineto +closepath stroke + 5.25 1.05 moveto + 5.18 1.17 lineto +closepath stroke + 5.25 1.05 moveto + 5.04 0.86 lineto +closepath stroke + 5.25 1.05 moveto + 5.34 0.90 lineto +closepath stroke + 5.25 1.05 moveto + 5.41 1.25 lineto +closepath stroke + 5.42 0.76 moveto + 5.12 0.71 lineto +closepath stroke + 5.42 0.76 moveto + 5.34 0.90 lineto +closepath stroke + 5.42 0.76 moveto + 5.51 0.61 lineto +closepath stroke + 5.42 0.76 moveto + 5.49 1.11 lineto +closepath stroke + 5.42 0.76 moveto + 5.71 1.00 lineto +closepath stroke + 5.60 0.45 moveto + 5.21 0.56 lineto +closepath stroke + 5.60 0.45 moveto + 5.51 0.61 lineto +closepath stroke + 5.60 0.45 moveto + 5.27 0.23 lineto +closepath stroke + 5.60 0.45 moveto + 5.80 0.23 lineto +closepath stroke + 5.60 0.45 moveto + 5.60 0.23 lineto +closepath stroke + 5.60 0.45 moveto + 5.80 0.84 lineto +closepath stroke + 5.60 0.00 moveto + 5.60 0.23 lineto +closepath stroke + 5.60 0.00 moveto + 5.80 0.00 lineto +closepath stroke + 5.60 0.00 moveto + 5.27 0.00 lineto +closepath stroke + 4.36 2.80 moveto + 4.34 2.74 lineto +closepath stroke + 4.36 2.80 moveto + 4.30 2.79 lineto +closepath stroke + 4.36 2.80 moveto + 4.40 2.75 lineto +closepath stroke + 4.36 2.80 moveto + 4.40 2.82 lineto +closepath stroke + 4.44 2.70 moveto + 4.41 2.63 lineto +closepath stroke + 4.44 2.70 moveto + 4.38 2.69 lineto +closepath stroke + 4.44 2.70 moveto + 4.40 2.75 lineto +closepath stroke + 4.44 2.70 moveto + 4.49 2.65 lineto +closepath stroke + 4.44 2.70 moveto + 4.45 2.77 lineto +closepath stroke + 4.44 2.70 moveto + 4.50 2.73 lineto +closepath stroke + 4.54 2.60 moveto + 4.50 2.51 lineto +closepath stroke + 4.54 2.60 moveto + 4.46 2.57 lineto +closepath stroke + 4.54 2.60 moveto + 4.49 2.65 lineto +closepath stroke + 4.54 2.60 moveto + 4.60 2.54 lineto +closepath stroke + 4.54 2.60 moveto + 4.55 2.67 lineto +closepath stroke + 4.54 2.60 moveto + 4.62 2.63 lineto +closepath stroke + 4.65 2.48 moveto + 4.60 2.38 lineto +closepath stroke + 4.65 2.48 moveto + 4.55 2.45 lineto +closepath stroke + 4.65 2.48 moveto + 4.60 2.54 lineto +closepath stroke + 4.65 2.48 moveto + 4.71 2.41 lineto +closepath stroke + 4.65 2.48 moveto + 4.67 2.57 lineto +closepath stroke + 4.65 2.48 moveto + 4.74 2.52 lineto +closepath stroke + 4.77 2.34 moveto + 4.70 2.23 lineto +closepath stroke + 4.77 2.34 moveto + 4.66 2.31 lineto +closepath stroke + 4.77 2.34 moveto + 4.71 2.41 lineto +closepath stroke + 4.77 2.34 moveto + 4.83 2.27 lineto +closepath stroke + 4.77 2.34 moveto + 4.80 2.45 lineto +closepath stroke + 4.77 2.34 moveto + 4.87 2.40 lineto +closepath stroke + 4.90 2.20 moveto + 4.82 2.07 lineto +closepath stroke + 4.90 2.20 moveto + 4.77 2.16 lineto +closepath stroke + 4.90 2.20 moveto + 4.83 2.27 lineto +closepath stroke + 4.90 2.20 moveto + 4.97 2.12 lineto +closepath stroke + 4.90 2.20 moveto + 4.94 2.33 lineto +closepath stroke + 4.90 2.20 moveto + 5.02 2.27 lineto +closepath stroke + 5.04 2.04 moveto + 4.95 1.89 lineto +closepath stroke + 5.04 2.04 moveto + 4.89 1.99 lineto +closepath stroke + 5.04 2.04 moveto + 4.97 2.12 lineto +closepath stroke + 5.04 2.04 moveto + 5.12 1.95 lineto +closepath stroke + 5.04 2.04 moveto + 5.09 2.19 lineto +closepath stroke + 5.04 2.04 moveto + 5.18 2.12 lineto +closepath stroke + 5.20 1.87 moveto + 5.09 1.70 lineto +closepath stroke + 5.20 1.87 moveto + 5.02 1.81 lineto +closepath stroke + 5.20 1.87 moveto + 5.12 1.95 lineto +closepath stroke + 5.20 1.87 moveto + 5.29 1.77 lineto +closepath stroke + 5.20 1.87 moveto + 5.26 2.03 lineto +closepath stroke + 5.20 1.87 moveto + 5.36 1.96 lineto +closepath stroke + 5.37 1.67 moveto + 5.24 1.49 lineto +closepath stroke + 5.37 1.67 moveto + 5.17 1.60 lineto +closepath stroke + 5.37 1.67 moveto + 5.29 1.77 lineto +closepath stroke + 5.37 1.67 moveto + 5.47 1.57 lineto +closepath stroke + 5.37 1.67 moveto + 5.45 1.86 lineto +closepath stroke + 5.37 1.67 moveto + 5.56 1.78 lineto +closepath stroke + 5.56 1.46 moveto + 5.49 1.11 lineto +closepath stroke + 5.56 1.46 moveto + 5.41 1.25 lineto +closepath stroke + 5.56 1.46 moveto + 5.33 1.38 lineto +closepath stroke + 5.56 1.46 moveto + 5.47 1.57 lineto +closepath stroke + 5.56 1.46 moveto + 5.78 1.34 lineto +closepath stroke + 5.56 1.46 moveto + 5.65 1.68 lineto +closepath stroke + 5.56 1.46 moveto + 5.78 1.68 lineto +closepath stroke + 6.00 1.23 moveto + 6.00 0.61 lineto +closepath stroke + 6.00 1.23 moveto + 5.80 0.84 lineto +closepath stroke + 6.00 1.23 moveto + 5.71 1.00 lineto +closepath stroke + 6.00 1.23 moveto + 5.78 1.34 lineto +closepath stroke + 6.00 1.23 moveto + 6.00 1.56 lineto +closepath stroke + 4.45 2.84 moveto + 4.45 2.77 lineto +closepath stroke + 4.45 2.84 moveto + 4.40 2.82 lineto +closepath stroke + 4.45 2.84 moveto + 4.51 2.79 lineto +closepath stroke + 4.45 2.84 moveto + 4.49 2.86 lineto +closepath stroke + 4.57 2.75 moveto + 4.55 2.67 lineto +closepath stroke + 4.57 2.75 moveto + 4.50 2.73 lineto +closepath stroke + 4.57 2.75 moveto + 4.51 2.79 lineto +closepath stroke + 4.57 2.75 moveto + 4.63 2.71 lineto +closepath stroke + 4.57 2.75 moveto + 4.55 2.82 lineto +closepath stroke + 4.57 2.75 moveto + 4.61 2.79 lineto +closepath stroke + 4.69 2.66 moveto + 4.67 2.57 lineto +closepath stroke + 4.69 2.66 moveto + 4.62 2.63 lineto +closepath stroke + 4.69 2.66 moveto + 4.63 2.71 lineto +closepath stroke + 4.69 2.66 moveto + 4.76 2.61 lineto +closepath stroke + 4.69 2.66 moveto + 4.68 2.74 lineto +closepath stroke + 4.69 2.66 moveto + 4.75 2.71 lineto +closepath stroke + 4.83 2.56 moveto + 4.80 2.45 lineto +closepath stroke + 4.83 2.56 moveto + 4.74 2.52 lineto +closepath stroke + 4.83 2.56 moveto + 4.76 2.61 lineto +closepath stroke + 4.83 2.56 moveto + 4.90 2.51 lineto +closepath stroke + 4.83 2.56 moveto + 4.82 2.66 lineto +closepath stroke + 4.83 2.56 moveto + 4.90 2.63 lineto +closepath stroke + 4.98 2.45 moveto + 4.94 2.33 lineto +closepath stroke + 4.98 2.45 moveto + 4.87 2.40 lineto +closepath stroke + 4.98 2.45 moveto + 4.90 2.51 lineto +closepath stroke + 4.98 2.45 moveto + 5.06 2.39 lineto +closepath stroke + 4.98 2.45 moveto + 4.97 2.57 lineto +closepath stroke + 4.98 2.45 moveto + 5.06 2.53 lineto +closepath stroke + 5.14 2.33 moveto + 5.09 2.19 lineto +closepath stroke + 5.14 2.33 moveto + 5.02 2.27 lineto +closepath stroke + 5.14 2.33 moveto + 5.06 2.39 lineto +closepath stroke + 5.14 2.33 moveto + 5.23 2.27 lineto +closepath stroke + 5.14 2.33 moveto + 5.14 2.47 lineto +closepath stroke + 5.14 2.33 moveto + 5.24 2.43 lineto +closepath stroke + 5.32 2.20 moveto + 5.26 2.03 lineto +closepath stroke + 5.32 2.20 moveto + 5.18 2.12 lineto +closepath stroke + 5.32 2.20 moveto + 5.23 2.27 lineto +closepath stroke + 5.32 2.20 moveto + 5.42 2.13 lineto +closepath stroke + 5.32 2.20 moveto + 5.33 2.36 lineto +closepath stroke + 5.32 2.20 moveto + 5.44 2.31 lineto +closepath stroke + 5.52 2.06 moveto + 5.45 1.86 lineto +closepath stroke + 5.52 2.06 moveto + 5.36 1.96 lineto +closepath stroke + 5.52 2.06 moveto + 5.42 2.13 lineto +closepath stroke + 5.52 2.06 moveto + 5.63 1.98 lineto +closepath stroke + 5.52 2.06 moveto + 5.54 2.24 lineto +closepath stroke + 5.52 2.06 moveto + 5.76 2.19 lineto +closepath stroke + 5.74 1.90 moveto + 5.65 1.68 lineto +closepath stroke + 5.74 1.90 moveto + 5.56 1.78 lineto +closepath stroke + 5.74 1.90 moveto + 5.63 1.98 lineto +closepath stroke + 5.74 1.90 moveto + 5.87 1.90 lineto +closepath stroke + 5.74 1.90 moveto + 5.87 2.11 lineto +closepath stroke + 6.00 1.90 moveto + 6.00 1.56 lineto +closepath stroke + 6.00 1.90 moveto + 5.78 1.68 lineto +closepath stroke + 6.00 1.90 moveto + 5.87 1.90 lineto +closepath stroke + 6.00 1.90 moveto + 6.00 2.11 lineto +closepath stroke + 4.53 2.88 moveto + 4.55 2.82 lineto +closepath stroke + 4.53 2.88 moveto + 4.49 2.86 lineto +closepath stroke + 4.53 2.88 moveto + 4.60 2.85 lineto +closepath stroke + 4.53 2.88 moveto + 4.56 2.91 lineto +closepath stroke + 4.66 2.82 moveto + 4.62 2.88 lineto +closepath stroke + 4.66 2.82 moveto + 4.70 2.87 lineto +closepath stroke + 4.66 2.82 moveto + 4.68 2.74 lineto +closepath stroke + 4.66 2.82 moveto + 4.61 2.79 lineto +closepath stroke + 4.66 2.82 moveto + 4.60 2.85 lineto +closepath stroke + 4.66 2.82 moveto + 4.74 2.79 lineto +closepath stroke + 4.81 2.76 moveto + 4.77 2.83 lineto +closepath stroke + 4.81 2.76 moveto + 4.85 2.82 lineto +closepath stroke + 4.81 2.76 moveto + 4.89 2.72 lineto +closepath stroke + 4.81 2.76 moveto + 4.82 2.66 lineto +closepath stroke + 4.81 2.76 moveto + 4.75 2.71 lineto +closepath stroke + 4.81 2.76 moveto + 4.74 2.79 lineto +closepath stroke + 4.97 2.69 moveto + 4.93 2.78 lineto +closepath stroke + 4.97 2.69 moveto + 5.02 2.76 lineto +closepath stroke + 4.97 2.69 moveto + 5.06 2.65 lineto +closepath stroke + 4.97 2.69 moveto + 4.89 2.72 lineto +closepath stroke + 4.97 2.69 moveto + 4.97 2.57 lineto +closepath stroke + 4.97 2.69 moveto + 4.90 2.63 lineto +closepath stroke + 5.15 2.61 moveto + 5.10 2.72 lineto +closepath stroke + 5.15 2.61 moveto + 5.20 2.70 lineto +closepath stroke + 5.15 2.61 moveto + 5.24 2.56 lineto +closepath stroke + 5.15 2.61 moveto + 5.06 2.65 lineto +closepath stroke + 5.15 2.61 moveto + 5.14 2.47 lineto +closepath stroke + 5.15 2.61 moveto + 5.06 2.53 lineto +closepath stroke + 5.34 2.52 moveto + 5.30 2.66 lineto +closepath stroke + 5.34 2.52 moveto + 5.41 2.64 lineto +closepath stroke + 5.34 2.52 moveto + 5.45 2.47 lineto +closepath stroke + 5.34 2.52 moveto + 5.24 2.56 lineto +closepath stroke + 5.34 2.52 moveto + 5.33 2.36 lineto +closepath stroke + 5.34 2.52 moveto + 5.24 2.43 lineto +closepath stroke + 5.55 2.43 moveto + 5.51 2.59 lineto +closepath stroke + 5.55 2.43 moveto + 5.63 2.56 lineto +closepath stroke + 5.55 2.43 moveto + 5.78 2.37 lineto +closepath stroke + 5.55 2.43 moveto + 5.45 2.47 lineto +closepath stroke + 5.55 2.43 moveto + 5.54 2.24 lineto +closepath stroke + 5.55 2.43 moveto + 5.44 2.31 lineto +closepath stroke + 6.00 2.32 moveto + 5.85 2.51 lineto +closepath stroke + 6.00 2.32 moveto + 6.00 2.51 lineto +closepath stroke + 6.00 2.32 moveto + 5.78 2.37 lineto +closepath stroke + 6.00 2.32 moveto + 6.00 2.11 lineto +closepath stroke + 6.00 2.32 moveto + 5.87 2.11 lineto +closepath stroke + 6.00 2.32 moveto + 5.76 2.19 lineto +closepath stroke + 4.58 2.94 moveto + 4.59 2.97 lineto +closepath stroke + 4.58 2.94 moveto + 4.65 2.92 lineto +closepath stroke + 4.58 2.94 moveto + 4.62 2.88 lineto +closepath stroke + 4.58 2.94 moveto + 4.56 2.91 lineto +closepath stroke + 4.73 2.91 moveto + 4.74 2.95 lineto +closepath stroke + 4.73 2.91 moveto + 4.81 2.89 lineto +closepath stroke + 4.73 2.91 moveto + 4.77 2.83 lineto +closepath stroke + 4.73 2.91 moveto + 4.66 2.95 lineto +closepath stroke + 4.73 2.91 moveto + 4.65 2.92 lineto +closepath stroke + 4.73 2.91 moveto + 4.70 2.87 lineto +closepath stroke + 4.89 2.87 moveto + 4.90 2.94 lineto +closepath stroke + 4.89 2.87 moveto + 4.98 2.85 lineto +closepath stroke + 4.89 2.87 moveto + 4.93 2.78 lineto +closepath stroke + 4.89 2.87 moveto + 4.82 2.94 lineto +closepath stroke + 4.89 2.87 moveto + 4.81 2.89 lineto +closepath stroke + 4.89 2.87 moveto + 4.85 2.82 lineto +closepath stroke + 5.06 2.84 moveto + 5.08 2.92 lineto +closepath stroke + 5.06 2.84 moveto + 5.16 2.82 lineto +closepath stroke + 5.06 2.84 moveto + 5.10 2.72 lineto +closepath stroke + 5.06 2.84 moveto + 4.99 2.92 lineto +closepath stroke + 5.06 2.84 moveto + 4.98 2.85 lineto +closepath stroke + 5.06 2.84 moveto + 5.02 2.76 lineto +closepath stroke + 5.26 2.79 moveto + 5.28 2.90 lineto +closepath stroke + 5.26 2.79 moveto + 5.36 2.77 lineto +closepath stroke + 5.26 2.79 moveto + 5.30 2.66 lineto +closepath stroke + 5.26 2.79 moveto + 5.18 2.90 lineto +closepath stroke + 5.26 2.79 moveto + 5.16 2.82 lineto +closepath stroke + 5.26 2.79 moveto + 5.20 2.70 lineto +closepath stroke + 5.47 2.75 moveto + 5.49 2.87 lineto +closepath stroke + 5.47 2.75 moveto + 5.59 2.72 lineto +closepath stroke + 5.47 2.75 moveto + 5.51 2.59 lineto +closepath stroke + 5.47 2.75 moveto + 5.38 2.87 lineto +closepath stroke + 5.47 2.75 moveto + 5.36 2.77 lineto +closepath stroke + 5.47 2.75 moveto + 5.41 2.64 lineto +closepath stroke + 5.70 2.70 moveto + 5.85 2.85 lineto +closepath stroke + 5.70 2.70 moveto + 5.85 2.70 lineto +closepath stroke + 5.70 2.70 moveto + 5.85 2.51 lineto +closepath stroke + 5.70 2.70 moveto + 5.61 2.85 lineto +closepath stroke + 5.70 2.70 moveto + 5.59 2.72 lineto +closepath stroke + 5.70 2.70 moveto + 5.63 2.56 lineto +closepath stroke + 6.00 2.70 moveto + 5.85 2.70 lineto +closepath stroke + 6.00 2.70 moveto + 6.00 2.85 lineto +closepath stroke + 6.00 2.70 moveto + 6.00 2.51 lineto +closepath stroke + 4.66 3.05 moveto + 4.74 3.05 lineto +closepath stroke + 4.66 3.05 moveto + 4.68 3.00 lineto +closepath stroke + 4.66 3.05 moveto + 4.59 3.03 lineto +closepath stroke + 4.66 3.05 moveto + 4.65 3.08 lineto +closepath stroke + 4.74 3.05 moveto + 4.68 3.00 lineto +closepath stroke + 4.74 3.05 moveto + 4.81 3.11 lineto +closepath stroke + 4.74 3.05 moveto + 4.82 3.06 lineto +closepath stroke + 4.68 3.00 moveto + 4.74 2.95 lineto +closepath stroke + 4.68 3.00 moveto + 4.66 2.95 lineto +closepath stroke + 4.59 3.03 moveto + 4.65 3.08 lineto +closepath stroke + 4.65 3.08 moveto + 4.62 3.12 lineto +closepath stroke + 4.65 3.08 moveto + 4.70 3.13 lineto +closepath stroke + 4.82 3.06 moveto + 4.90 3.06 lineto +closepath stroke + 4.82 3.06 moveto + 4.83 3.00 lineto +closepath stroke + 4.82 3.06 moveto + 4.81 3.11 lineto +closepath stroke + 4.90 3.06 moveto + 4.83 3.00 lineto +closepath stroke + 4.90 3.06 moveto + 4.98 3.15 lineto +closepath stroke + 4.90 3.06 moveto + 4.99 3.08 lineto +closepath stroke + 4.83 3.00 moveto + 4.90 2.94 lineto +closepath stroke + 4.83 3.00 moveto + 4.82 2.94 lineto +closepath stroke + 4.81 3.11 moveto + 4.77 3.17 lineto +closepath stroke + 4.81 3.11 moveto + 4.85 3.18 lineto +closepath stroke + 4.99 3.08 moveto + 5.08 3.08 lineto +closepath stroke + 4.99 3.08 moveto + 5.01 3.00 lineto +closepath stroke + 4.99 3.08 moveto + 4.98 3.15 lineto +closepath stroke + 5.08 3.08 moveto + 5.01 3.00 lineto +closepath stroke + 5.08 3.08 moveto + 5.16 3.18 lineto +closepath stroke + 5.08 3.08 moveto + 5.18 3.10 lineto +closepath stroke + 5.01 3.00 moveto + 5.08 2.92 lineto +closepath stroke + 5.01 3.00 moveto + 4.99 2.92 lineto +closepath stroke + 4.98 3.15 moveto + 4.93 3.22 lineto +closepath stroke + 4.98 3.15 moveto + 5.02 3.24 lineto +closepath stroke + 5.18 3.10 moveto + 5.28 3.10 lineto +closepath stroke + 5.18 3.10 moveto + 5.20 3.00 lineto +closepath stroke + 5.18 3.10 moveto + 5.16 3.18 lineto +closepath stroke + 5.28 3.10 moveto + 5.20 3.00 lineto +closepath stroke + 5.28 3.10 moveto + 5.36 3.23 lineto +closepath stroke + 5.28 3.10 moveto + 5.38 3.13 lineto +closepath stroke + 5.20 3.00 moveto + 5.28 2.90 lineto +closepath stroke + 5.20 3.00 moveto + 5.18 2.90 lineto +closepath stroke + 5.16 3.18 moveto + 5.10 3.28 lineto +closepath stroke + 5.16 3.18 moveto + 5.20 3.30 lineto +closepath stroke + 5.38 3.13 moveto + 5.49 3.13 lineto +closepath stroke + 5.38 3.13 moveto + 5.41 3.00 lineto +closepath stroke + 5.38 3.13 moveto + 5.36 3.23 lineto +closepath stroke + 5.49 3.13 moveto + 5.41 3.00 lineto +closepath stroke + 5.49 3.13 moveto + 5.59 3.28 lineto +closepath stroke + 5.49 3.13 moveto + 5.61 3.15 lineto +closepath stroke + 5.41 3.00 moveto + 5.49 2.87 lineto +closepath stroke + 5.41 3.00 moveto + 5.38 2.87 lineto +closepath stroke + 5.36 3.23 moveto + 5.30 3.34 lineto +closepath stroke + 5.36 3.23 moveto + 5.41 3.36 lineto +closepath stroke + 5.61 3.15 moveto + 5.85 3.15 lineto +closepath stroke + 5.61 3.15 moveto + 5.76 3.00 lineto +closepath stroke + 5.61 3.15 moveto + 5.59 3.28 lineto +closepath stroke + 5.85 3.15 moveto + 5.76 3.00 lineto +closepath stroke + 5.85 3.15 moveto + 5.85 3.30 lineto +closepath stroke + 5.85 3.15 moveto + 6.00 3.15 lineto +closepath stroke + 5.76 3.00 moveto + 5.85 2.85 lineto +closepath stroke + 5.76 3.00 moveto + 5.61 2.85 lineto +closepath stroke + 5.59 3.28 moveto + 5.51 3.41 lineto +closepath stroke + 5.59 3.28 moveto + 5.63 3.44 lineto +closepath stroke + 5.85 3.30 moveto + 6.00 3.15 lineto +closepath stroke + 5.85 3.30 moveto + 5.85 3.49 lineto +closepath stroke + 5.85 3.30 moveto + 6.00 3.49 lineto +closepath stroke + 4.62 3.12 moveto + 4.70 3.13 lineto +closepath stroke + 4.62 3.12 moveto + 4.56 3.09 lineto +closepath stroke + 4.62 3.12 moveto + 4.60 3.15 lineto +closepath stroke + 4.70 3.13 moveto + 4.74 3.21 lineto +closepath stroke + 4.70 3.13 moveto + 4.77 3.17 lineto +closepath stroke + 4.56 3.09 moveto + 4.60 3.15 lineto +closepath stroke + 4.60 3.15 moveto + 4.55 3.18 lineto +closepath stroke + 4.60 3.15 moveto + 4.61 3.21 lineto +closepath stroke + 4.77 3.17 moveto + 4.85 3.18 lineto +closepath stroke + 4.77 3.17 moveto + 4.74 3.21 lineto +closepath stroke + 4.85 3.18 moveto + 4.89 3.28 lineto +closepath stroke + 4.85 3.18 moveto + 4.93 3.22 lineto +closepath stroke + 4.74 3.21 moveto + 4.68 3.26 lineto +closepath stroke + 4.74 3.21 moveto + 4.75 3.29 lineto +closepath stroke + 4.93 3.22 moveto + 5.02 3.24 lineto +closepath stroke + 4.93 3.22 moveto + 4.89 3.28 lineto +closepath stroke + 5.02 3.24 moveto + 5.06 3.35 lineto +closepath stroke + 5.02 3.24 moveto + 5.10 3.28 lineto +closepath stroke + 4.89 3.28 moveto + 4.82 3.34 lineto +closepath stroke + 4.89 3.28 moveto + 4.90 3.37 lineto +closepath stroke + 5.10 3.28 moveto + 5.20 3.30 lineto +closepath stroke + 5.10 3.28 moveto + 5.06 3.35 lineto +closepath stroke + 5.20 3.30 moveto + 5.24 3.44 lineto +closepath stroke + 5.20 3.30 moveto + 5.30 3.34 lineto +closepath stroke + 5.06 3.35 moveto + 4.97 3.43 lineto +closepath stroke + 5.06 3.35 moveto + 5.06 3.47 lineto +closepath stroke + 5.30 3.34 moveto + 5.41 3.36 lineto +closepath stroke + 5.30 3.34 moveto + 5.24 3.44 lineto +closepath stroke + 5.41 3.36 moveto + 5.45 3.53 lineto +closepath stroke + 5.41 3.36 moveto + 5.51 3.41 lineto +closepath stroke + 5.24 3.44 moveto + 5.14 3.53 lineto +closepath stroke + 5.24 3.44 moveto + 5.24 3.57 lineto +closepath stroke + 5.51 3.41 moveto + 5.63 3.44 lineto +closepath stroke + 5.51 3.41 moveto + 5.45 3.53 lineto +closepath stroke + 5.63 3.44 moveto + 5.78 3.63 lineto +closepath stroke + 5.63 3.44 moveto + 5.85 3.49 lineto +closepath stroke + 5.45 3.53 moveto + 5.33 3.64 lineto +closepath stroke + 5.45 3.53 moveto + 5.44 3.69 lineto +closepath stroke + 5.85 3.49 moveto + 6.00 3.49 lineto +closepath stroke + 5.85 3.49 moveto + 5.78 3.63 lineto +closepath stroke + 5.78 3.63 moveto + 5.54 3.76 lineto +closepath stroke + 5.78 3.63 moveto + 5.76 3.81 lineto +closepath stroke + 4.55 3.18 moveto + 4.61 3.21 lineto +closepath stroke + 4.55 3.18 moveto + 4.49 3.14 lineto +closepath stroke + 4.55 3.18 moveto + 4.51 3.21 lineto +closepath stroke + 4.61 3.21 moveto + 4.63 3.29 lineto +closepath stroke + 4.61 3.21 moveto + 4.68 3.26 lineto +closepath stroke + 4.49 3.14 moveto + 4.51 3.21 lineto +closepath stroke + 4.51 3.21 moveto + 4.50 3.27 lineto +closepath stroke + 4.51 3.21 moveto + 4.45 3.23 lineto +closepath stroke + 4.68 3.26 moveto + 4.75 3.29 lineto +closepath stroke + 4.68 3.26 moveto + 4.63 3.29 lineto +closepath stroke + 4.75 3.29 moveto + 4.76 3.39 lineto +closepath stroke + 4.75 3.29 moveto + 4.82 3.34 lineto +closepath stroke + 4.63 3.29 moveto + 4.62 3.37 lineto +closepath stroke + 4.63 3.29 moveto + 4.55 3.33 lineto +closepath stroke + 4.82 3.34 moveto + 4.90 3.37 lineto +closepath stroke + 4.82 3.34 moveto + 4.76 3.39 lineto +closepath stroke + 4.90 3.37 moveto + 4.90 3.49 lineto +closepath stroke + 4.90 3.37 moveto + 4.97 3.43 lineto +closepath stroke + 4.76 3.39 moveto + 4.74 3.48 lineto +closepath stroke + 4.76 3.39 moveto + 4.67 3.43 lineto +closepath stroke + 4.97 3.43 moveto + 5.06 3.47 lineto +closepath stroke + 4.97 3.43 moveto + 4.90 3.49 lineto +closepath stroke + 5.06 3.47 moveto + 5.06 3.61 lineto +closepath stroke + 5.06 3.47 moveto + 5.14 3.53 lineto +closepath stroke + 4.90 3.49 moveto + 4.80 3.55 lineto +closepath stroke + 4.90 3.49 moveto + 4.87 3.60 lineto +closepath stroke + 5.14 3.53 moveto + 5.24 3.57 lineto +closepath stroke + 5.14 3.53 moveto + 5.06 3.61 lineto +closepath stroke + 5.24 3.57 moveto + 5.23 3.73 lineto +closepath stroke + 5.24 3.57 moveto + 5.33 3.64 lineto +closepath stroke + 5.06 3.61 moveto + 4.94 3.67 lineto +closepath stroke + 5.06 3.61 moveto + 5.02 3.73 lineto +closepath stroke + 5.33 3.64 moveto + 5.44 3.69 lineto +closepath stroke + 5.33 3.64 moveto + 5.23 3.73 lineto +closepath stroke + 5.44 3.69 moveto + 5.42 3.87 lineto +closepath stroke + 5.44 3.69 moveto + 5.54 3.76 lineto +closepath stroke + 5.23 3.73 moveto + 5.09 3.81 lineto +closepath stroke + 5.23 3.73 moveto + 5.18 3.88 lineto +closepath stroke + 5.54 3.76 moveto + 5.76 3.81 lineto +closepath stroke + 5.54 3.76 moveto + 5.42 3.87 lineto +closepath stroke + 5.76 3.81 moveto + 5.63 4.02 lineto +closepath stroke + 5.76 3.81 moveto + 5.87 3.89 lineto +closepath stroke + 5.42 3.87 moveto + 5.26 3.97 lineto +closepath stroke + 5.42 3.87 moveto + 5.36 4.04 lineto +closepath stroke + 5.63 4.02 moveto + 5.87 3.89 lineto +closepath stroke + 5.63 4.02 moveto + 5.45 4.14 lineto +closepath stroke + 5.63 4.02 moveto + 5.56 4.22 lineto +closepath stroke + 5.87 3.89 moveto + 5.87 4.10 lineto +closepath stroke + 5.87 3.89 moveto + 6.00 3.89 lineto +closepath stroke + 5.87 4.10 moveto + 6.00 3.89 lineto +closepath stroke + 5.87 4.10 moveto + 5.65 4.32 lineto +closepath stroke + 5.87 4.10 moveto + 5.78 4.32 lineto +closepath stroke + 4.50 3.27 moveto + 4.45 3.23 lineto +closepath stroke + 4.50 3.27 moveto + 4.49 3.35 lineto +closepath stroke + 4.50 3.27 moveto + 4.55 3.33 lineto +closepath stroke + 4.45 3.23 moveto + 4.40 3.25 lineto +closepath stroke + 4.45 3.23 moveto + 4.40 3.18 lineto +closepath stroke + 4.40 3.25 moveto + 4.40 3.18 lineto +closepath stroke + 4.40 3.25 moveto + 4.38 3.31 lineto +closepath stroke + 4.40 3.25 moveto + 4.34 3.26 lineto +closepath stroke + 4.62 3.37 moveto + 4.55 3.33 lineto +closepath stroke + 4.62 3.37 moveto + 4.60 3.46 lineto +closepath stroke + 4.62 3.37 moveto + 4.67 3.43 lineto +closepath stroke + 4.55 3.33 moveto + 4.49 3.35 lineto +closepath stroke + 4.49 3.35 moveto + 4.46 3.43 lineto +closepath stroke + 4.49 3.35 moveto + 4.41 3.37 lineto +closepath stroke + 4.74 3.48 moveto + 4.67 3.43 lineto +closepath stroke + 4.74 3.48 moveto + 4.71 3.59 lineto +closepath stroke + 4.74 3.48 moveto + 4.80 3.55 lineto +closepath stroke + 4.67 3.43 moveto + 4.60 3.46 lineto +closepath stroke + 4.60 3.46 moveto + 4.55 3.55 lineto +closepath stroke + 4.60 3.46 moveto + 4.50 3.49 lineto +closepath stroke + 4.80 3.55 moveto + 4.87 3.60 lineto +closepath stroke + 4.80 3.55 moveto + 4.71 3.59 lineto +closepath stroke + 4.87 3.60 moveto + 4.83 3.73 lineto +closepath stroke + 4.87 3.60 moveto + 4.94 3.67 lineto +closepath stroke + 4.71 3.59 moveto + 4.66 3.69 lineto +closepath stroke + 4.71 3.59 moveto + 4.60 3.62 lineto +closepath stroke + 4.94 3.67 moveto + 5.02 3.73 lineto +closepath stroke + 4.94 3.67 moveto + 4.83 3.73 lineto +closepath stroke + 5.02 3.73 moveto + 4.97 3.88 lineto +closepath stroke + 5.02 3.73 moveto + 5.09 3.81 lineto +closepath stroke + 4.83 3.73 moveto + 4.77 3.84 lineto +closepath stroke + 4.83 3.73 moveto + 4.70 3.77 lineto +closepath stroke + 5.09 3.81 moveto + 5.18 3.88 lineto +closepath stroke + 5.09 3.81 moveto + 4.97 3.88 lineto +closepath stroke + 5.18 3.88 moveto + 5.12 4.05 lineto +closepath stroke + 5.18 3.88 moveto + 5.26 3.97 lineto +closepath stroke + 4.97 3.88 moveto + 4.89 4.01 lineto +closepath stroke + 4.97 3.88 moveto + 4.82 3.93 lineto +closepath stroke + 5.26 3.97 moveto + 5.36 4.04 lineto +closepath stroke + 5.26 3.97 moveto + 5.12 4.05 lineto +closepath stroke + 5.36 4.04 moveto + 5.29 4.23 lineto +closepath stroke + 5.36 4.04 moveto + 5.45 4.14 lineto +closepath stroke + 5.12 4.05 moveto + 5.02 4.19 lineto +closepath stroke + 5.12 4.05 moveto + 4.95 4.11 lineto +closepath stroke + 5.45 4.14 moveto + 5.56 4.22 lineto +closepath stroke + 5.45 4.14 moveto + 5.29 4.23 lineto +closepath stroke + 5.56 4.22 moveto + 5.47 4.43 lineto +closepath stroke + 5.56 4.22 moveto + 5.65 4.32 lineto +closepath stroke + 5.29 4.23 moveto + 5.09 4.30 lineto +closepath stroke + 5.29 4.23 moveto + 5.17 4.40 lineto +closepath stroke + 5.65 4.32 moveto + 5.78 4.32 lineto +closepath stroke + 5.65 4.32 moveto + 5.47 4.43 lineto +closepath stroke + 5.78 4.32 moveto + 5.78 4.66 lineto +closepath stroke + 5.78 4.32 moveto + 6.00 4.44 lineto +closepath stroke + 5.47 4.43 moveto + 5.24 4.51 lineto +closepath stroke + 5.47 4.43 moveto + 5.33 4.62 lineto +closepath stroke + 5.78 4.66 moveto + 6.00 4.44 lineto +closepath stroke + 5.78 4.66 moveto + 5.49 4.89 lineto +closepath stroke + 5.78 4.66 moveto + 5.71 5.00 lineto +closepath stroke + 4.38 3.31 moveto + 4.34 3.26 lineto +closepath stroke + 4.38 3.31 moveto + 4.35 3.39 lineto +closepath stroke + 4.38 3.31 moveto + 4.41 3.37 lineto +closepath stroke + 4.34 3.26 moveto + 4.28 3.27 lineto +closepath stroke + 4.34 3.26 moveto + 4.30 3.21 lineto +closepath stroke + 4.28 3.27 moveto + 4.30 3.21 lineto +closepath stroke + 4.28 3.27 moveto + 4.25 3.33 lineto +closepath stroke + 4.28 3.27 moveto + 4.22 3.28 lineto +closepath stroke + 4.46 3.43 moveto + 4.41 3.37 lineto +closepath stroke + 4.46 3.43 moveto + 4.42 3.51 lineto +closepath stroke + 4.46 3.43 moveto + 4.50 3.49 lineto +closepath stroke + 4.41 3.37 moveto + 4.35 3.39 lineto +closepath stroke + 4.35 3.39 moveto + 4.30 3.46 lineto +closepath stroke + 4.35 3.39 moveto + 4.27 3.40 lineto +closepath stroke + 4.55 3.55 moveto + 4.50 3.49 lineto +closepath stroke + 4.55 3.55 moveto + 4.50 3.65 lineto +closepath stroke + 4.55 3.55 moveto + 4.60 3.62 lineto +closepath stroke + 4.50 3.49 moveto + 4.42 3.51 lineto +closepath stroke + 4.42 3.51 moveto + 4.36 3.59 lineto +closepath stroke + 4.42 3.51 moveto + 4.33 3.53 lineto +closepath stroke + 4.66 3.69 moveto + 4.60 3.62 lineto +closepath stroke + 4.66 3.69 moveto + 4.59 3.80 lineto +closepath stroke + 4.66 3.69 moveto + 4.70 3.77 lineto +closepath stroke + 4.60 3.62 moveto + 4.50 3.65 lineto +closepath stroke + 4.50 3.65 moveto + 4.43 3.74 lineto +closepath stroke + 4.50 3.65 moveto + 4.39 3.67 lineto +closepath stroke + 4.77 3.84 moveto + 4.70 3.77 lineto +closepath stroke + 4.77 3.84 moveto + 4.69 3.97 lineto +closepath stroke + 4.77 3.84 moveto + 4.82 3.93 lineto +closepath stroke + 4.70 3.77 moveto + 4.59 3.80 lineto +closepath stroke + 4.59 3.80 moveto + 4.50 3.90 lineto +closepath stroke + 4.59 3.80 moveto + 4.46 3.82 lineto +closepath stroke + 4.89 4.01 moveto + 4.82 3.93 lineto +closepath stroke + 4.89 4.01 moveto + 4.79 4.15 lineto +closepath stroke + 4.89 4.01 moveto + 4.95 4.11 lineto +closepath stroke + 4.82 3.93 moveto + 4.69 3.97 lineto +closepath stroke + 4.69 3.97 moveto + 4.58 4.08 lineto +closepath stroke + 4.69 3.97 moveto + 4.53 3.99 lineto +closepath stroke + 5.02 4.19 moveto + 4.95 4.11 lineto +closepath stroke + 5.02 4.19 moveto + 4.91 4.36 lineto +closepath stroke + 5.02 4.19 moveto + 5.09 4.30 lineto +closepath stroke + 4.95 4.11 moveto + 4.79 4.15 lineto +closepath stroke + 4.79 4.15 moveto + 4.67 4.28 lineto +closepath stroke + 4.79 4.15 moveto + 4.62 4.18 lineto +closepath stroke + 5.09 4.30 moveto + 5.17 4.40 lineto +closepath stroke + 5.09 4.30 moveto + 4.91 4.36 lineto +closepath stroke + 5.17 4.40 moveto + 5.04 4.58 lineto +closepath stroke + 5.17 4.40 moveto + 5.24 4.51 lineto +closepath stroke + 4.91 4.36 moveto + 4.77 4.50 lineto +closepath stroke + 4.91 4.36 moveto + 4.71 4.39 lineto +closepath stroke + 5.24 4.51 moveto + 5.33 4.62 lineto +closepath stroke + 5.24 4.51 moveto + 5.04 4.58 lineto +closepath stroke + 5.33 4.62 moveto + 5.18 4.83 lineto +closepath stroke + 5.33 4.62 moveto + 5.41 4.75 lineto +closepath stroke + 5.04 4.58 moveto + 4.88 4.73 lineto +closepath stroke + 5.04 4.58 moveto + 4.81 4.62 lineto +closepath stroke + 5.18 4.83 moveto + 5.41 4.75 lineto +closepath stroke + 5.18 4.83 moveto + 5.00 5.00 lineto +closepath stroke + 5.18 4.83 moveto + 4.92 4.87 lineto +closepath stroke + 5.41 4.75 moveto + 5.34 5.10 lineto +closepath stroke + 5.41 4.75 moveto + 5.49 4.89 lineto +closepath stroke + 5.49 4.89 moveto + 5.71 5.00 lineto +closepath stroke + 5.49 4.89 moveto + 5.34 5.10 lineto +closepath stroke + 5.71 5.00 moveto + 5.51 5.39 lineto +closepath stroke + 5.71 5.00 moveto + 5.80 5.16 lineto +closepath stroke + 5.34 5.10 moveto + 5.12 5.29 lineto +closepath stroke + 5.34 5.10 moveto + 5.04 5.14 lineto +closepath stroke + 5.80 5.77 moveto + 6.00 5.39 lineto +closepath stroke + 5.80 5.77 moveto + 5.80 5.16 lineto +closepath stroke + 5.80 5.77 moveto + 5.80 6.00 lineto +closepath stroke + 5.80 5.77 moveto + 5.60 5.77 lineto +closepath stroke + 6.00 5.39 moveto + 5.80 5.16 lineto +closepath stroke + 5.80 5.16 moveto + 5.51 5.39 lineto +closepath stroke + 5.51 5.39 moveto + 5.21 5.44 lineto +closepath stroke + 5.51 5.39 moveto + 5.12 5.29 lineto +closepath stroke + 5.80 6.00 moveto + 5.60 5.77 lineto +closepath stroke + 5.60 5.77 moveto + 5.27 5.77 lineto +closepath stroke + 5.60 5.77 moveto + 5.27 6.00 lineto +closepath stroke + 4.25 3.33 moveto + 4.22 3.28 lineto +closepath stroke + 4.25 3.33 moveto + 4.21 3.40 lineto +closepath stroke + 4.25 3.33 moveto + 4.27 3.40 lineto +closepath stroke + 4.22 3.28 moveto + 4.17 3.28 lineto +closepath stroke + 4.22 3.28 moveto + 4.20 3.22 lineto +closepath stroke + 4.17 3.28 moveto + 4.20 3.22 lineto +closepath stroke + 4.17 3.28 moveto + 4.12 3.34 lineto +closepath stroke + 4.17 3.28 moveto + 4.10 3.29 lineto +closepath stroke + 4.30 3.46 moveto + 4.27 3.40 lineto +closepath stroke + 4.30 3.46 moveto + 4.25 3.53 lineto +closepath stroke + 4.30 3.46 moveto + 4.33 3.53 lineto +closepath stroke + 4.27 3.40 moveto + 4.21 3.40 lineto +closepath stroke + 4.21 3.40 moveto + 4.15 3.47 lineto +closepath stroke + 4.21 3.40 moveto + 4.13 3.41 lineto +closepath stroke + 4.36 3.59 moveto + 4.33 3.53 lineto +closepath stroke + 4.36 3.59 moveto + 4.29 3.68 lineto +closepath stroke + 4.36 3.59 moveto + 4.39 3.67 lineto +closepath stroke + 4.33 3.53 moveto + 4.25 3.53 lineto +closepath stroke + 4.25 3.53 moveto + 4.18 3.61 lineto +closepath stroke + 4.25 3.53 moveto + 4.16 3.54 lineto +closepath stroke + 4.43 3.74 moveto + 4.39 3.67 lineto +closepath stroke + 4.43 3.74 moveto + 4.35 3.84 lineto +closepath stroke + 4.43 3.74 moveto + 4.46 3.82 lineto +closepath stroke + 4.39 3.67 moveto + 4.29 3.68 lineto +closepath stroke + 4.29 3.68 moveto + 4.21 3.76 lineto +closepath stroke + 4.29 3.68 moveto + 4.19 3.68 lineto +closepath stroke + 4.50 3.90 moveto + 4.46 3.82 lineto +closepath stroke + 4.50 3.90 moveto + 4.40 4.01 lineto +closepath stroke + 4.50 3.90 moveto + 4.53 3.99 lineto +closepath stroke + 4.46 3.82 moveto + 4.35 3.84 lineto +closepath stroke + 4.35 3.84 moveto + 4.25 3.93 lineto +closepath stroke + 4.35 3.84 moveto + 4.22 3.84 lineto +closepath stroke + 4.58 4.08 moveto + 4.53 3.99 lineto +closepath stroke + 4.58 4.08 moveto + 4.47 4.21 lineto +closepath stroke + 4.58 4.08 moveto + 4.62 4.18 lineto +closepath stroke + 4.53 3.99 moveto + 4.40 4.01 lineto +closepath stroke + 4.40 4.01 moveto + 4.29 4.11 lineto +closepath stroke + 4.40 4.01 moveto + 4.26 4.02 lineto +closepath stroke + 4.67 4.28 moveto + 4.62 4.18 lineto +closepath stroke + 4.67 4.28 moveto + 4.53 4.42 lineto +closepath stroke + 4.67 4.28 moveto + 4.71 4.39 lineto +closepath stroke + 4.62 4.18 moveto + 4.47 4.21 lineto +closepath stroke + 4.47 4.21 moveto + 4.33 4.31 lineto +closepath stroke + 4.47 4.21 moveto + 4.30 4.21 lineto +closepath stroke + 4.77 4.50 moveto + 4.71 4.39 lineto +closepath stroke + 4.77 4.50 moveto + 4.61 4.65 lineto +closepath stroke + 4.77 4.50 moveto + 4.81 4.62 lineto +closepath stroke + 4.71 4.39 moveto + 4.53 4.42 lineto +closepath stroke + 4.53 4.42 moveto + 4.38 4.54 lineto +closepath stroke + 4.53 4.42 moveto + 4.34 4.43 lineto +closepath stroke + 4.88 4.73 moveto + 4.81 4.62 lineto +closepath stroke + 4.88 4.73 moveto + 4.69 4.91 lineto +closepath stroke + 4.88 4.73 moveto + 4.92 4.87 lineto +closepath stroke + 4.81 4.62 moveto + 4.61 4.65 lineto +closepath stroke + 4.61 4.65 moveto + 4.43 4.78 lineto +closepath stroke + 4.61 4.65 moveto + 4.39 4.66 lineto +closepath stroke + 5.00 5.00 moveto + 4.92 4.87 lineto +closepath stroke + 5.00 5.00 moveto + 4.78 5.19 lineto +closepath stroke + 5.00 5.00 moveto + 5.04 5.14 lineto +closepath stroke + 4.92 4.87 moveto + 4.69 4.91 lineto +closepath stroke + 4.69 4.91 moveto + 4.49 5.05 lineto +closepath stroke + 4.69 4.91 moveto + 4.45 4.92 lineto +closepath stroke + 5.21 5.44 moveto + 5.12 5.29 lineto +closepath stroke + 5.21 5.44 moveto + 5.27 5.77 lineto +closepath stroke + 5.21 5.44 moveto + 4.88 5.67 lineto +closepath stroke + 5.12 5.29 moveto + 5.04 5.14 lineto +closepath stroke + 5.04 5.14 moveto + 4.78 5.19 lineto +closepath stroke + 4.78 5.19 moveto + 4.55 5.35 lineto +closepath stroke + 4.78 5.19 moveto + 4.50 5.20 lineto +closepath stroke + 5.27 5.77 moveto + 4.88 5.67 lineto +closepath stroke + 5.27 5.77 moveto + 5.27 6.00 lineto +closepath stroke + 4.88 5.67 moveto + 4.62 6.00 lineto +closepath stroke + 4.88 5.67 moveto + 4.57 5.67 lineto +closepath stroke + 4.12 3.34 moveto + 4.10 3.29 lineto +closepath stroke + 4.12 3.34 moveto + 4.07 3.41 lineto +closepath stroke + 4.12 3.34 moveto + 4.13 3.41 lineto +closepath stroke + 4.10 3.29 moveto + 4.05 3.29 lineto +closepath stroke + 4.10 3.29 moveto + 4.10 3.23 lineto +closepath stroke + 4.05 3.29 moveto + 4.10 3.23 lineto +closepath stroke + 4.05 3.29 moveto + 4.01 3.29 lineto +closepath stroke + 4.05 3.29 moveto + 4.00 3.23 lineto +closepath stroke + 4.15 3.47 moveto + 4.13 3.41 lineto +closepath stroke + 4.15 3.47 moveto + 4.08 3.54 lineto +closepath stroke + 4.15 3.47 moveto + 4.16 3.54 lineto +closepath stroke + 4.13 3.41 moveto + 4.07 3.41 lineto +closepath stroke + 4.07 3.41 moveto + 4.01 3.41 lineto +closepath stroke + 4.07 3.41 moveto + 4.00 3.34 lineto +closepath stroke + 4.18 3.61 moveto + 4.16 3.54 lineto +closepath stroke + 4.18 3.61 moveto + 4.10 3.69 lineto +closepath stroke + 4.18 3.61 moveto + 4.19 3.68 lineto +closepath stroke + 4.16 3.54 moveto + 4.08 3.54 lineto +closepath stroke + 4.08 3.54 moveto + 4.01 3.54 lineto +closepath stroke + 4.08 3.54 moveto + 4.00 3.47 lineto +closepath stroke + 4.21 3.76 moveto + 4.19 3.68 lineto +closepath stroke + 4.21 3.76 moveto + 4.11 3.85 lineto +closepath stroke + 4.21 3.76 moveto + 4.22 3.84 lineto +closepath stroke + 4.19 3.68 moveto + 4.10 3.69 lineto +closepath stroke + 4.10 3.69 moveto + 4.01 3.69 lineto +closepath stroke + 4.10 3.69 moveto + 4.00 3.61 lineto +closepath stroke + 4.25 3.93 moveto + 4.22 3.84 lineto +closepath stroke + 4.25 3.93 moveto + 4.13 4.02 lineto +closepath stroke + 4.25 3.93 moveto + 4.26 4.02 lineto +closepath stroke + 4.22 3.84 moveto + 4.11 3.85 lineto +closepath stroke + 4.11 3.85 moveto + 4.01 3.85 lineto +closepath stroke + 4.11 3.85 moveto + 4.00 3.76 lineto +closepath stroke + 4.29 4.11 moveto + 4.26 4.02 lineto +closepath stroke + 4.29 4.11 moveto + 4.15 4.22 lineto +closepath stroke + 4.29 4.11 moveto + 4.30 4.21 lineto +closepath stroke + 4.26 4.02 moveto + 4.13 4.02 lineto +closepath stroke + 4.13 4.02 moveto + 4.01 4.02 lineto +closepath stroke + 4.13 4.02 moveto + 4.00 3.93 lineto +closepath stroke + 4.33 4.31 moveto + 4.30 4.21 lineto +closepath stroke + 4.33 4.31 moveto + 4.17 4.43 lineto +closepath stroke + 4.33 4.31 moveto + 4.34 4.43 lineto +closepath stroke + 4.30 4.21 moveto + 4.15 4.22 lineto +closepath stroke + 4.15 4.22 moveto + 4.01 4.22 lineto +closepath stroke + 4.15 4.22 moveto + 4.00 4.12 lineto +closepath stroke + 4.38 4.54 moveto + 4.34 4.43 lineto +closepath stroke + 4.38 4.54 moveto + 4.20 4.67 lineto +closepath stroke + 4.38 4.54 moveto + 4.39 4.66 lineto +closepath stroke + 4.34 4.43 moveto + 4.17 4.43 lineto +closepath stroke + 4.17 4.43 moveto + 4.01 4.43 lineto +closepath stroke + 4.17 4.43 moveto + 4.00 4.32 lineto +closepath stroke + 4.43 4.78 moveto + 4.39 4.66 lineto +closepath stroke + 4.43 4.78 moveto + 4.23 4.93 lineto +closepath stroke + 4.43 4.78 moveto + 4.45 4.92 lineto +closepath stroke + 4.39 4.66 moveto + 4.20 4.67 lineto +closepath stroke + 4.20 4.67 moveto + 4.01 4.67 lineto +closepath stroke + 4.20 4.67 moveto + 4.00 4.54 lineto +closepath stroke + 4.49 5.05 moveto + 4.45 4.92 lineto +closepath stroke + 4.49 5.05 moveto + 4.26 5.21 lineto +closepath stroke + 4.49 5.05 moveto + 4.50 5.20 lineto +closepath stroke + 4.45 4.92 moveto + 4.23 4.93 lineto +closepath stroke + 4.23 4.93 moveto + 4.01 4.93 lineto +closepath stroke + 4.23 4.93 moveto + 4.00 4.79 lineto +closepath stroke + 4.55 5.35 moveto + 4.50 5.20 lineto +closepath stroke + 4.55 5.35 moveto + 4.29 5.68 lineto +closepath stroke + 4.55 5.35 moveto + 4.57 5.67 lineto +closepath stroke + 4.50 5.20 moveto + 4.26 5.21 lineto +closepath stroke + 4.26 5.21 moveto + 4.02 5.21 lineto +closepath stroke + 4.26 5.21 moveto + 4.00 5.06 lineto +closepath stroke + 4.62 6.00 moveto + 4.57 5.67 lineto +closepath stroke + 4.57 5.67 moveto + 4.29 5.68 lineto +closepath stroke + 4.29 5.68 moveto + 4.02 5.68 lineto +closepath stroke + 4.29 5.68 moveto + 4.00 5.36 lineto +closepath stroke + 4.01 3.29 moveto + 4.00 3.23 lineto +closepath stroke + 4.01 3.29 moveto + 3.95 3.29 lineto +closepath stroke + 4.01 3.29 moveto + 4.00 3.34 lineto +closepath stroke + 4.01 3.41 moveto + 4.00 3.34 lineto +closepath stroke + 4.01 3.41 moveto + 3.93 3.41 lineto +closepath stroke + 4.01 3.41 moveto + 4.00 3.47 lineto +closepath stroke + 4.00 3.34 moveto + 3.95 3.29 lineto +closepath stroke + 3.95 3.29 moveto + 3.89 3.29 lineto +closepath stroke + 3.95 3.29 moveto + 3.90 3.23 lineto +closepath stroke + 4.01 3.54 moveto + 4.00 3.47 lineto +closepath stroke + 4.01 3.54 moveto + 3.92 3.54 lineto +closepath stroke + 4.01 3.54 moveto + 4.00 3.61 lineto +closepath stroke + 4.00 3.47 moveto + 3.93 3.41 lineto +closepath stroke + 3.93 3.41 moveto + 3.87 3.41 lineto +closepath stroke + 3.93 3.41 moveto + 3.88 3.35 lineto +closepath stroke + 4.01 3.69 moveto + 4.00 3.61 lineto +closepath stroke + 4.01 3.69 moveto + 3.90 3.69 lineto +closepath stroke + 4.01 3.69 moveto + 4.00 3.76 lineto +closepath stroke + 4.00 3.61 moveto + 3.92 3.54 lineto +closepath stroke + 3.92 3.54 moveto + 3.84 3.54 lineto +closepath stroke + 3.92 3.54 moveto + 3.85 3.47 lineto +closepath stroke + 4.01 3.85 moveto + 4.00 3.76 lineto +closepath stroke + 4.01 3.85 moveto + 3.89 3.85 lineto +closepath stroke + 4.01 3.85 moveto + 4.00 3.93 lineto +closepath stroke + 4.00 3.76 moveto + 3.90 3.69 lineto +closepath stroke + 3.90 3.69 moveto + 3.81 3.69 lineto +closepath stroke + 3.90 3.69 moveto + 3.82 3.61 lineto +closepath stroke + 4.01 4.02 moveto + 4.00 3.93 lineto +closepath stroke + 4.01 4.02 moveto + 3.87 4.02 lineto +closepath stroke + 4.01 4.02 moveto + 4.00 4.12 lineto +closepath stroke + 4.00 3.93 moveto + 3.89 3.85 lineto +closepath stroke + 3.89 3.85 moveto + 3.78 3.85 lineto +closepath stroke + 3.89 3.85 moveto + 3.79 3.77 lineto +closepath stroke + 4.01 4.22 moveto + 4.00 4.12 lineto +closepath stroke + 4.01 4.22 moveto + 3.85 4.22 lineto +closepath stroke + 4.01 4.22 moveto + 4.00 4.32 lineto +closepath stroke + 4.00 4.12 moveto + 3.87 4.02 lineto +closepath stroke + 3.87 4.02 moveto + 3.74 4.03 lineto +closepath stroke + 3.87 4.02 moveto + 3.75 3.94 lineto +closepath stroke + 4.01 4.43 moveto + 4.00 4.32 lineto +closepath stroke + 4.01 4.43 moveto + 3.83 4.43 lineto +closepath stroke + 4.01 4.43 moveto + 4.00 4.54 lineto +closepath stroke + 4.00 4.32 moveto + 3.85 4.22 lineto +closepath stroke + 3.85 4.22 moveto + 3.70 4.22 lineto +closepath stroke + 3.85 4.22 moveto + 3.71 4.12 lineto +closepath stroke + 4.01 4.67 moveto + 4.00 4.54 lineto +closepath stroke + 4.01 4.67 moveto + 3.80 4.67 lineto +closepath stroke + 4.01 4.67 moveto + 4.00 4.79 lineto +closepath stroke + 4.00 4.54 moveto + 3.83 4.43 lineto +closepath stroke + 3.83 4.43 moveto + 3.65 4.44 lineto +closepath stroke + 3.83 4.43 moveto + 3.66 4.33 lineto +closepath stroke + 4.01 4.93 moveto + 4.00 4.79 lineto +closepath stroke + 4.01 4.93 moveto + 3.77 4.93 lineto +closepath stroke + 4.01 4.93 moveto + 4.00 5.06 lineto +closepath stroke + 4.00 4.79 moveto + 3.80 4.67 lineto +closepath stroke + 3.80 4.67 moveto + 3.60 4.67 lineto +closepath stroke + 3.80 4.67 moveto + 3.62 4.55 lineto +closepath stroke + 4.02 5.21 moveto + 4.00 5.06 lineto +closepath stroke + 4.02 5.21 moveto + 3.74 5.21 lineto +closepath stroke + 4.02 5.21 moveto + 4.00 5.36 lineto +closepath stroke + 4.00 5.06 moveto + 3.77 4.93 lineto +closepath stroke + 3.77 4.93 moveto + 3.55 4.93 lineto +closepath stroke + 3.77 4.93 moveto + 3.56 4.80 lineto +closepath stroke + 4.02 5.68 moveto + 4.00 5.36 lineto +closepath stroke + 4.02 5.68 moveto + 4.00 6.00 lineto +closepath stroke + 4.02 5.68 moveto + 3.71 5.68 lineto +closepath stroke + 4.00 5.36 moveto + 3.74 5.21 lineto +closepath stroke + 3.74 5.21 moveto + 3.49 5.22 lineto +closepath stroke + 3.74 5.21 moveto + 3.50 5.07 lineto +closepath stroke + 4.00 6.00 moveto + 3.71 5.68 lineto +closepath stroke + 3.71 5.68 moveto + 3.42 5.69 lineto +closepath stroke + 3.71 5.68 moveto + 3.44 5.37 lineto +closepath stroke + 3.89 3.29 moveto + 3.90 3.23 lineto +closepath stroke + 3.89 3.29 moveto + 3.83 3.29 lineto +closepath stroke + 3.89 3.29 moveto + 3.88 3.35 lineto +closepath stroke + 3.87 3.41 moveto + 3.88 3.35 lineto +closepath stroke + 3.87 3.41 moveto + 3.79 3.41 lineto +closepath stroke + 3.87 3.41 moveto + 3.85 3.47 lineto +closepath stroke + 3.88 3.35 moveto + 3.83 3.29 lineto +closepath stroke + 3.83 3.29 moveto + 3.77 3.29 lineto +closepath stroke + 3.83 3.29 moveto + 3.79 3.23 lineto +closepath stroke + 3.84 3.54 moveto + 3.85 3.47 lineto +closepath stroke + 3.84 3.54 moveto + 3.75 3.54 lineto +closepath stroke + 3.84 3.54 moveto + 3.82 3.61 lineto +closepath stroke + 3.85 3.47 moveto + 3.79 3.41 lineto +closepath stroke + 3.79 3.41 moveto + 3.72 3.41 lineto +closepath stroke + 3.79 3.41 moveto + 3.74 3.35 lineto +closepath stroke + 3.81 3.69 moveto + 3.82 3.61 lineto +closepath stroke + 3.81 3.69 moveto + 3.70 3.69 lineto +closepath stroke + 3.81 3.69 moveto + 3.79 3.77 lineto +closepath stroke + 3.82 3.61 moveto + 3.75 3.54 lineto +closepath stroke + 3.75 3.54 moveto + 3.65 3.55 lineto +closepath stroke + 3.75 3.54 moveto + 3.68 3.48 lineto +closepath stroke + 3.78 3.85 moveto + 3.79 3.77 lineto +closepath stroke + 3.78 3.85 moveto + 3.65 3.85 lineto +closepath stroke + 3.78 3.85 moveto + 3.75 3.94 lineto +closepath stroke + 3.79 3.77 moveto + 3.70 3.69 lineto +closepath stroke + 3.70 3.69 moveto + 3.59 3.70 lineto +closepath stroke + 3.70 3.69 moveto + 3.61 3.62 lineto +closepath stroke + 3.74 4.03 moveto + 3.75 3.94 lineto +closepath stroke + 3.74 4.03 moveto + 3.59 4.03 lineto +closepath stroke + 3.74 4.03 moveto + 3.71 4.12 lineto +closepath stroke + 3.75 3.94 moveto + 3.65 3.85 lineto +closepath stroke + 3.65 3.85 moveto + 3.52 3.86 lineto +closepath stroke + 3.65 3.85 moveto + 3.54 3.78 lineto +closepath stroke + 3.70 4.22 moveto + 3.71 4.12 lineto +closepath stroke + 3.70 4.22 moveto + 3.53 4.23 lineto +closepath stroke + 3.70 4.22 moveto + 3.66 4.33 lineto +closepath stroke + 3.71 4.12 moveto + 3.59 4.03 lineto +closepath stroke + 3.59 4.03 moveto + 3.44 4.04 lineto +closepath stroke + 3.59 4.03 moveto + 3.47 3.95 lineto +closepath stroke + 3.65 4.44 moveto + 3.66 4.33 lineto +closepath stroke + 3.65 4.44 moveto + 3.46 4.44 lineto +closepath stroke + 3.65 4.44 moveto + 3.62 4.55 lineto +closepath stroke + 3.66 4.33 moveto + 3.53 4.23 lineto +closepath stroke + 3.53 4.23 moveto + 3.35 4.24 lineto +closepath stroke + 3.53 4.23 moveto + 3.38 4.14 lineto +closepath stroke + 3.60 4.67 moveto + 3.62 4.55 lineto +closepath stroke + 3.60 4.67 moveto + 3.38 4.68 lineto +closepath stroke + 3.60 4.67 moveto + 3.56 4.80 lineto +closepath stroke + 3.62 4.55 moveto + 3.46 4.44 lineto +closepath stroke + 3.46 4.44 moveto + 3.25 4.46 lineto +closepath stroke + 3.46 4.44 moveto + 3.29 4.34 lineto +closepath stroke + 3.55 4.93 moveto + 3.56 4.80 lineto +closepath stroke + 3.55 4.93 moveto + 3.29 4.94 lineto +closepath stroke + 3.55 4.93 moveto + 3.50 5.07 lineto +closepath stroke + 3.56 4.80 moveto + 3.38 4.68 lineto +closepath stroke + 3.38 4.68 moveto + 3.14 4.69 lineto +closepath stroke + 3.38 4.68 moveto + 3.18 4.57 lineto +closepath stroke + 3.49 5.22 moveto + 3.50 5.07 lineto +closepath stroke + 3.49 5.22 moveto + 3.20 5.23 lineto +closepath stroke + 3.49 5.22 moveto + 3.44 5.37 lineto +closepath stroke + 3.50 5.07 moveto + 3.29 4.94 lineto +closepath stroke + 3.29 4.94 moveto + 3.03 4.96 lineto +closepath stroke + 3.29 4.94 moveto + 3.07 4.82 lineto +closepath stroke + 3.42 5.69 moveto + 3.44 5.37 lineto +closepath stroke + 3.42 5.69 moveto + 3.37 6.00 lineto +closepath stroke + 3.42 5.69 moveto + 3.10 5.69 lineto +closepath stroke + 3.44 5.37 moveto + 3.20 5.23 lineto +closepath stroke + 3.20 5.23 moveto + 2.90 5.25 lineto +closepath stroke + 3.20 5.23 moveto + 2.95 5.10 lineto +closepath stroke + 3.37 6.00 moveto + 3.10 5.69 lineto +closepath stroke + 3.10 5.69 moveto + 2.76 5.71 lineto +closepath stroke + 3.10 5.69 moveto + 2.81 5.40 lineto +closepath stroke + 3.77 3.29 moveto + 3.79 3.23 lineto +closepath stroke + 3.77 3.29 moveto + 3.69 3.29 lineto +closepath stroke + 3.77 3.29 moveto + 3.74 3.35 lineto +closepath stroke + 3.72 3.41 moveto + 3.74 3.35 lineto +closepath stroke + 3.72 3.41 moveto + 3.62 3.42 lineto +closepath stroke + 3.72 3.41 moveto + 3.68 3.48 lineto +closepath stroke + 3.74 3.35 moveto + 3.69 3.29 lineto +closepath stroke + 3.69 3.29 moveto + 3.61 3.30 lineto +closepath stroke + 3.69 3.29 moveto + 3.65 3.24 lineto +closepath stroke + 3.65 3.55 moveto + 3.68 3.48 lineto +closepath stroke + 3.65 3.55 moveto + 3.54 3.55 lineto +closepath stroke + 3.65 3.55 moveto + 3.61 3.62 lineto +closepath stroke + 3.68 3.48 moveto + 3.62 3.42 lineto +closepath stroke + 3.62 3.42 moveto + 3.52 3.42 lineto +closepath stroke + 3.62 3.42 moveto + 3.56 3.36 lineto +closepath stroke + 3.59 3.70 moveto + 3.61 3.62 lineto +closepath stroke + 3.59 3.70 moveto + 3.46 3.70 lineto +closepath stroke + 3.59 3.70 moveto + 3.54 3.78 lineto +closepath stroke + 3.61 3.62 moveto + 3.54 3.55 lineto +closepath stroke + 3.54 3.55 moveto + 3.42 3.56 lineto +closepath stroke + 3.54 3.55 moveto + 3.46 3.49 lineto +closepath stroke + 3.52 3.86 moveto + 3.54 3.78 lineto +closepath stroke + 3.52 3.86 moveto + 3.36 3.87 lineto +closepath stroke + 3.52 3.86 moveto + 3.47 3.95 lineto +closepath stroke + 3.54 3.78 moveto + 3.46 3.70 lineto +closepath stroke + 3.46 3.70 moveto + 3.31 3.71 lineto +closepath stroke + 3.46 3.70 moveto + 3.36 3.63 lineto +closepath stroke + 3.44 4.04 moveto + 3.47 3.95 lineto +closepath stroke + 3.44 4.04 moveto + 3.26 4.05 lineto +closepath stroke + 3.44 4.04 moveto + 3.38 4.14 lineto +closepath stroke + 3.47 3.95 moveto + 3.36 3.87 lineto +closepath stroke + 3.36 3.87 moveto + 3.26 3.80 lineto +closepath stroke + 3.36 3.87 moveto + 3.31 3.71 lineto +closepath stroke + 3.35 4.24 moveto + 3.38 4.14 lineto +closepath stroke + 3.35 4.24 moveto + 3.14 4.25 lineto +closepath stroke + 3.35 4.24 moveto + 3.29 4.34 lineto +closepath stroke + 3.38 4.14 moveto + 3.26 4.05 lineto +closepath stroke + 3.26 4.05 moveto + 3.13 3.97 lineto +closepath stroke + 3.26 4.05 moveto + 3.19 3.88 lineto +closepath stroke + 3.25 4.46 moveto + 3.29 4.34 lineto +closepath stroke + 3.25 4.46 moveto + 3.02 4.47 lineto +closepath stroke + 3.25 4.46 moveto + 3.18 4.57 lineto +closepath stroke + 3.29 4.34 moveto + 3.14 4.25 lineto +closepath stroke + 3.14 4.25 moveto + 3.00 4.16 lineto +closepath stroke + 3.14 4.25 moveto + 3.06 4.06 lineto +closepath stroke + 3.14 4.69 moveto + 3.18 4.57 lineto +closepath stroke + 3.14 4.69 moveto + 2.88 4.71 lineto +closepath stroke + 3.14 4.69 moveto + 3.07 4.82 lineto +closepath stroke + 3.18 4.57 moveto + 3.02 4.47 lineto +closepath stroke + 3.02 4.47 moveto + 2.84 4.37 lineto +closepath stroke + 3.02 4.47 moveto + 2.91 4.26 lineto +closepath stroke + 3.03 4.96 moveto + 3.07 4.82 lineto +closepath stroke + 3.03 4.96 moveto + 2.72 4.98 lineto +closepath stroke + 3.03 4.96 moveto + 2.95 5.10 lineto +closepath stroke + 3.07 4.82 moveto + 2.88 4.71 lineto +closepath stroke + 2.88 4.71 moveto + 2.67 4.61 lineto +closepath stroke + 2.88 4.71 moveto + 2.75 4.48 lineto +closepath stroke + 2.90 5.25 moveto + 2.95 5.10 lineto +closepath stroke + 2.90 5.25 moveto + 2.55 5.27 lineto +closepath stroke + 2.90 5.25 moveto + 2.81 5.40 lineto +closepath stroke + 2.95 5.10 moveto + 2.72 4.98 lineto +closepath stroke + 2.72 4.98 moveto + 2.49 4.86 lineto +closepath stroke + 2.72 4.98 moveto + 2.57 4.72 lineto +closepath stroke + 2.76 5.71 moveto + 2.81 5.40 lineto +closepath stroke + 2.76 5.71 moveto + 2.66 6.00 lineto +closepath stroke + 2.76 5.71 moveto + 2.37 5.71 lineto +closepath stroke + 2.81 5.40 moveto + 2.55 5.27 lineto +closepath stroke + 2.55 5.27 moveto + 2.28 5.14 lineto +closepath stroke + 2.55 5.27 moveto + 2.37 4.99 lineto +closepath stroke + 2.66 6.00 moveto + 2.37 5.71 lineto +closepath stroke + 2.37 5.71 moveto + 1.92 5.73 lineto +closepath stroke + 2.37 5.71 moveto + 2.02 5.44 lineto +closepath stroke + 3.61 3.30 moveto + 3.65 3.24 lineto +closepath stroke + 3.61 3.30 moveto + 3.51 3.30 lineto +closepath stroke + 3.61 3.30 moveto + 3.56 3.36 lineto +closepath stroke + 3.52 3.42 moveto + 3.56 3.36 lineto +closepath stroke + 3.52 3.42 moveto + 3.40 3.43 lineto +closepath stroke + 3.52 3.42 moveto + 3.46 3.49 lineto +closepath stroke + 3.56 3.36 moveto + 3.51 3.30 lineto +closepath stroke + 3.51 3.30 moveto + 3.41 3.30 lineto +closepath stroke + 3.51 3.30 moveto + 3.46 3.24 lineto +closepath stroke + 3.42 3.56 moveto + 3.46 3.49 lineto +closepath stroke + 3.42 3.56 moveto + 3.28 3.56 lineto +closepath stroke + 3.42 3.56 moveto + 3.36 3.63 lineto +closepath stroke + 3.46 3.49 moveto + 3.40 3.43 lineto +closepath stroke + 3.40 3.43 moveto + 3.35 3.36 lineto +closepath stroke + 3.40 3.43 moveto + 3.41 3.30 lineto +closepath stroke + 3.31 3.71 moveto + 3.36 3.63 lineto +closepath stroke + 3.31 3.71 moveto + 3.26 3.80 lineto +closepath stroke + 3.36 3.63 moveto + 3.28 3.56 lineto +closepath stroke + 3.28 3.56 moveto + 3.20 3.49 lineto +closepath stroke + 3.28 3.56 moveto + 3.27 3.42 lineto +closepath stroke + 3.26 3.80 moveto + 3.14 3.72 lineto +closepath stroke + 3.26 3.80 moveto + 3.19 3.88 lineto +closepath stroke + 3.13 3.97 moveto + 3.19 3.88 lineto +closepath stroke + 3.13 3.97 moveto + 2.99 3.88 lineto +closepath stroke + 3.13 3.97 moveto + 3.06 4.06 lineto +closepath stroke + 3.19 3.88 moveto + 3.14 3.72 lineto +closepath stroke + 3.14 3.72 moveto + 3.04 3.64 lineto +closepath stroke + 3.14 3.72 moveto + 3.11 3.56 lineto +closepath stroke + 3.00 4.16 moveto + 3.06 4.06 lineto +closepath stroke + 3.00 4.16 moveto + 2.82 4.07 lineto +closepath stroke + 3.00 4.16 moveto + 2.91 4.26 lineto +closepath stroke + 3.06 4.06 moveto + 2.99 3.88 lineto +closepath stroke + 2.99 3.88 moveto + 2.86 3.80 lineto +closepath stroke + 2.99 3.88 moveto + 2.94 3.71 lineto +closepath stroke + 2.84 4.37 moveto + 2.91 4.26 lineto +closepath stroke + 2.84 4.37 moveto + 2.64 4.27 lineto +closepath stroke + 2.84 4.37 moveto + 2.75 4.48 lineto +closepath stroke + 2.91 4.26 moveto + 2.82 4.07 lineto +closepath stroke + 2.82 4.07 moveto + 2.67 3.97 lineto +closepath stroke + 2.82 4.07 moveto + 2.75 3.88 lineto +closepath stroke + 2.67 4.61 moveto + 2.75 4.48 lineto +closepath stroke + 2.67 4.61 moveto + 2.44 4.49 lineto +closepath stroke + 2.67 4.61 moveto + 2.57 4.72 lineto +closepath stroke + 2.75 4.48 moveto + 2.64 4.27 lineto +closepath stroke + 2.64 4.27 moveto + 2.45 4.17 lineto +closepath stroke + 2.64 4.27 moveto + 2.55 4.06 lineto +closepath stroke + 2.49 4.86 moveto + 2.57 4.72 lineto +closepath stroke + 2.49 4.86 moveto + 2.22 4.74 lineto +closepath stroke + 2.49 4.86 moveto + 2.37 4.99 lineto +closepath stroke + 2.57 4.72 moveto + 2.44 4.49 lineto +closepath stroke + 2.44 4.49 moveto + 2.22 4.38 lineto +closepath stroke + 2.44 4.49 moveto + 2.32 4.26 lineto +closepath stroke + 2.28 5.14 moveto + 2.37 4.99 lineto +closepath stroke + 2.28 5.14 moveto + 1.97 5.01 lineto +closepath stroke + 2.28 5.14 moveto + 2.16 5.29 lineto +closepath stroke + 2.37 4.99 moveto + 2.22 4.74 lineto +closepath stroke + 2.22 4.74 moveto + 1.96 4.61 lineto +closepath stroke + 2.22 4.74 moveto + 2.07 4.48 lineto +closepath stroke + 1.97 5.01 moveto + 2.16 5.29 lineto +closepath stroke + 1.97 5.01 moveto + 1.67 4.87 lineto +closepath stroke + 1.97 5.01 moveto + 1.80 4.72 lineto +closepath stroke + 2.16 5.29 moveto + 1.71 5.31 lineto +closepath stroke + 2.16 5.29 moveto + 2.02 5.44 lineto +closepath stroke + 1.92 5.73 moveto + 2.02 5.44 lineto +closepath stroke + 1.92 5.73 moveto + 1.77 6.00 lineto +closepath stroke + 1.92 5.73 moveto + 1.41 5.73 lineto +closepath stroke + 2.02 5.44 moveto + 1.71 5.31 lineto +closepath stroke + 1.71 5.31 moveto + 1.36 5.15 lineto +closepath stroke + 1.71 5.31 moveto + 1.50 4.99 lineto +closepath stroke + 1.77 6.00 moveto + 1.41 5.73 lineto +closepath stroke + 1.41 5.73 moveto + 1.02 5.56 lineto +closepath stroke + 1.41 5.73 moveto + 1.17 5.29 lineto +closepath stroke + 3.41 3.30 moveto + 3.46 3.24 lineto +closepath stroke + 3.41 3.30 moveto + 3.35 3.36 lineto +closepath stroke + 3.35 3.36 moveto + 3.27 3.29 lineto +closepath stroke + 3.35 3.36 moveto + 3.27 3.42 lineto +closepath stroke + 3.20 3.49 moveto + 3.27 3.42 lineto +closepath stroke + 3.20 3.49 moveto + 3.10 3.42 lineto +closepath stroke + 3.20 3.49 moveto + 3.11 3.56 lineto +closepath stroke + 3.27 3.42 moveto + 3.27 3.29 lineto +closepath stroke + 3.27 3.29 moveto + 3.13 3.28 lineto +closepath stroke + 3.27 3.29 moveto + 3.21 3.22 lineto +closepath stroke + 3.04 3.64 moveto + 3.11 3.56 lineto +closepath stroke + 3.04 3.64 moveto + 2.91 3.55 lineto +closepath stroke + 3.04 3.64 moveto + 2.94 3.71 lineto +closepath stroke + 3.11 3.56 moveto + 3.10 3.42 lineto +closepath stroke + 3.10 3.42 moveto + 3.04 3.35 lineto +closepath stroke + 3.10 3.42 moveto + 3.13 3.28 lineto +closepath stroke + 2.86 3.80 moveto + 2.94 3.71 lineto +closepath stroke + 2.86 3.80 moveto + 2.71 3.70 lineto +closepath stroke + 2.86 3.80 moveto + 2.75 3.88 lineto +closepath stroke + 2.94 3.71 moveto + 2.91 3.55 lineto +closepath stroke + 2.91 3.55 moveto + 2.82 3.47 lineto +closepath stroke + 2.91 3.55 moveto + 2.92 3.40 lineto +closepath stroke + 2.67 3.97 moveto + 2.75 3.88 lineto +closepath stroke + 2.67 3.97 moveto + 2.48 3.87 lineto +closepath stroke + 2.67 3.97 moveto + 2.55 4.06 lineto +closepath stroke + 2.75 3.88 moveto + 2.71 3.70 lineto +closepath stroke + 2.71 3.70 moveto + 2.59 3.60 lineto +closepath stroke + 2.71 3.70 moveto + 2.70 3.53 lineto +closepath stroke + 2.45 4.17 moveto + 2.55 4.06 lineto +closepath stroke + 2.45 4.17 moveto + 2.23 4.05 lineto +closepath stroke + 2.45 4.17 moveto + 2.32 4.26 lineto +closepath stroke + 2.55 4.06 moveto + 2.48 3.87 lineto +closepath stroke + 2.48 3.87 moveto + 2.33 3.75 lineto +closepath stroke + 2.48 3.87 moveto + 2.45 3.67 lineto +closepath stroke + 2.22 4.38 moveto + 2.32 4.26 lineto +closepath stroke + 2.22 4.38 moveto + 1.96 4.25 lineto +closepath stroke + 2.22 4.38 moveto + 2.07 4.48 lineto +closepath stroke + 2.32 4.26 moveto + 2.23 4.05 lineto +closepath stroke + 2.23 4.05 moveto + 2.04 3.92 lineto +closepath stroke + 2.23 4.05 moveto + 2.17 3.82 lineto +closepath stroke + 1.96 4.61 moveto + 2.07 4.48 lineto +closepath stroke + 1.96 4.61 moveto + 1.66 4.47 lineto +closepath stroke + 1.96 4.61 moveto + 1.80 4.72 lineto +closepath stroke + 2.07 4.48 moveto + 1.96 4.25 lineto +closepath stroke + 1.96 4.25 moveto + 1.73 4.10 lineto +closepath stroke + 1.96 4.25 moveto + 1.87 3.99 lineto +closepath stroke + 1.67 4.87 moveto + 1.80 4.72 lineto +closepath stroke + 1.67 4.87 moveto + 1.33 4.71 lineto +closepath stroke + 1.67 4.87 moveto + 1.50 4.99 lineto +closepath stroke + 1.80 4.72 moveto + 1.66 4.47 lineto +closepath stroke + 1.66 4.47 moveto + 1.38 4.30 lineto +closepath stroke + 1.66 4.47 moveto + 1.54 4.18 lineto +closepath stroke + 1.36 5.15 moveto + 1.50 4.99 lineto +closepath stroke + 1.36 5.15 moveto + 0.96 4.97 lineto +closepath stroke + 1.36 5.15 moveto + 1.17 5.29 lineto +closepath stroke + 1.50 4.99 moveto + 1.33 4.71 lineto +closepath stroke + 1.33 4.71 moveto + 1.00 4.51 lineto +closepath stroke + 1.33 4.71 moveto + 1.18 4.39 lineto +closepath stroke + 1.02 5.56 moveto + 1.17 5.29 lineto +closepath stroke + 1.02 5.56 moveto + 0.63 6.00 lineto +closepath stroke + 1.02 5.56 moveto + 0.39 5.56 lineto +closepath stroke + 1.17 5.29 moveto + 0.96 4.97 lineto +closepath stroke + 0.96 4.97 moveto + 0.81 4.65 lineto +closepath stroke + 0.96 4.97 moveto + 1.00 4.51 lineto +closepath stroke + 0.63 6.00 moveto + 0.39 5.56 lineto +closepath stroke + 0.39 5.56 moveto + 0.00 5.71 lineto +closepath stroke + 0.39 5.56 moveto + 0.39 5.26 lineto +closepath stroke + 0.00 5.71 moveto + 0.39 5.26 lineto +closepath stroke + 0.39 5.26 moveto + 0.39 4.75 lineto +closepath stroke + 0.39 5.26 moveto + 0.00 4.91 lineto +closepath stroke + 3.13 3.28 moveto + 3.21 3.22 lineto +closepath stroke + 3.13 3.28 moveto + 3.04 3.35 lineto +closepath stroke + 3.04 3.35 moveto + 2.95 3.26 lineto +closepath stroke + 3.04 3.35 moveto + 2.92 3.40 lineto +closepath stroke + 2.82 3.47 moveto + 2.92 3.40 lineto +closepath stroke + 2.82 3.47 moveto + 2.70 3.37 lineto +closepath stroke + 2.82 3.47 moveto + 2.70 3.53 lineto +closepath stroke + 2.92 3.40 moveto + 2.95 3.26 lineto +closepath stroke + 2.95 3.26 moveto + 2.77 3.22 lineto +closepath stroke + 2.95 3.26 moveto + 2.89 3.17 lineto +closepath stroke + 2.59 3.60 moveto + 2.70 3.53 lineto +closepath stroke + 2.59 3.60 moveto + 2.43 3.49 lineto +closepath stroke + 2.59 3.60 moveto + 2.45 3.67 lineto +closepath stroke + 2.70 3.53 moveto + 2.70 3.37 lineto +closepath stroke + 2.70 3.37 moveto + 2.64 3.28 lineto +closepath stroke + 2.70 3.37 moveto + 2.77 3.22 lineto +closepath stroke + 2.33 3.75 moveto + 2.45 3.67 lineto +closepath stroke + 2.33 3.75 moveto + 2.14 3.62 lineto +closepath stroke + 2.33 3.75 moveto + 2.17 3.82 lineto +closepath stroke + 2.45 3.67 moveto + 2.43 3.49 lineto +closepath stroke + 2.43 3.49 moveto + 2.34 3.38 lineto +closepath stroke + 2.43 3.49 moveto + 2.48 3.32 lineto +closepath stroke + 2.04 3.92 moveto + 2.17 3.82 lineto +closepath stroke + 2.04 3.92 moveto + 1.81 3.77 lineto +closepath stroke + 2.04 3.92 moveto + 1.87 3.99 lineto +closepath stroke + 2.17 3.82 moveto + 2.14 3.62 lineto +closepath stroke + 2.14 3.62 moveto + 2.00 3.49 lineto +closepath stroke + 2.14 3.62 moveto + 2.16 3.42 lineto +closepath stroke + 1.73 4.10 moveto + 1.87 3.99 lineto +closepath stroke + 1.73 4.10 moveto + 1.45 3.93 lineto +closepath stroke + 1.73 4.10 moveto + 1.54 4.18 lineto +closepath stroke + 1.87 3.99 moveto + 1.81 3.77 lineto +closepath stroke + 1.81 3.77 moveto + 1.64 3.60 lineto +closepath stroke + 1.81 3.77 moveto + 1.81 3.53 lineto +closepath stroke + 1.38 4.30 moveto + 1.54 4.18 lineto +closepath stroke + 1.38 4.30 moveto + 1.06 4.10 lineto +closepath stroke + 1.38 4.30 moveto + 1.18 4.39 lineto +closepath stroke + 1.54 4.18 moveto + 1.45 3.93 lineto +closepath stroke + 1.45 3.93 moveto + 1.23 3.73 lineto +closepath stroke + 1.45 3.93 moveto + 1.42 3.65 lineto +closepath stroke + 0.81 4.65 moveto + 1.00 4.51 lineto +closepath stroke + 0.81 4.65 moveto + 0.39 4.75 lineto +closepath stroke + 0.81 4.65 moveto + 0.43 4.30 lineto +closepath stroke + 1.00 4.51 moveto + 1.18 4.39 lineto +closepath stroke + 1.18 4.39 moveto + 1.06 4.10 lineto +closepath stroke + 1.06 4.10 moveto + 0.79 3.88 lineto +closepath stroke + 1.06 4.10 moveto + 1.00 3.78 lineto +closepath stroke + 0.39 4.75 moveto + 0.43 4.30 lineto +closepath stroke + 0.39 4.75 moveto + 0.00 4.91 lineto +closepath stroke + 0.43 4.30 moveto + 0.00 4.03 lineto +closepath stroke + 0.43 4.30 moveto + 0.43 3.93 lineto +closepath stroke + 2.77 3.22 moveto + 2.89 3.17 lineto +closepath stroke + 2.77 3.22 moveto + 2.64 3.28 lineto +closepath stroke + 2.64 3.28 moveto + 2.54 3.17 lineto +closepath stroke + 2.64 3.28 moveto + 2.48 3.32 lineto +closepath stroke + 2.34 3.38 moveto + 2.48 3.32 lineto +closepath stroke + 2.34 3.38 moveto + 2.20 3.24 lineto +closepath stroke + 2.34 3.38 moveto + 2.16 3.42 lineto +closepath stroke + 2.48 3.32 moveto + 2.54 3.17 lineto +closepath stroke + 2.54 3.17 moveto + 2.33 3.10 lineto +closepath stroke + 2.54 3.17 moveto + 2.49 3.07 lineto +closepath stroke + 2.00 3.49 moveto + 2.16 3.42 lineto +closepath stroke + 2.00 3.49 moveto + 1.83 3.32 lineto +closepath stroke + 2.00 3.49 moveto + 1.81 3.53 lineto +closepath stroke + 2.16 3.42 moveto + 2.20 3.24 lineto +closepath stroke + 2.20 3.24 moveto + 2.15 3.14 lineto +closepath stroke + 2.20 3.24 moveto + 2.33 3.10 lineto +closepath stroke + 1.64 3.60 moveto + 1.81 3.53 lineto +closepath stroke + 1.64 3.60 moveto + 1.42 3.41 lineto +closepath stroke + 1.64 3.60 moveto + 1.42 3.65 lineto +closepath stroke + 1.81 3.53 moveto + 1.83 3.32 lineto +closepath stroke + 1.83 3.32 moveto + 1.74 3.18 lineto +closepath stroke + 1.83 3.32 moveto + 1.94 3.14 lineto +closepath stroke + 1.23 3.73 moveto + 1.42 3.65 lineto +closepath stroke + 1.23 3.73 moveto + 0.96 3.51 lineto +closepath stroke + 1.23 3.73 moveto + 1.00 3.78 lineto +closepath stroke + 1.42 3.65 moveto + 1.42 3.41 lineto +closepath stroke + 1.42 3.41 moveto + 1.29 3.23 lineto +closepath stroke + 1.42 3.41 moveto + 1.50 3.18 lineto +closepath stroke + 0.79 3.88 moveto + 1.00 3.78 lineto +closepath stroke + 0.79 3.88 moveto + 0.36 3.61 lineto +closepath stroke + 0.79 3.88 moveto + 0.43 3.93 lineto +closepath stroke + 1.00 3.78 moveto + 0.96 3.51 lineto +closepath stroke + 0.96 3.51 moveto + 0.79 3.28 lineto +closepath stroke + 0.96 3.51 moveto + 1.03 3.23 lineto +closepath stroke + 0.00 4.03 moveto + 0.43 3.93 lineto +closepath stroke + 0.43 3.93 moveto + 0.36 3.61 lineto +closepath stroke + 0.36 3.61 moveto + 0.00 3.33 lineto +closepath stroke + 0.36 3.61 moveto + 0.36 3.28 lineto +closepath stroke + 2.33 3.10 moveto + 2.49 3.07 lineto +closepath stroke + 2.33 3.10 moveto + 2.15 3.14 lineto +closepath stroke + 2.15 3.14 moveto + 2.06 3.00 lineto +closepath stroke + 2.15 3.14 moveto + 1.94 3.14 lineto +closepath stroke + 1.74 3.18 moveto + 1.94 3.14 lineto +closepath stroke + 1.74 3.18 moveto + 1.61 3.00 lineto +closepath stroke + 1.74 3.18 moveto + 1.50 3.18 lineto +closepath stroke + 1.94 3.14 moveto + 2.06 3.00 lineto +closepath stroke + 2.06 3.00 moveto + 1.94 2.86 lineto +closepath stroke + 2.06 3.00 moveto + 2.15 2.86 lineto +closepath stroke + 1.29 3.23 moveto + 1.50 3.18 lineto +closepath stroke + 1.29 3.23 moveto + 1.12 3.00 lineto +closepath stroke + 1.29 3.23 moveto + 1.03 3.23 lineto +closepath stroke + 1.50 3.18 moveto + 1.61 3.00 lineto +closepath stroke + 1.61 3.00 moveto + 1.50 2.82 lineto +closepath stroke + 1.61 3.00 moveto + 1.74 2.82 lineto +closepath stroke + 0.79 3.28 moveto + 1.03 3.23 lineto +closepath stroke + 0.79 3.28 moveto + 0.43 3.00 lineto +closepath stroke + 0.79 3.28 moveto + 0.36 3.28 lineto +closepath stroke + 1.03 3.23 moveto + 1.12 3.00 lineto +closepath stroke + 1.12 3.00 moveto + 1.03 2.77 lineto +closepath stroke + 1.12 3.00 moveto + 1.29 2.77 lineto +closepath stroke + 0.00 3.33 moveto + 0.36 3.28 lineto +closepath stroke + 0.36 3.28 moveto + 0.43 3.00 lineto +closepath stroke + 0.43 3.00 moveto + 0.36 2.72 lineto +closepath stroke + 0.43 3.00 moveto + 0.79 2.72 lineto +closepath stroke + 5.85 2.85 moveto + 6.00 2.85 lineto +closepath stroke + 5.85 2.85 moveto + 5.85 2.70 lineto +closepath stroke + 5.85 2.85 moveto + 5.61 2.85 lineto +closepath stroke + 6.00 2.85 moveto + 5.85 2.70 lineto +closepath stroke + 5.85 2.70 moveto + 6.00 2.51 lineto +closepath stroke + 5.85 2.70 moveto + 5.85 2.51 lineto +closepath stroke + 2.54 2.83 moveto + 2.33 2.90 lineto +closepath stroke + 2.54 2.83 moveto + 2.49 2.93 lineto +closepath stroke + 2.54 2.83 moveto + 2.64 2.72 lineto +closepath stroke + 2.54 2.83 moveto + 2.48 2.68 lineto +closepath stroke + 2.33 2.90 moveto + 2.49 2.93 lineto +closepath stroke + 2.33 2.90 moveto + 2.20 2.76 lineto +closepath stroke + 2.33 2.90 moveto + 2.15 2.86 lineto +closepath stroke + 1.94 2.86 moveto + 2.15 2.86 lineto +closepath stroke + 1.94 2.86 moveto + 1.83 2.68 lineto +closepath stroke + 1.94 2.86 moveto + 1.74 2.82 lineto +closepath stroke + 2.15 2.86 moveto + 2.20 2.76 lineto +closepath stroke + 2.20 2.76 moveto + 2.16 2.58 lineto +closepath stroke + 2.20 2.76 moveto + 2.34 2.62 lineto +closepath stroke + 1.50 2.82 moveto + 1.74 2.82 lineto +closepath stroke + 1.50 2.82 moveto + 1.42 2.59 lineto +closepath stroke + 1.50 2.82 moveto + 1.29 2.77 lineto +closepath stroke + 1.74 2.82 moveto + 1.83 2.68 lineto +closepath stroke + 1.83 2.68 moveto + 1.81 2.47 lineto +closepath stroke + 1.83 2.68 moveto + 2.00 2.51 lineto +closepath stroke + 1.03 2.77 moveto + 1.29 2.77 lineto +closepath stroke + 1.03 2.77 moveto + 0.96 2.49 lineto +closepath stroke + 1.03 2.77 moveto + 0.79 2.72 lineto +closepath stroke + 1.29 2.77 moveto + 1.42 2.59 lineto +closepath stroke + 1.42 2.59 moveto + 1.42 2.35 lineto +closepath stroke + 1.42 2.59 moveto + 1.64 2.40 lineto +closepath stroke + 0.36 2.72 moveto + 0.79 2.72 lineto +closepath stroke + 0.36 2.72 moveto + 0.00 2.67 lineto +closepath stroke + 0.36 2.72 moveto + 0.36 2.39 lineto +closepath stroke + 0.79 2.72 moveto + 0.96 2.49 lineto +closepath stroke + 0.96 2.49 moveto + 1.00 2.22 lineto +closepath stroke + 0.96 2.49 moveto + 1.23 2.27 lineto +closepath stroke + 0.00 2.67 moveto + 0.36 2.39 lineto +closepath stroke + 0.36 2.39 moveto + 0.43 2.07 lineto +closepath stroke + 0.36 2.39 moveto + 0.79 2.12 lineto +closepath stroke + 6.00 2.51 moveto + 5.85 2.51 lineto +closepath stroke + 5.85 2.51 moveto + 5.63 2.56 lineto +closepath stroke + 5.85 2.51 moveto + 5.78 2.37 lineto +closepath stroke + 5.61 2.85 moveto + 5.59 2.72 lineto +closepath stroke + 5.61 2.85 moveto + 5.49 2.87 lineto +closepath stroke + 2.77 2.78 moveto + 2.89 2.83 lineto +closepath stroke + 2.77 2.78 moveto + 2.95 2.74 lineto +closepath stroke + 2.77 2.78 moveto + 2.64 2.72 lineto +closepath stroke + 2.77 2.78 moveto + 2.70 2.63 lineto +closepath stroke + 2.89 2.83 moveto + 2.95 2.74 lineto +closepath stroke + 2.95 2.74 moveto + 3.04 2.65 lineto +closepath stroke + 2.95 2.74 moveto + 2.92 2.60 lineto +closepath stroke + 2.64 2.72 moveto + 2.70 2.63 lineto +closepath stroke + 2.64 2.72 moveto + 2.48 2.68 lineto +closepath stroke + 2.70 2.63 moveto + 2.82 2.53 lineto +closepath stroke + 2.70 2.63 moveto + 2.70 2.47 lineto +closepath stroke + 2.48 2.68 moveto + 2.43 2.51 lineto +closepath stroke + 2.48 2.68 moveto + 2.34 2.62 lineto +closepath stroke + 2.16 2.58 moveto + 2.34 2.62 lineto +closepath stroke + 2.16 2.58 moveto + 2.14 2.38 lineto +closepath stroke + 2.16 2.58 moveto + 2.00 2.51 lineto +closepath stroke + 2.34 2.62 moveto + 2.43 2.51 lineto +closepath stroke + 2.43 2.51 moveto + 2.59 2.40 lineto +closepath stroke + 2.43 2.51 moveto + 2.45 2.33 lineto +closepath stroke + 1.81 2.47 moveto + 2.00 2.51 lineto +closepath stroke + 1.81 2.47 moveto + 1.81 2.23 lineto +closepath stroke + 1.81 2.47 moveto + 1.64 2.40 lineto +closepath stroke + 2.00 2.51 moveto + 2.14 2.38 lineto +closepath stroke + 2.14 2.38 moveto + 2.33 2.25 lineto +closepath stroke + 2.14 2.38 moveto + 2.17 2.18 lineto +closepath stroke + 1.42 2.35 moveto + 1.64 2.40 lineto +closepath stroke + 1.42 2.35 moveto + 1.45 2.07 lineto +closepath stroke + 1.42 2.35 moveto + 1.23 2.27 lineto +closepath stroke + 1.64 2.40 moveto + 1.81 2.23 lineto +closepath stroke + 1.81 2.23 moveto + 2.04 2.08 lineto +closepath stroke + 1.81 2.23 moveto + 1.87 2.01 lineto +closepath stroke + 1.00 2.22 moveto + 1.23 2.27 lineto +closepath stroke + 1.00 2.22 moveto + 1.06 1.90 lineto +closepath stroke + 1.00 2.22 moveto + 0.79 2.12 lineto +closepath stroke + 1.23 2.27 moveto + 1.45 2.07 lineto +closepath stroke + 1.45 2.07 moveto + 1.54 1.82 lineto +closepath stroke + 1.45 2.07 moveto + 1.73 1.90 lineto +closepath stroke + 0.43 2.07 moveto + 0.79 2.12 lineto +closepath stroke + 0.43 2.07 moveto + 0.00 1.97 lineto +closepath stroke + 0.43 2.07 moveto + 0.43 1.70 lineto +closepath stroke + 0.79 2.12 moveto + 1.06 1.90 lineto +closepath stroke + 1.06 1.90 moveto + 1.18 1.61 lineto +closepath stroke + 1.06 1.90 moveto + 1.38 1.70 lineto +closepath stroke + 0.00 1.97 moveto + 0.43 1.70 lineto +closepath stroke + 0.43 1.70 moveto + 0.39 1.25 lineto +closepath stroke + 0.43 1.70 moveto + 0.81 1.35 lineto +closepath stroke + 5.59 2.72 moveto + 5.49 2.87 lineto +closepath stroke + 5.59 2.72 moveto + 5.63 2.56 lineto +closepath stroke + 5.59 2.72 moveto + 5.51 2.59 lineto +closepath stroke + 5.49 2.87 moveto + 5.38 2.87 lineto +closepath stroke + 5.63 2.56 moveto + 5.51 2.59 lineto +closepath stroke + 5.63 2.56 moveto + 5.78 2.37 lineto +closepath stroke + 5.51 2.59 moveto + 5.45 2.47 lineto +closepath stroke + 5.51 2.59 moveto + 5.41 2.64 lineto +closepath stroke + 5.78 2.37 moveto + 5.54 2.24 lineto +closepath stroke + 5.78 2.37 moveto + 5.76 2.19 lineto +closepath stroke + 3.13 2.72 moveto + 3.21 2.78 lineto +closepath stroke + 3.13 2.72 moveto + 3.27 2.71 lineto +closepath stroke + 3.13 2.72 moveto + 3.04 2.65 lineto +closepath stroke + 3.13 2.72 moveto + 3.10 2.58 lineto +closepath stroke + 3.21 2.78 moveto + 3.27 2.71 lineto +closepath stroke + 3.27 2.71 moveto + 3.35 2.64 lineto +closepath stroke + 3.27 2.71 moveto + 3.27 2.58 lineto +closepath stroke + 3.04 2.65 moveto + 3.10 2.58 lineto +closepath stroke + 3.04 2.65 moveto + 2.92 2.60 lineto +closepath stroke + 3.10 2.58 moveto + 3.20 2.51 lineto +closepath stroke + 3.10 2.58 moveto + 3.11 2.44 lineto +closepath stroke + 2.92 2.60 moveto + 2.82 2.53 lineto +closepath stroke + 2.92 2.60 moveto + 2.91 2.45 lineto +closepath stroke + 2.82 2.53 moveto + 2.91 2.45 lineto +closepath stroke + 2.82 2.53 moveto + 2.70 2.47 lineto +closepath stroke + 2.91 2.45 moveto + 3.04 2.36 lineto +closepath stroke + 2.91 2.45 moveto + 2.94 2.29 lineto +closepath stroke + 2.70 2.47 moveto + 2.59 2.40 lineto +closepath stroke + 2.70 2.47 moveto + 2.71 2.30 lineto +closepath stroke + 2.59 2.40 moveto + 2.71 2.30 lineto +closepath stroke + 2.59 2.40 moveto + 2.45 2.33 lineto +closepath stroke + 2.71 2.30 moveto + 2.86 2.20 lineto +closepath stroke + 2.71 2.30 moveto + 2.75 2.12 lineto +closepath stroke + 2.45 2.33 moveto + 2.33 2.25 lineto +closepath stroke + 2.45 2.33 moveto + 2.48 2.13 lineto +closepath stroke + 2.33 2.25 moveto + 2.48 2.13 lineto +closepath stroke + 2.33 2.25 moveto + 2.17 2.18 lineto +closepath stroke + 2.48 2.13 moveto + 2.67 2.03 lineto +closepath stroke + 2.48 2.13 moveto + 2.55 1.94 lineto +closepath stroke + 2.17 2.18 moveto + 2.04 2.08 lineto +closepath stroke + 2.17 2.18 moveto + 2.23 1.95 lineto +closepath stroke + 2.04 2.08 moveto + 2.23 1.95 lineto +closepath stroke + 2.04 2.08 moveto + 1.87 2.01 lineto +closepath stroke + 2.23 1.95 moveto + 2.45 1.83 lineto +closepath stroke + 2.23 1.95 moveto + 2.32 1.74 lineto +closepath stroke + 1.87 2.01 moveto + 1.96 1.75 lineto +closepath stroke + 1.87 2.01 moveto + 1.73 1.90 lineto +closepath stroke + 1.54 1.82 moveto + 1.73 1.90 lineto +closepath stroke + 1.54 1.82 moveto + 1.66 1.53 lineto +closepath stroke + 1.54 1.82 moveto + 1.38 1.70 lineto +closepath stroke + 1.73 1.90 moveto + 1.96 1.75 lineto +closepath stroke + 1.96 1.75 moveto + 2.22 1.62 lineto +closepath stroke + 1.96 1.75 moveto + 2.07 1.52 lineto +closepath stroke + 1.18 1.61 moveto + 1.38 1.70 lineto +closepath stroke + 1.18 1.61 moveto + 1.00 1.49 lineto +closepath stroke + 1.18 1.61 moveto + 1.33 1.29 lineto +closepath stroke + 1.38 1.70 moveto + 1.66 1.53 lineto +closepath stroke + 1.66 1.53 moveto + 1.96 1.39 lineto +closepath stroke + 1.66 1.53 moveto + 1.80 1.28 lineto +closepath stroke + 1.00 1.49 moveto + 1.33 1.29 lineto +closepath stroke + 1.00 1.49 moveto + 0.96 1.03 lineto +closepath stroke + 1.00 1.49 moveto + 0.81 1.35 lineto +closepath stroke + 1.33 1.29 moveto + 1.67 1.13 lineto +closepath stroke + 1.33 1.29 moveto + 1.50 1.01 lineto +closepath stroke + 0.39 1.25 moveto + 0.81 1.35 lineto +closepath stroke + 0.39 1.25 moveto + 0.00 1.09 lineto +closepath stroke + 0.39 1.25 moveto + 0.39 0.74 lineto +closepath stroke + 0.81 1.35 moveto + 0.96 1.03 lineto +closepath stroke + 0.96 1.03 moveto + 1.36 0.85 lineto +closepath stroke + 0.96 1.03 moveto + 1.17 0.71 lineto +closepath stroke + 0.00 1.09 moveto + 0.39 0.74 lineto +closepath stroke + 0.39 0.74 moveto + 0.00 0.29 lineto +closepath stroke + 0.39 0.74 moveto + 0.39 0.44 lineto +closepath stroke + 0.00 0.29 moveto + 0.39 0.44 lineto +closepath stroke + 0.39 0.44 moveto + 1.02 0.44 lineto +closepath stroke + 0.39 0.44 moveto + 0.63 0.00 lineto +closepath stroke + 5.38 2.87 moveto + 5.36 2.77 lineto +closepath stroke + 5.38 2.87 moveto + 5.28 2.90 lineto +closepath stroke + 3.46 2.76 moveto + 3.51 2.70 lineto +closepath stroke + 3.46 2.76 moveto + 3.41 2.70 lineto +closepath stroke + 3.51 2.70 moveto + 3.41 2.70 lineto +closepath stroke + 3.51 2.70 moveto + 3.61 2.70 lineto +closepath stroke + 3.51 2.70 moveto + 3.56 2.64 lineto +closepath stroke + 3.41 2.70 moveto + 3.40 2.57 lineto +closepath stroke + 3.41 2.70 moveto + 3.35 2.64 lineto +closepath stroke + 3.35 2.64 moveto + 3.27 2.58 lineto +closepath stroke + 3.35 2.64 moveto + 3.40 2.57 lineto +closepath stroke + 3.27 2.58 moveto + 3.20 2.51 lineto +closepath stroke + 3.27 2.58 moveto + 3.28 2.44 lineto +closepath stroke + 3.40 2.57 moveto + 3.52 2.58 lineto +closepath stroke + 3.40 2.57 moveto + 3.46 2.51 lineto +closepath stroke + 3.20 2.51 moveto + 3.28 2.44 lineto +closepath stroke + 3.20 2.51 moveto + 3.11 2.44 lineto +closepath stroke + 3.28 2.44 moveto + 3.42 2.44 lineto +closepath stroke + 3.28 2.44 moveto + 3.36 2.37 lineto +closepath stroke + 3.11 2.44 moveto + 3.04 2.36 lineto +closepath stroke + 3.11 2.44 moveto + 3.14 2.28 lineto +closepath stroke + 3.04 2.36 moveto + 3.14 2.28 lineto +closepath stroke + 3.04 2.36 moveto + 2.94 2.29 lineto +closepath stroke + 3.14 2.28 moveto + 3.26 2.20 lineto +closepath stroke + 3.14 2.28 moveto + 3.19 2.12 lineto +closepath stroke + 2.94 2.29 moveto + 2.86 2.20 lineto +closepath stroke + 2.94 2.29 moveto + 2.99 2.12 lineto +closepath stroke + 2.86 2.20 moveto + 2.99 2.12 lineto +closepath stroke + 2.86 2.20 moveto + 2.75 2.12 lineto +closepath stroke + 2.99 2.12 moveto + 3.13 2.03 lineto +closepath stroke + 2.99 2.12 moveto + 3.06 1.94 lineto +closepath stroke + 2.75 2.12 moveto + 2.67 2.03 lineto +closepath stroke + 2.75 2.12 moveto + 2.82 1.93 lineto +closepath stroke + 2.67 2.03 moveto + 2.82 1.93 lineto +closepath stroke + 2.67 2.03 moveto + 2.55 1.94 lineto +closepath stroke + 2.82 1.93 moveto + 3.00 1.84 lineto +closepath stroke + 2.82 1.93 moveto + 2.91 1.74 lineto +closepath stroke + 2.55 1.94 moveto + 2.45 1.83 lineto +closepath stroke + 2.55 1.94 moveto + 2.64 1.73 lineto +closepath stroke + 2.45 1.83 moveto + 2.64 1.73 lineto +closepath stroke + 2.45 1.83 moveto + 2.32 1.74 lineto +closepath stroke + 2.64 1.73 moveto + 2.84 1.63 lineto +closepath stroke + 2.64 1.73 moveto + 2.75 1.52 lineto +closepath stroke + 2.32 1.74 moveto + 2.22 1.62 lineto +closepath stroke + 2.32 1.74 moveto + 2.44 1.51 lineto +closepath stroke + 2.22 1.62 moveto + 2.44 1.51 lineto +closepath stroke + 2.22 1.62 moveto + 2.07 1.52 lineto +closepath stroke + 2.44 1.51 moveto + 2.67 1.39 lineto +closepath stroke + 2.44 1.51 moveto + 2.57 1.28 lineto +closepath stroke + 2.07 1.52 moveto + 1.96 1.39 lineto +closepath stroke + 2.07 1.52 moveto + 2.22 1.26 lineto +closepath stroke + 1.96 1.39 moveto + 2.22 1.26 lineto +closepath stroke + 1.96 1.39 moveto + 1.80 1.28 lineto +closepath stroke + 2.22 1.26 moveto + 2.49 1.14 lineto +closepath stroke + 2.22 1.26 moveto + 2.37 1.01 lineto +closepath stroke + 1.80 1.28 moveto + 1.67 1.13 lineto +closepath stroke + 1.80 1.28 moveto + 1.97 0.99 lineto +closepath stroke + 1.67 1.13 moveto + 1.97 0.99 lineto +closepath stroke + 1.67 1.13 moveto + 1.50 1.01 lineto +closepath stroke + 1.97 0.99 moveto + 2.28 0.86 lineto +closepath stroke + 1.97 0.99 moveto + 2.16 0.71 lineto +closepath stroke + 1.50 1.01 moveto + 1.36 0.85 lineto +closepath stroke + 1.50 1.01 moveto + 1.71 0.69 lineto +closepath stroke + 1.36 0.85 moveto + 1.71 0.69 lineto +closepath stroke + 1.36 0.85 moveto + 1.17 0.71 lineto +closepath stroke + 1.71 0.69 moveto + 2.16 0.71 lineto +closepath stroke + 1.71 0.69 moveto + 2.02 0.56 lineto +closepath stroke + 1.17 0.71 moveto + 1.02 0.44 lineto +closepath stroke + 1.17 0.71 moveto + 1.41 0.27 lineto +closepath stroke + 1.02 0.44 moveto + 1.41 0.27 lineto +closepath stroke + 1.02 0.44 moveto + 0.63 0.00 lineto +closepath stroke + 1.41 0.27 moveto + 1.92 0.27 lineto +closepath stroke + 1.41 0.27 moveto + 1.77 0.00 lineto +closepath stroke + 5.36 2.77 moveto + 5.28 2.90 lineto +closepath stroke + 5.36 2.77 moveto + 5.41 2.64 lineto +closepath stroke + 5.36 2.77 moveto + 5.30 2.66 lineto +closepath stroke + 5.28 2.90 moveto + 5.18 2.90 lineto +closepath stroke + 5.41 2.64 moveto + 5.30 2.66 lineto +closepath stroke + 5.41 2.64 moveto + 5.45 2.47 lineto +closepath stroke + 5.30 2.66 moveto + 5.24 2.56 lineto +closepath stroke + 5.30 2.66 moveto + 5.20 2.70 lineto +closepath stroke + 3.61 2.70 moveto + 3.56 2.64 lineto +closepath stroke + 3.61 2.70 moveto + 3.65 2.76 lineto +closepath stroke + 3.61 2.70 moveto + 3.69 2.71 lineto +closepath stroke + 3.56 2.64 moveto + 3.62 2.58 lineto +closepath stroke + 3.56 2.64 moveto + 3.52 2.58 lineto +closepath stroke + 3.65 2.76 moveto + 3.69 2.71 lineto +closepath stroke + 3.69 2.71 moveto + 3.77 2.71 lineto +closepath stroke + 3.69 2.71 moveto + 3.74 2.65 lineto +closepath stroke + 3.52 2.58 moveto + 3.46 2.51 lineto +closepath stroke + 3.52 2.58 moveto + 3.62 2.58 lineto +closepath stroke + 3.46 2.51 moveto + 3.54 2.45 lineto +closepath stroke + 3.46 2.51 moveto + 3.42 2.44 lineto +closepath stroke + 3.62 2.58 moveto + 3.68 2.52 lineto +closepath stroke + 3.62 2.58 moveto + 3.72 2.59 lineto +closepath stroke + 3.42 2.44 moveto + 3.36 2.37 lineto +closepath stroke + 3.42 2.44 moveto + 3.54 2.45 lineto +closepath stroke + 3.36 2.37 moveto + 3.31 2.29 lineto +closepath stroke + 3.36 2.37 moveto + 3.46 2.30 lineto +closepath stroke + 3.54 2.45 moveto + 3.61 2.38 lineto +closepath stroke + 3.54 2.45 moveto + 3.65 2.45 lineto +closepath stroke + 3.31 2.29 moveto + 3.46 2.30 lineto +closepath stroke + 3.31 2.29 moveto + 3.26 2.20 lineto +closepath stroke + 3.31 2.29 moveto + 3.36 2.13 lineto +closepath stroke + 3.46 2.30 moveto + 3.54 2.22 lineto +closepath stroke + 3.46 2.30 moveto + 3.59 2.30 lineto +closepath stroke + 3.26 2.20 moveto + 3.36 2.13 lineto +closepath stroke + 3.26 2.20 moveto + 3.19 2.12 lineto +closepath stroke + 3.36 2.13 moveto + 3.52 2.14 lineto +closepath stroke + 3.36 2.13 moveto + 3.47 2.05 lineto +closepath stroke + 3.19 2.12 moveto + 3.13 2.03 lineto +closepath stroke + 3.19 2.12 moveto + 3.26 1.95 lineto +closepath stroke + 3.13 2.03 moveto + 3.26 1.95 lineto +closepath stroke + 3.13 2.03 moveto + 3.06 1.94 lineto +closepath stroke + 3.26 1.95 moveto + 3.44 1.96 lineto +closepath stroke + 3.26 1.95 moveto + 3.38 1.86 lineto +closepath stroke + 3.06 1.94 moveto + 3.00 1.84 lineto +closepath stroke + 3.06 1.94 moveto + 3.14 1.75 lineto +closepath stroke + 3.00 1.84 moveto + 3.14 1.75 lineto +closepath stroke + 3.00 1.84 moveto + 2.91 1.74 lineto +closepath stroke + 3.14 1.75 moveto + 3.35 1.76 lineto +closepath stroke + 3.14 1.75 moveto + 3.29 1.66 lineto +closepath stroke + 2.91 1.74 moveto + 2.84 1.63 lineto +closepath stroke + 2.91 1.74 moveto + 3.02 1.53 lineto +closepath stroke + 2.84 1.63 moveto + 3.02 1.53 lineto +closepath stroke + 2.84 1.63 moveto + 2.75 1.52 lineto +closepath stroke + 3.02 1.53 moveto + 3.25 1.54 lineto +closepath stroke + 3.02 1.53 moveto + 3.18 1.43 lineto +closepath stroke + 2.75 1.52 moveto + 2.67 1.39 lineto +closepath stroke + 2.75 1.52 moveto + 2.88 1.29 lineto +closepath stroke + 2.67 1.39 moveto + 2.88 1.29 lineto +closepath stroke + 2.67 1.39 moveto + 2.57 1.28 lineto +closepath stroke + 2.88 1.29 moveto + 3.14 1.31 lineto +closepath stroke + 2.88 1.29 moveto + 3.07 1.18 lineto +closepath stroke + 2.57 1.28 moveto + 2.49 1.14 lineto +closepath stroke + 2.57 1.28 moveto + 2.72 1.02 lineto +closepath stroke + 2.49 1.14 moveto + 2.72 1.02 lineto +closepath stroke + 2.49 1.14 moveto + 2.37 1.01 lineto +closepath stroke + 2.72 1.02 moveto + 3.03 1.04 lineto +closepath stroke + 2.72 1.02 moveto + 2.95 0.90 lineto +closepath stroke + 2.37 1.01 moveto + 2.28 0.86 lineto +closepath stroke + 2.37 1.01 moveto + 2.55 0.73 lineto +closepath stroke + 2.16 0.71 moveto + 2.02 0.56 lineto +closepath stroke + 2.16 0.71 moveto + 2.28 0.86 lineto +closepath stroke + 2.02 0.56 moveto + 2.37 0.29 lineto +closepath stroke + 2.02 0.56 moveto + 1.92 0.27 lineto +closepath stroke + 2.28 0.86 moveto + 2.55 0.73 lineto +closepath stroke + 2.55 0.73 moveto + 2.90 0.75 lineto +closepath stroke + 2.55 0.73 moveto + 2.81 0.60 lineto +closepath stroke + 1.92 0.27 moveto + 1.77 0.00 lineto +closepath stroke + 1.92 0.27 moveto + 2.37 0.29 lineto +closepath stroke + 2.37 0.29 moveto + 2.76 0.29 lineto +closepath stroke + 2.37 0.29 moveto + 2.66 0.00 lineto +closepath stroke + 5.45 2.47 moveto + 5.44 2.31 lineto +closepath stroke + 5.45 2.47 moveto + 5.33 2.36 lineto +closepath stroke + 5.18 2.90 moveto + 5.16 2.82 lineto +closepath stroke + 5.18 2.90 moveto + 5.08 2.92 lineto +closepath stroke + 5.16 2.82 moveto + 5.08 2.92 lineto +closepath stroke + 5.16 2.82 moveto + 5.20 2.70 lineto +closepath stroke + 5.16 2.82 moveto + 5.10 2.72 lineto +closepath stroke + 5.08 2.92 moveto + 4.99 2.92 lineto +closepath stroke + 3.77 2.71 moveto + 3.74 2.65 lineto +closepath stroke + 3.77 2.71 moveto + 3.79 2.77 lineto +closepath stroke + 3.77 2.71 moveto + 3.83 2.71 lineto +closepath stroke + 3.74 2.65 moveto + 3.79 2.59 lineto +closepath stroke + 3.74 2.65 moveto + 3.72 2.59 lineto +closepath stroke + 3.79 2.77 moveto + 3.83 2.71 lineto +closepath stroke + 3.83 2.71 moveto + 3.88 2.65 lineto +closepath stroke + 3.83 2.71 moveto + 3.89 2.71 lineto +closepath stroke + 3.68 2.52 moveto + 3.72 2.59 lineto +closepath stroke + 3.68 2.52 moveto + 3.75 2.46 lineto +closepath stroke + 3.68 2.52 moveto + 3.65 2.45 lineto +closepath stroke + 3.72 2.59 moveto + 3.79 2.59 lineto +closepath stroke + 3.79 2.59 moveto + 3.85 2.53 lineto +closepath stroke + 3.79 2.59 moveto + 3.87 2.59 lineto +closepath stroke + 3.61 2.38 moveto + 3.65 2.45 lineto +closepath stroke + 3.61 2.38 moveto + 3.70 2.31 lineto +closepath stroke + 3.61 2.38 moveto + 3.59 2.30 lineto +closepath stroke + 3.65 2.45 moveto + 3.75 2.46 lineto +closepath stroke + 3.75 2.46 moveto + 3.82 2.39 lineto +closepath stroke + 3.75 2.46 moveto + 3.84 2.46 lineto +closepath stroke + 3.54 2.22 moveto + 3.59 2.30 lineto +closepath stroke + 3.54 2.22 moveto + 3.52 2.14 lineto +closepath stroke + 3.54 2.22 moveto + 3.65 2.15 lineto +closepath stroke + 3.59 2.30 moveto + 3.70 2.31 lineto +closepath stroke + 3.70 2.31 moveto + 3.79 2.23 lineto +closepath stroke + 3.70 2.31 moveto + 3.81 2.31 lineto +closepath stroke + 3.52 2.14 moveto + 3.65 2.15 lineto +closepath stroke + 3.52 2.14 moveto + 3.47 2.05 lineto +closepath stroke + 3.65 2.15 moveto + 3.75 2.06 lineto +closepath stroke + 3.65 2.15 moveto + 3.78 2.15 lineto +closepath stroke + 3.47 2.05 moveto + 3.44 1.96 lineto +closepath stroke + 3.47 2.05 moveto + 3.59 1.97 lineto +closepath stroke + 3.44 1.96 moveto + 3.59 1.97 lineto +closepath stroke + 3.44 1.96 moveto + 3.38 1.86 lineto +closepath stroke + 3.59 1.97 moveto + 3.74 1.97 lineto +closepath stroke + 3.59 1.97 moveto + 3.71 1.88 lineto +closepath stroke + 3.38 1.86 moveto + 3.35 1.76 lineto +closepath stroke + 3.38 1.86 moveto + 3.53 1.77 lineto +closepath stroke + 3.35 1.76 moveto + 3.53 1.77 lineto +closepath stroke + 3.35 1.76 moveto + 3.29 1.66 lineto +closepath stroke + 3.53 1.77 moveto + 3.70 1.78 lineto +closepath stroke + 3.53 1.77 moveto + 3.66 1.67 lineto +closepath stroke + 3.29 1.66 moveto + 3.25 1.54 lineto +closepath stroke + 3.29 1.66 moveto + 3.46 1.56 lineto +closepath stroke + 3.25 1.54 moveto + 3.46 1.56 lineto +closepath stroke + 3.25 1.54 moveto + 3.18 1.43 lineto +closepath stroke + 3.46 1.56 moveto + 3.65 1.56 lineto +closepath stroke + 3.46 1.56 moveto + 3.62 1.45 lineto +closepath stroke + 3.18 1.43 moveto + 3.14 1.31 lineto +closepath stroke + 3.18 1.43 moveto + 3.38 1.32 lineto +closepath stroke + 3.14 1.31 moveto + 3.38 1.32 lineto +closepath stroke + 3.14 1.31 moveto + 3.07 1.18 lineto +closepath stroke + 3.38 1.32 moveto + 3.60 1.33 lineto +closepath stroke + 3.38 1.32 moveto + 3.56 1.20 lineto +closepath stroke + 3.07 1.18 moveto + 3.03 1.04 lineto +closepath stroke + 3.07 1.18 moveto + 3.29 1.06 lineto +closepath stroke + 3.03 1.04 moveto + 3.29 1.06 lineto +closepath stroke + 3.03 1.04 moveto + 2.95 0.90 lineto +closepath stroke + 3.29 1.06 moveto + 3.55 1.07 lineto +closepath stroke + 3.29 1.06 moveto + 3.50 0.93 lineto +closepath stroke + 2.95 0.90 moveto + 2.90 0.75 lineto +closepath stroke + 2.95 0.90 moveto + 3.20 0.77 lineto +closepath stroke + 2.90 0.75 moveto + 3.20 0.77 lineto +closepath stroke + 2.90 0.75 moveto + 2.81 0.60 lineto +closepath stroke + 3.20 0.77 moveto + 3.49 0.78 lineto +closepath stroke + 3.20 0.77 moveto + 3.44 0.63 lineto +closepath stroke + 2.81 0.60 moveto + 2.76 0.29 lineto +closepath stroke + 2.81 0.60 moveto + 3.10 0.31 lineto +closepath stroke + 2.76 0.29 moveto + 3.10 0.31 lineto +closepath stroke + 2.76 0.29 moveto + 2.66 0.00 lineto +closepath stroke + 3.10 0.31 moveto + 3.42 0.31 lineto +closepath stroke + 3.10 0.31 moveto + 3.37 0.00 lineto +closepath stroke + 5.20 2.70 moveto + 5.10 2.72 lineto +closepath stroke + 5.20 2.70 moveto + 5.24 2.56 lineto +closepath stroke + 5.10 2.72 moveto + 5.06 2.65 lineto +closepath stroke + 5.10 2.72 moveto + 5.02 2.76 lineto +closepath stroke + 3.88 2.65 moveto + 3.89 2.71 lineto +closepath stroke + 3.88 2.65 moveto + 3.93 2.59 lineto +closepath stroke + 3.88 2.65 moveto + 3.87 2.59 lineto +closepath stroke + 3.89 2.71 moveto + 3.95 2.71 lineto +closepath stroke + 3.89 2.71 moveto + 3.90 2.77 lineto +closepath stroke + 3.95 2.71 moveto + 3.90 2.77 lineto +closepath stroke + 3.95 2.71 moveto + 4.00 2.66 lineto +closepath stroke + 3.95 2.71 moveto + 4.01 2.71 lineto +closepath stroke + 3.85 2.53 moveto + 3.87 2.59 lineto +closepath stroke + 3.85 2.53 moveto + 3.92 2.46 lineto +closepath stroke + 3.85 2.53 moveto + 3.84 2.46 lineto +closepath stroke + 3.87 2.59 moveto + 3.93 2.59 lineto +closepath stroke + 3.93 2.59 moveto + 4.00 2.53 lineto +closepath stroke + 3.93 2.59 moveto + 4.01 2.59 lineto +closepath stroke + 3.82 2.39 moveto + 3.84 2.46 lineto +closepath stroke + 3.82 2.39 moveto + 3.90 2.31 lineto +closepath stroke + 3.82 2.39 moveto + 3.81 2.31 lineto +closepath stroke + 3.84 2.46 moveto + 3.92 2.46 lineto +closepath stroke + 3.92 2.46 moveto + 4.00 2.39 lineto +closepath stroke + 3.92 2.46 moveto + 4.01 2.46 lineto +closepath stroke + 3.79 2.23 moveto + 3.81 2.31 lineto +closepath stroke + 3.79 2.23 moveto + 3.89 2.15 lineto +closepath stroke + 3.79 2.23 moveto + 3.78 2.15 lineto +closepath stroke + 3.81 2.31 moveto + 3.90 2.31 lineto +closepath stroke + 3.90 2.31 moveto + 4.00 2.24 lineto +closepath stroke + 3.90 2.31 moveto + 4.01 2.31 lineto +closepath stroke + 3.75 2.06 moveto + 3.78 2.15 lineto +closepath stroke + 3.75 2.06 moveto + 3.87 1.98 lineto +closepath stroke + 3.75 2.06 moveto + 3.74 1.97 lineto +closepath stroke + 3.78 2.15 moveto + 3.89 2.15 lineto +closepath stroke + 3.89 2.15 moveto + 4.00 2.07 lineto +closepath stroke + 3.89 2.15 moveto + 4.01 2.15 lineto +closepath stroke + 3.74 1.97 moveto + 3.71 1.88 lineto +closepath stroke + 3.74 1.97 moveto + 3.87 1.98 lineto +closepath stroke + 3.71 1.88 moveto + 3.70 1.78 lineto +closepath stroke + 3.71 1.88 moveto + 3.85 1.78 lineto +closepath stroke + 3.87 1.98 moveto + 4.00 1.88 lineto +closepath stroke + 3.87 1.98 moveto + 4.01 1.98 lineto +closepath stroke + 3.70 1.78 moveto + 3.85 1.78 lineto +closepath stroke + 3.70 1.78 moveto + 3.66 1.67 lineto +closepath stroke + 3.85 1.78 moveto + 4.01 1.78 lineto +closepath stroke + 3.85 1.78 moveto + 4.00 1.68 lineto +closepath stroke + 3.66 1.67 moveto + 3.65 1.56 lineto +closepath stroke + 3.66 1.67 moveto + 3.83 1.57 lineto +closepath stroke + 3.65 1.56 moveto + 3.83 1.57 lineto +closepath stroke + 3.65 1.56 moveto + 3.62 1.45 lineto +closepath stroke + 3.83 1.57 moveto + 4.01 1.57 lineto +closepath stroke + 3.83 1.57 moveto + 4.00 1.46 lineto +closepath stroke + 3.62 1.45 moveto + 3.60 1.33 lineto +closepath stroke + 3.62 1.45 moveto + 3.80 1.33 lineto +closepath stroke + 3.60 1.33 moveto + 3.80 1.33 lineto +closepath stroke + 3.60 1.33 moveto + 3.56 1.20 lineto +closepath stroke + 3.80 1.33 moveto + 4.01 1.33 lineto +closepath stroke + 3.80 1.33 moveto + 4.00 1.21 lineto +closepath stroke + 3.56 1.20 moveto + 3.55 1.07 lineto +closepath stroke + 3.56 1.20 moveto + 3.77 1.07 lineto +closepath stroke + 3.55 1.07 moveto + 3.77 1.07 lineto +closepath stroke + 3.55 1.07 moveto + 3.50 0.93 lineto +closepath stroke + 3.77 1.07 moveto + 4.01 1.07 lineto +closepath stroke + 3.77 1.07 moveto + 4.00 0.94 lineto +closepath stroke + 3.50 0.93 moveto + 3.49 0.78 lineto +closepath stroke + 3.50 0.93 moveto + 3.74 0.79 lineto +closepath stroke + 3.49 0.78 moveto + 3.74 0.79 lineto +closepath stroke + 3.49 0.78 moveto + 3.44 0.63 lineto +closepath stroke + 3.74 0.79 moveto + 4.02 0.79 lineto +closepath stroke + 3.74 0.79 moveto + 4.00 0.64 lineto +closepath stroke + 3.44 0.63 moveto + 3.42 0.31 lineto +closepath stroke + 3.44 0.63 moveto + 3.71 0.32 lineto +closepath stroke + 3.42 0.31 moveto + 3.71 0.32 lineto +closepath stroke + 3.42 0.31 moveto + 3.37 0.00 lineto +closepath stroke + 3.71 0.32 moveto + 4.02 0.32 lineto +closepath stroke + 3.71 0.32 moveto + 4.00 0.00 lineto +closepath stroke + 5.24 2.56 moveto + 5.24 2.43 lineto +closepath stroke + 5.24 2.56 moveto + 5.14 2.47 lineto +closepath stroke + 4.99 2.92 moveto + 4.98 2.85 lineto +closepath stroke + 4.99 2.92 moveto + 4.90 2.94 lineto +closepath stroke + 4.00 2.66 moveto + 4.01 2.71 lineto +closepath stroke + 4.00 2.66 moveto + 4.07 2.59 lineto +closepath stroke + 4.00 2.66 moveto + 4.01 2.59 lineto +closepath stroke + 4.01 2.71 moveto + 4.05 2.71 lineto +closepath stroke + 4.01 2.71 moveto + 4.00 2.77 lineto +closepath stroke + 4.05 2.71 moveto + 4.00 2.77 lineto +closepath stroke + 4.05 2.71 moveto + 4.10 2.71 lineto +closepath stroke + 4.05 2.71 moveto + 4.10 2.77 lineto +closepath stroke + 4.00 2.53 moveto + 4.01 2.59 lineto +closepath stroke + 4.00 2.53 moveto + 4.08 2.46 lineto +closepath stroke + 4.00 2.53 moveto + 4.01 2.46 lineto +closepath stroke + 4.01 2.59 moveto + 4.07 2.59 lineto +closepath stroke + 4.07 2.59 moveto + 4.13 2.59 lineto +closepath stroke + 4.07 2.59 moveto + 4.12 2.66 lineto +closepath stroke + 4.00 2.39 moveto + 4.01 2.46 lineto +closepath stroke + 4.00 2.39 moveto + 4.10 2.31 lineto +closepath stroke + 4.00 2.39 moveto + 4.01 2.31 lineto +closepath stroke + 4.01 2.46 moveto + 4.08 2.46 lineto +closepath stroke + 4.08 2.46 moveto + 4.16 2.46 lineto +closepath stroke + 4.08 2.46 moveto + 4.15 2.53 lineto +closepath stroke + 4.00 2.24 moveto + 4.01 2.31 lineto +closepath stroke + 4.00 2.24 moveto + 4.11 2.15 lineto +closepath stroke + 4.00 2.24 moveto + 4.01 2.15 lineto +closepath stroke + 4.01 2.31 moveto + 4.10 2.31 lineto +closepath stroke + 4.10 2.31 moveto + 4.19 2.32 lineto +closepath stroke + 4.10 2.31 moveto + 4.18 2.39 lineto +closepath stroke + 4.00 2.07 moveto + 4.01 2.15 lineto +closepath stroke + 4.00 2.07 moveto + 4.13 1.98 lineto +closepath stroke + 4.00 2.07 moveto + 4.01 1.98 lineto +closepath stroke + 4.01 2.15 moveto + 4.11 2.15 lineto +closepath stroke + 4.11 2.15 moveto + 4.22 2.16 lineto +closepath stroke + 4.11 2.15 moveto + 4.21 2.24 lineto +closepath stroke + 4.00 1.88 moveto + 4.01 1.98 lineto +closepath stroke + 4.00 1.88 moveto + 4.15 1.78 lineto +closepath stroke + 4.00 1.88 moveto + 4.01 1.78 lineto +closepath stroke + 4.01 1.98 moveto + 4.13 1.98 lineto +closepath stroke + 4.13 1.98 moveto + 4.26 1.98 lineto +closepath stroke + 4.13 1.98 moveto + 4.25 2.07 lineto +closepath stroke + 4.01 1.78 moveto + 4.00 1.68 lineto +closepath stroke + 4.01 1.78 moveto + 4.15 1.78 lineto +closepath stroke + 4.00 1.68 moveto + 4.01 1.57 lineto +closepath stroke + 4.00 1.68 moveto + 4.17 1.57 lineto +closepath stroke + 4.15 1.78 moveto + 4.30 1.79 lineto +closepath stroke + 4.15 1.78 moveto + 4.29 1.89 lineto +closepath stroke + 4.01 1.57 moveto + 4.17 1.57 lineto +closepath stroke + 4.01 1.57 moveto + 4.00 1.46 lineto +closepath stroke + 4.17 1.57 moveto + 4.33 1.69 lineto +closepath stroke + 4.17 1.57 moveto + 4.34 1.57 lineto +closepath stroke + 4.00 1.46 moveto + 4.01 1.33 lineto +closepath stroke + 4.00 1.46 moveto + 4.20 1.33 lineto +closepath stroke + 4.01 1.33 moveto + 4.20 1.33 lineto +closepath stroke + 4.01 1.33 moveto + 4.00 1.21 lineto +closepath stroke + 4.20 1.33 moveto + 4.38 1.46 lineto +closepath stroke + 4.20 1.33 moveto + 4.39 1.34 lineto +closepath stroke + 4.00 1.21 moveto + 4.01 1.07 lineto +closepath stroke + 4.00 1.21 moveto + 4.23 1.07 lineto +closepath stroke + 4.01 1.07 moveto + 4.23 1.07 lineto +closepath stroke + 4.01 1.07 moveto + 4.00 0.94 lineto +closepath stroke + 4.23 1.07 moveto + 4.43 1.22 lineto +closepath stroke + 4.23 1.07 moveto + 4.45 1.08 lineto +closepath stroke + 4.00 0.94 moveto + 4.02 0.79 lineto +closepath stroke + 4.00 0.94 moveto + 4.26 0.79 lineto +closepath stroke + 4.02 0.79 moveto + 4.26 0.79 lineto +closepath stroke + 4.02 0.79 moveto + 4.00 0.64 lineto +closepath stroke + 4.26 0.79 moveto + 4.49 0.95 lineto +closepath stroke + 4.26 0.79 moveto + 4.50 0.80 lineto +closepath stroke + 4.00 0.64 moveto + 4.02 0.32 lineto +closepath stroke + 4.00 0.64 moveto + 4.29 0.32 lineto +closepath stroke + 4.02 0.32 moveto + 4.29 0.32 lineto +closepath stroke + 4.02 0.32 moveto + 4.00 0.00 lineto +closepath stroke + 4.29 0.32 moveto + 4.55 0.65 lineto +closepath stroke + 4.29 0.32 moveto + 4.57 0.33 lineto +closepath stroke + 4.98 2.85 moveto + 4.90 2.94 lineto +closepath stroke + 4.98 2.85 moveto + 5.02 2.76 lineto +closepath stroke + 4.98 2.85 moveto + 4.93 2.78 lineto +closepath stroke + 4.90 2.94 moveto + 4.82 2.94 lineto +closepath stroke + 5.02 2.76 moveto + 4.93 2.78 lineto +closepath stroke + 5.02 2.76 moveto + 5.06 2.65 lineto +closepath stroke + 4.93 2.78 moveto + 4.89 2.72 lineto +closepath stroke + 4.93 2.78 moveto + 4.85 2.82 lineto +closepath stroke + 5.06 2.65 moveto + 5.06 2.53 lineto +closepath stroke + 5.06 2.65 moveto + 4.97 2.57 lineto +closepath stroke + 4.10 2.71 moveto + 4.10 2.77 lineto +closepath stroke + 4.10 2.71 moveto + 4.17 2.72 lineto +closepath stroke + 4.10 2.71 moveto + 4.12 2.66 lineto +closepath stroke + 4.13 2.59 moveto + 4.12 2.66 lineto +closepath stroke + 4.13 2.59 moveto + 4.21 2.60 lineto +closepath stroke + 4.13 2.59 moveto + 4.15 2.53 lineto +closepath stroke + 4.12 2.66 moveto + 4.17 2.72 lineto +closepath stroke + 4.17 2.72 moveto + 4.22 2.72 lineto +closepath stroke + 4.17 2.72 moveto + 4.20 2.78 lineto +closepath stroke + 4.16 2.46 moveto + 4.15 2.53 lineto +closepath stroke + 4.16 2.46 moveto + 4.25 2.47 lineto +closepath stroke + 4.16 2.46 moveto + 4.18 2.39 lineto +closepath stroke + 4.15 2.53 moveto + 4.21 2.60 lineto +closepath stroke + 4.21 2.60 moveto + 4.27 2.60 lineto +closepath stroke + 4.21 2.60 moveto + 4.25 2.67 lineto +closepath stroke + 4.19 2.32 moveto + 4.18 2.39 lineto +closepath stroke + 4.19 2.32 moveto + 4.29 2.32 lineto +closepath stroke + 4.19 2.32 moveto + 4.21 2.24 lineto +closepath stroke + 4.18 2.39 moveto + 4.25 2.47 lineto +closepath stroke + 4.25 2.47 moveto + 4.33 2.47 lineto +closepath stroke + 4.25 2.47 moveto + 4.30 2.54 lineto +closepath stroke + 4.22 2.16 moveto + 4.21 2.24 lineto +closepath stroke + 4.22 2.16 moveto + 4.35 2.16 lineto +closepath stroke + 4.22 2.16 moveto + 4.25 2.07 lineto +closepath stroke + 4.21 2.24 moveto + 4.29 2.32 lineto +closepath stroke + 4.29 2.32 moveto + 4.39 2.33 lineto +closepath stroke + 4.29 2.32 moveto + 4.36 2.41 lineto +closepath stroke + 4.26 1.98 moveto + 4.25 2.07 lineto +closepath stroke + 4.26 1.98 moveto + 4.40 1.99 lineto +closepath stroke + 4.26 1.98 moveto + 4.29 1.89 lineto +closepath stroke + 4.25 2.07 moveto + 4.35 2.16 lineto +closepath stroke + 4.35 2.16 moveto + 4.46 2.18 lineto +closepath stroke + 4.35 2.16 moveto + 4.43 2.26 lineto +closepath stroke + 4.30 1.79 moveto + 4.29 1.89 lineto +closepath stroke + 4.30 1.79 moveto + 4.47 1.79 lineto +closepath stroke + 4.30 1.79 moveto + 4.33 1.69 lineto +closepath stroke + 4.29 1.89 moveto + 4.40 1.99 lineto +closepath stroke + 4.40 1.99 moveto + 4.53 2.01 lineto +closepath stroke + 4.40 1.99 moveto + 4.50 2.10 lineto +closepath stroke + 4.33 1.69 moveto + 4.34 1.57 lineto +closepath stroke + 4.33 1.69 moveto + 4.47 1.79 lineto +closepath stroke + 4.34 1.57 moveto + 4.38 1.46 lineto +closepath stroke + 4.34 1.57 moveto + 4.53 1.58 lineto +closepath stroke + 4.47 1.79 moveto + 4.62 1.82 lineto +closepath stroke + 4.47 1.79 moveto + 4.58 1.92 lineto +closepath stroke + 4.38 1.46 moveto + 4.53 1.58 lineto +closepath stroke + 4.38 1.46 moveto + 4.39 1.34 lineto +closepath stroke + 4.53 1.58 moveto + 4.71 1.61 lineto +closepath stroke + 4.53 1.58 moveto + 4.67 1.72 lineto +closepath stroke + 4.39 1.34 moveto + 4.43 1.22 lineto +closepath stroke + 4.39 1.34 moveto + 4.61 1.35 lineto +closepath stroke + 4.43 1.22 moveto + 4.61 1.35 lineto +closepath stroke + 4.43 1.22 moveto + 4.45 1.08 lineto +closepath stroke + 4.61 1.35 moveto + 4.77 1.50 lineto +closepath stroke + 4.61 1.35 moveto + 4.81 1.38 lineto +closepath stroke + 4.45 1.08 moveto + 4.49 0.95 lineto +closepath stroke + 4.45 1.08 moveto + 4.69 1.09 lineto +closepath stroke + 4.49 0.95 moveto + 4.69 1.09 lineto +closepath stroke + 4.49 0.95 moveto + 4.50 0.80 lineto +closepath stroke + 4.69 1.09 moveto + 4.88 1.27 lineto +closepath stroke + 4.69 1.09 moveto + 4.92 1.13 lineto +closepath stroke + 4.50 0.80 moveto + 4.55 0.65 lineto +closepath stroke + 4.50 0.80 moveto + 4.78 0.81 lineto +closepath stroke + 4.55 0.65 moveto + 4.78 0.81 lineto +closepath stroke + 4.55 0.65 moveto + 4.57 0.33 lineto +closepath stroke + 4.78 0.81 moveto + 5.00 1.00 lineto +closepath stroke + 4.78 0.81 moveto + 5.04 0.86 lineto +closepath stroke + 4.57 0.33 moveto + 4.88 0.33 lineto +closepath stroke + 4.57 0.33 moveto + 4.62 0.00 lineto +closepath stroke + 4.88 0.33 moveto + 4.62 0.00 lineto +closepath stroke + 4.88 0.33 moveto + 5.21 0.56 lineto +closepath stroke + 4.88 0.33 moveto + 5.27 0.23 lineto +closepath stroke + 4.82 2.94 moveto + 4.81 2.89 lineto +closepath stroke + 4.82 2.94 moveto + 4.74 2.95 lineto +closepath stroke + 4.22 2.72 moveto + 4.20 2.78 lineto +closepath stroke + 4.22 2.72 moveto + 4.28 2.73 lineto +closepath stroke + 4.22 2.72 moveto + 4.25 2.67 lineto +closepath stroke + 4.27 2.60 moveto + 4.25 2.67 lineto +closepath stroke + 4.27 2.60 moveto + 4.35 2.61 lineto +closepath stroke + 4.27 2.60 moveto + 4.30 2.54 lineto +closepath stroke + 4.25 2.67 moveto + 4.28 2.73 lineto +closepath stroke + 4.28 2.73 moveto + 4.34 2.74 lineto +closepath stroke + 4.28 2.73 moveto + 4.30 2.79 lineto +closepath stroke + 4.33 2.47 moveto + 4.30 2.54 lineto +closepath stroke + 4.33 2.47 moveto + 4.42 2.49 lineto +closepath stroke + 4.33 2.47 moveto + 4.36 2.41 lineto +closepath stroke + 4.30 2.54 moveto + 4.35 2.61 lineto +closepath stroke + 4.35 2.61 moveto + 4.41 2.63 lineto +closepath stroke + 4.35 2.61 moveto + 4.38 2.69 lineto +closepath stroke + 4.39 2.33 moveto + 4.36 2.41 lineto +closepath stroke + 4.39 2.33 moveto + 4.50 2.35 lineto +closepath stroke + 4.39 2.33 moveto + 4.43 2.26 lineto +closepath stroke + 4.36 2.41 moveto + 4.42 2.49 lineto +closepath stroke + 4.42 2.49 moveto + 4.50 2.51 lineto +closepath stroke + 4.42 2.49 moveto + 4.46 2.57 lineto +closepath stroke + 4.46 2.18 moveto + 4.43 2.26 lineto +closepath stroke + 4.46 2.18 moveto + 4.59 2.20 lineto +closepath stroke + 4.46 2.18 moveto + 4.50 2.10 lineto +closepath stroke + 4.43 2.26 moveto + 4.50 2.35 lineto +closepath stroke + 4.50 2.35 moveto + 4.60 2.38 lineto +closepath stroke + 4.50 2.35 moveto + 4.55 2.45 lineto +closepath stroke + 4.53 2.01 moveto + 4.50 2.10 lineto +closepath stroke + 4.53 2.01 moveto + 4.69 2.03 lineto +closepath stroke + 4.53 2.01 moveto + 4.58 1.92 lineto +closepath stroke + 4.50 2.10 moveto + 4.59 2.20 lineto +closepath stroke + 4.59 2.20 moveto + 4.70 2.23 lineto +closepath stroke + 4.59 2.20 moveto + 4.66 2.31 lineto +closepath stroke + 4.62 1.82 moveto + 4.58 1.92 lineto +closepath stroke + 4.62 1.82 moveto + 4.79 1.85 lineto +closepath stroke + 4.62 1.82 moveto + 4.67 1.72 lineto +closepath stroke + 4.58 1.92 moveto + 4.69 2.03 lineto +closepath stroke + 4.69 2.03 moveto + 4.82 2.07 lineto +closepath stroke + 4.69 2.03 moveto + 4.77 2.16 lineto +closepath stroke + 4.71 1.61 moveto + 4.67 1.72 lineto +closepath stroke + 4.71 1.61 moveto + 4.91 1.64 lineto +closepath stroke + 4.71 1.61 moveto + 4.77 1.50 lineto +closepath stroke + 4.67 1.72 moveto + 4.79 1.85 lineto +closepath stroke + 4.79 1.85 moveto + 4.95 1.89 lineto +closepath stroke + 4.79 1.85 moveto + 4.89 1.99 lineto +closepath stroke + 4.77 1.50 moveto + 4.81 1.38 lineto +closepath stroke + 4.77 1.50 moveto + 4.91 1.64 lineto +closepath stroke + 4.81 1.38 moveto + 5.04 1.42 lineto +closepath stroke + 4.81 1.38 moveto + 4.88 1.27 lineto +closepath stroke + 4.91 1.64 moveto + 5.09 1.70 lineto +closepath stroke + 4.91 1.64 moveto + 5.02 1.81 lineto +closepath stroke + 4.88 1.27 moveto + 4.92 1.13 lineto +closepath stroke + 4.88 1.27 moveto + 5.04 1.42 lineto +closepath stroke + 4.92 1.13 moveto + 5.00 1.00 lineto +closepath stroke + 4.92 1.13 moveto + 5.18 1.17 lineto +closepath stroke + 5.04 1.42 moveto + 5.17 1.60 lineto +closepath stroke + 5.04 1.42 moveto + 5.24 1.49 lineto +closepath stroke + 5.00 1.00 moveto + 5.18 1.17 lineto +closepath stroke + 5.00 1.00 moveto + 5.04 0.86 lineto +closepath stroke + 5.18 1.17 moveto + 5.33 1.38 lineto +closepath stroke + 5.18 1.17 moveto + 5.41 1.25 lineto +closepath stroke + 5.04 0.86 moveto + 5.12 0.71 lineto +closepath stroke + 5.04 0.86 moveto + 5.34 0.90 lineto +closepath stroke + 5.12 0.71 moveto + 5.34 0.90 lineto +closepath stroke + 5.12 0.71 moveto + 5.21 0.56 lineto +closepath stroke + 5.12 0.71 moveto + 5.51 0.61 lineto +closepath stroke + 5.34 0.90 moveto + 5.41 1.25 lineto +closepath stroke + 5.34 0.90 moveto + 5.49 1.11 lineto +closepath stroke + 5.21 0.56 moveto + 5.51 0.61 lineto +closepath stroke + 5.21 0.56 moveto + 5.27 0.23 lineto +closepath stroke + 5.51 0.61 moveto + 5.71 1.00 lineto +closepath stroke + 5.51 0.61 moveto + 5.80 0.84 lineto +closepath stroke + 5.27 0.23 moveto + 5.60 0.23 lineto +closepath stroke + 5.27 0.23 moveto + 5.27 0.00 lineto +closepath stroke + 5.60 0.23 moveto + 5.80 0.23 lineto +closepath stroke + 5.60 0.23 moveto + 5.80 0.00 lineto +closepath stroke + 5.60 0.23 moveto + 5.27 0.00 lineto +closepath stroke + 5.80 0.23 moveto + 5.80 0.00 lineto +closepath stroke + 5.80 0.23 moveto + 5.80 0.84 lineto +closepath stroke + 5.80 0.23 moveto + 6.00 0.61 lineto +closepath stroke + 4.81 2.89 moveto + 4.74 2.95 lineto +closepath stroke + 4.81 2.89 moveto + 4.85 2.82 lineto +closepath stroke + 4.81 2.89 moveto + 4.77 2.83 lineto +closepath stroke + 4.74 2.95 moveto + 4.66 2.95 lineto +closepath stroke + 4.85 2.82 moveto + 4.77 2.83 lineto +closepath stroke + 4.85 2.82 moveto + 4.89 2.72 lineto +closepath stroke + 4.77 2.83 moveto + 4.74 2.79 lineto +closepath stroke + 4.77 2.83 moveto + 4.70 2.87 lineto +closepath stroke + 4.89 2.72 moveto + 4.90 2.63 lineto +closepath stroke + 4.89 2.72 moveto + 4.82 2.66 lineto +closepath stroke + 4.34 2.74 moveto + 4.30 2.79 lineto +closepath stroke + 4.34 2.74 moveto + 4.40 2.75 lineto +closepath stroke + 4.34 2.74 moveto + 4.38 2.69 lineto +closepath stroke + 4.41 2.63 moveto + 4.38 2.69 lineto +closepath stroke + 4.41 2.63 moveto + 4.49 2.65 lineto +closepath stroke + 4.41 2.63 moveto + 4.46 2.57 lineto +closepath stroke + 4.38 2.69 moveto + 4.40 2.75 lineto +closepath stroke + 4.40 2.75 moveto + 4.45 2.77 lineto +closepath stroke + 4.40 2.75 moveto + 4.40 2.82 lineto +closepath stroke + 4.50 2.51 moveto + 4.46 2.57 lineto +closepath stroke + 4.50 2.51 moveto + 4.60 2.54 lineto +closepath stroke + 4.50 2.51 moveto + 4.55 2.45 lineto +closepath stroke + 4.46 2.57 moveto + 4.49 2.65 lineto +closepath stroke + 4.49 2.65 moveto + 4.55 2.67 lineto +closepath stroke + 4.49 2.65 moveto + 4.50 2.73 lineto +closepath stroke + 4.60 2.38 moveto + 4.55 2.45 lineto +closepath stroke + 4.60 2.38 moveto + 4.71 2.41 lineto +closepath stroke + 4.60 2.38 moveto + 4.66 2.31 lineto +closepath stroke + 4.55 2.45 moveto + 4.60 2.54 lineto +closepath stroke + 4.60 2.54 moveto + 4.67 2.57 lineto +closepath stroke + 4.60 2.54 moveto + 4.62 2.63 lineto +closepath stroke + 4.70 2.23 moveto + 4.66 2.31 lineto +closepath stroke + 4.70 2.23 moveto + 4.83 2.27 lineto +closepath stroke + 4.70 2.23 moveto + 4.77 2.16 lineto +closepath stroke + 4.66 2.31 moveto + 4.71 2.41 lineto +closepath stroke + 4.71 2.41 moveto + 4.80 2.45 lineto +closepath stroke + 4.71 2.41 moveto + 4.74 2.52 lineto +closepath stroke + 4.82 2.07 moveto + 4.77 2.16 lineto +closepath stroke + 4.82 2.07 moveto + 4.97 2.12 lineto +closepath stroke + 4.82 2.07 moveto + 4.89 1.99 lineto +closepath stroke + 4.77 2.16 moveto + 4.83 2.27 lineto +closepath stroke + 4.83 2.27 moveto + 4.94 2.33 lineto +closepath stroke + 4.83 2.27 moveto + 4.87 2.40 lineto +closepath stroke + 4.95 1.89 moveto + 4.89 1.99 lineto +closepath stroke + 4.95 1.89 moveto + 5.12 1.95 lineto +closepath stroke + 4.95 1.89 moveto + 5.02 1.81 lineto +closepath stroke + 4.89 1.99 moveto + 4.97 2.12 lineto +closepath stroke + 4.97 2.12 moveto + 5.09 2.19 lineto +closepath stroke + 4.97 2.12 moveto + 5.02 2.27 lineto +closepath stroke + 5.09 1.70 moveto + 5.02 1.81 lineto +closepath stroke + 5.09 1.70 moveto + 5.29 1.77 lineto +closepath stroke + 5.09 1.70 moveto + 5.17 1.60 lineto +closepath stroke + 5.02 1.81 moveto + 5.12 1.95 lineto +closepath stroke + 5.12 1.95 moveto + 5.26 2.03 lineto +closepath stroke + 5.12 1.95 moveto + 5.18 2.12 lineto +closepath stroke + 5.17 1.60 moveto + 5.24 1.49 lineto +closepath stroke + 5.17 1.60 moveto + 5.29 1.77 lineto +closepath stroke + 5.24 1.49 moveto + 5.47 1.57 lineto +closepath stroke + 5.24 1.49 moveto + 5.33 1.38 lineto +closepath stroke + 5.29 1.77 moveto + 5.36 1.96 lineto +closepath stroke + 5.29 1.77 moveto + 5.45 1.86 lineto +closepath stroke + 5.41 1.25 moveto + 5.49 1.11 lineto +closepath stroke + 5.41 1.25 moveto + 5.33 1.38 lineto +closepath stroke + 5.49 1.11 moveto + 5.78 1.34 lineto +closepath stroke + 5.49 1.11 moveto + 5.71 1.00 lineto +closepath stroke + 5.33 1.38 moveto + 5.47 1.57 lineto +closepath stroke + 5.47 1.57 moveto + 5.56 1.78 lineto +closepath stroke + 5.47 1.57 moveto + 5.65 1.68 lineto +closepath stroke + 5.80 0.84 moveto + 6.00 0.61 lineto +closepath stroke + 5.80 0.84 moveto + 5.71 1.00 lineto +closepath stroke + 5.71 1.00 moveto + 5.78 1.34 lineto +closepath stroke + 5.78 1.34 moveto + 5.78 1.68 lineto +closepath stroke + 5.78 1.34 moveto + 6.00 1.56 lineto +closepath stroke + 4.66 2.95 moveto + 4.65 2.92 lineto +closepath stroke + 4.66 2.95 moveto + 4.59 2.97 lineto +closepath stroke + 4.45 2.77 moveto + 4.40 2.82 lineto +closepath stroke + 4.45 2.77 moveto + 4.51 2.79 lineto +closepath stroke + 4.45 2.77 moveto + 4.50 2.73 lineto +closepath stroke + 4.55 2.67 moveto + 4.50 2.73 lineto +closepath stroke + 4.55 2.67 moveto + 4.63 2.71 lineto +closepath stroke + 4.55 2.67 moveto + 4.62 2.63 lineto +closepath stroke + 4.50 2.73 moveto + 4.51 2.79 lineto +closepath stroke + 4.51 2.79 moveto + 4.55 2.82 lineto +closepath stroke + 4.51 2.79 moveto + 4.49 2.86 lineto +closepath stroke + 4.67 2.57 moveto + 4.62 2.63 lineto +closepath stroke + 4.67 2.57 moveto + 4.76 2.61 lineto +closepath stroke + 4.67 2.57 moveto + 4.74 2.52 lineto +closepath stroke + 4.62 2.63 moveto + 4.63 2.71 lineto +closepath stroke + 4.63 2.71 moveto + 4.68 2.74 lineto +closepath stroke + 4.63 2.71 moveto + 4.61 2.79 lineto +closepath stroke + 4.80 2.45 moveto + 4.74 2.52 lineto +closepath stroke + 4.80 2.45 moveto + 4.90 2.51 lineto +closepath stroke + 4.80 2.45 moveto + 4.87 2.40 lineto +closepath stroke + 4.74 2.52 moveto + 4.76 2.61 lineto +closepath stroke + 4.76 2.61 moveto + 4.82 2.66 lineto +closepath stroke + 4.76 2.61 moveto + 4.75 2.71 lineto +closepath stroke + 4.94 2.33 moveto + 4.87 2.40 lineto +closepath stroke + 4.94 2.33 moveto + 5.06 2.39 lineto +closepath stroke + 4.94 2.33 moveto + 5.02 2.27 lineto +closepath stroke + 4.87 2.40 moveto + 4.90 2.51 lineto +closepath stroke + 4.90 2.51 moveto + 4.97 2.57 lineto +closepath stroke + 4.90 2.51 moveto + 4.90 2.63 lineto +closepath stroke + 5.09 2.19 moveto + 5.02 2.27 lineto +closepath stroke + 5.09 2.19 moveto + 5.23 2.27 lineto +closepath stroke + 5.09 2.19 moveto + 5.18 2.12 lineto +closepath stroke + 5.02 2.27 moveto + 5.06 2.39 lineto +closepath stroke + 5.06 2.39 moveto + 5.14 2.47 lineto +closepath stroke + 5.06 2.39 moveto + 5.06 2.53 lineto +closepath stroke + 5.26 2.03 moveto + 5.18 2.12 lineto +closepath stroke + 5.26 2.03 moveto + 5.42 2.13 lineto +closepath stroke + 5.26 2.03 moveto + 5.36 1.96 lineto +closepath stroke + 5.18 2.12 moveto + 5.23 2.27 lineto +closepath stroke + 5.23 2.27 moveto + 5.33 2.36 lineto +closepath stroke + 5.23 2.27 moveto + 5.24 2.43 lineto +closepath stroke + 5.36 1.96 moveto + 5.45 1.86 lineto +closepath stroke + 5.36 1.96 moveto + 5.42 2.13 lineto +closepath stroke + 5.45 1.86 moveto + 5.63 1.98 lineto +closepath stroke + 5.45 1.86 moveto + 5.56 1.78 lineto +closepath stroke + 5.42 2.13 moveto + 5.54 2.24 lineto +closepath stroke + 5.42 2.13 moveto + 5.44 2.31 lineto +closepath stroke + 5.56 1.78 moveto + 5.65 1.68 lineto +closepath stroke + 5.56 1.78 moveto + 5.63 1.98 lineto +closepath stroke + 5.65 1.68 moveto + 5.87 1.90 lineto +closepath stroke + 5.65 1.68 moveto + 5.78 1.68 lineto +closepath stroke + 5.63 1.98 moveto + 5.76 2.19 lineto +closepath stroke + 5.63 1.98 moveto + 5.87 2.11 lineto +closepath stroke + 5.78 1.68 moveto + 6.00 1.56 lineto +closepath stroke + 5.78 1.68 moveto + 5.87 1.90 lineto +closepath stroke + 5.87 1.90 moveto + 6.00 2.11 lineto +closepath stroke + 5.87 1.90 moveto + 5.87 2.11 lineto +closepath stroke + 4.65 2.92 moveto + 4.59 2.97 lineto +closepath stroke + 4.65 2.92 moveto + 4.70 2.87 lineto +closepath stroke + 4.65 2.92 moveto + 4.62 2.88 lineto +closepath stroke + 4.70 2.87 moveto + 4.62 2.88 lineto +closepath stroke + 4.70 2.87 moveto + 4.74 2.79 lineto +closepath stroke + 4.62 2.88 moveto + 4.60 2.85 lineto +closepath stroke + 4.62 2.88 moveto + 4.56 2.91 lineto +closepath stroke + 4.55 2.82 moveto + 4.49 2.86 lineto +closepath stroke + 4.55 2.82 moveto + 4.60 2.85 lineto +closepath stroke + 4.55 2.82 moveto + 4.61 2.79 lineto +closepath stroke + 4.68 2.74 moveto + 4.61 2.79 lineto +closepath stroke + 4.68 2.74 moveto + 4.74 2.79 lineto +closepath stroke + 4.68 2.74 moveto + 4.75 2.71 lineto +closepath stroke + 4.61 2.79 moveto + 4.60 2.85 lineto +closepath stroke + 4.60 2.85 moveto + 4.56 2.91 lineto +closepath stroke + 4.82 2.66 moveto + 4.75 2.71 lineto +closepath stroke + 4.82 2.66 moveto + 4.90 2.63 lineto +closepath stroke + 4.75 2.71 moveto + 4.74 2.79 lineto +closepath stroke + 4.97 2.57 moveto + 4.90 2.63 lineto +closepath stroke + 4.97 2.57 moveto + 5.06 2.53 lineto +closepath stroke + 5.14 2.47 moveto + 5.06 2.53 lineto +closepath stroke + 5.14 2.47 moveto + 5.24 2.43 lineto +closepath stroke + 5.33 2.36 moveto + 5.24 2.43 lineto +closepath stroke + 5.33 2.36 moveto + 5.44 2.31 lineto +closepath stroke + 5.54 2.24 moveto + 5.44 2.31 lineto +closepath stroke + 5.54 2.24 moveto + 5.76 2.19 lineto +closepath stroke + 6.00 2.11 moveto + 5.87 2.11 lineto +closepath stroke + 5.87 2.11 moveto + 5.76 2.19 lineto +closepath stroke +showpage diff --git a/DOC/msh9.pdf b/DOC/msh9.pdf new file mode 100644 index 0000000..3500508 Binary files /dev/null and b/DOC/msh9.pdf differ diff --git a/DOC/msh9.ps b/DOC/msh9.ps new file mode 100644 index 0000000..df375bb --- /dev/null +++ b/DOC/msh9.ps @@ -0,0 +1,9353 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: PSPLTM routine +%%BoundingBox: 80 0 530 230 +%%EndComments +/cm {72 mul 2.54 div} def +/mc {72 div 2.54 mul} def +/pnum { 72 div 2.54 mul 20 string +cvs print ( ) print} def +/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def +gsave + /Helvetica findfont 4.54545E-02 cm scalefont setfont + 10.7950 cm 0.272727 cm moveto +( ) Cshow + 3.17500 cm 0.181818 cm translate + 15.2400 cm 11.0000 div dup scale + 0.01 setlinewidth + 0.00 0.00 moveto + 0.00 0.29 lineto +closepath stroke + 0.00 0.00 moveto + 0.13 0.29 lineto +closepath stroke + 0.00 0.00 moveto + 0.36 0.19 lineto +closepath stroke + 0.00 0.00 moveto + 0.36 0.00 lineto +closepath stroke + 11.00 0.00 moveto + 10.06 0.57 lineto +closepath stroke + 11.00 0.00 moveto + 11.00 0.47 lineto +closepath stroke + 11.00 0.00 moveto + 9.08 0.00 lineto +closepath stroke + 11.00 5.50 moveto + 11.00 5.03 lineto +closepath stroke + 11.00 5.50 moveto + 10.06 4.93 lineto +closepath stroke + 11.00 5.50 moveto + 9.08 5.50 lineto +closepath stroke + 0.00 5.50 moveto + 0.36 5.50 lineto +closepath stroke + 0.00 5.50 moveto + 0.36 5.31 lineto +closepath stroke + 0.00 5.50 moveto + 0.13 5.21 lineto +closepath stroke + 0.00 5.50 moveto + 0.00 5.21 lineto +closepath stroke + 2.10 2.75 moveto + 2.19 2.83 lineto +closepath stroke + 2.10 2.75 moveto + 2.20 2.75 lineto +closepath stroke + 2.10 2.75 moveto + 2.09 2.81 lineto +closepath stroke + 2.10 2.75 moveto + 2.19 2.67 lineto +closepath stroke + 2.10 2.75 moveto + 2.09 2.69 lineto +closepath stroke + 2.30 2.75 moveto + 2.20 2.75 lineto +closepath stroke + 2.30 2.75 moveto + 2.29 2.83 lineto +closepath stroke + 2.30 2.75 moveto + 2.40 2.86 lineto +closepath stroke + 2.30 2.75 moveto + 2.41 2.75 lineto +closepath stroke + 2.30 2.75 moveto + 2.29 2.67 lineto +closepath stroke + 2.30 2.75 moveto + 2.40 2.64 lineto +closepath stroke + 2.52 2.75 moveto + 2.41 2.75 lineto +closepath stroke + 2.52 2.75 moveto + 2.51 2.86 lineto +closepath stroke + 2.52 2.75 moveto + 2.63 2.88 lineto +closepath stroke + 2.52 2.75 moveto + 2.64 2.75 lineto +closepath stroke + 2.52 2.75 moveto + 2.51 2.64 lineto +closepath stroke + 2.52 2.75 moveto + 2.63 2.62 lineto +closepath stroke + 2.76 2.75 moveto + 2.64 2.75 lineto +closepath stroke + 2.76 2.75 moveto + 2.75 2.88 lineto +closepath stroke + 2.76 2.75 moveto + 2.88 2.91 lineto +closepath stroke + 2.76 2.75 moveto + 2.90 2.75 lineto +closepath stroke + 2.76 2.75 moveto + 2.75 2.62 lineto +closepath stroke + 2.76 2.75 moveto + 2.88 2.59 lineto +closepath stroke + 3.03 2.75 moveto + 2.90 2.75 lineto +closepath stroke + 3.03 2.75 moveto + 3.01 2.91 lineto +closepath stroke + 3.03 2.75 moveto + 3.15 2.94 lineto +closepath stroke + 3.03 2.75 moveto + 3.17 2.75 lineto +closepath stroke + 3.03 2.75 moveto + 3.01 2.59 lineto +closepath stroke + 3.03 2.75 moveto + 3.15 2.56 lineto +closepath stroke + 3.32 2.75 moveto + 3.17 2.75 lineto +closepath stroke + 3.32 2.75 moveto + 3.30 2.94 lineto +closepath stroke + 3.32 2.75 moveto + 3.46 2.97 lineto +closepath stroke + 3.32 2.75 moveto + 3.48 2.75 lineto +closepath stroke + 3.32 2.75 moveto + 3.30 2.56 lineto +closepath stroke + 3.32 2.75 moveto + 3.46 2.53 lineto +closepath stroke + 3.64 2.75 moveto + 3.48 2.75 lineto +closepath stroke + 3.64 2.75 moveto + 3.62 2.97 lineto +closepath stroke + 3.64 2.75 moveto + 3.79 3.01 lineto +closepath stroke + 3.64 2.75 moveto + 3.82 2.75 lineto +closepath stroke + 3.64 2.75 moveto + 3.62 2.53 lineto +closepath stroke + 3.64 2.75 moveto + 3.79 2.49 lineto +closepath stroke + 4.00 2.75 moveto + 3.82 2.75 lineto +closepath stroke + 4.00 2.75 moveto + 3.97 3.01 lineto +closepath stroke + 4.00 2.75 moveto + 4.16 3.05 lineto +closepath stroke + 4.00 2.75 moveto + 4.19 2.75 lineto +closepath stroke + 4.00 2.75 moveto + 3.97 2.49 lineto +closepath stroke + 4.00 2.75 moveto + 4.16 2.45 lineto +closepath stroke + 4.39 2.75 moveto + 4.19 2.75 lineto +closepath stroke + 4.39 2.75 moveto + 4.36 3.05 lineto +closepath stroke + 4.39 2.75 moveto + 4.57 3.09 lineto +closepath stroke + 4.39 2.75 moveto + 4.60 2.75 lineto +closepath stroke + 4.39 2.75 moveto + 4.36 2.45 lineto +closepath stroke + 4.39 2.75 moveto + 4.57 2.41 lineto +closepath stroke + 4.82 2.75 moveto + 4.60 2.75 lineto +closepath stroke + 4.82 2.75 moveto + 4.78 3.09 lineto +closepath stroke + 4.82 2.75 moveto + 5.01 3.14 lineto +closepath stroke + 4.82 2.75 moveto + 5.05 2.75 lineto +closepath stroke + 4.82 2.75 moveto + 4.78 2.41 lineto +closepath stroke + 4.82 2.75 moveto + 5.01 2.36 lineto +closepath stroke + 5.29 2.75 moveto + 5.05 2.75 lineto +closepath stroke + 5.29 2.75 moveto + 5.25 3.14 lineto +closepath stroke + 5.29 2.75 moveto + 5.50 3.20 lineto +closepath stroke + 5.29 2.75 moveto + 5.55 2.75 lineto +closepath stroke + 5.29 2.75 moveto + 5.50 2.30 lineto +closepath stroke + 5.29 2.75 moveto + 5.25 2.36 lineto +closepath stroke + 5.81 2.75 moveto + 5.76 3.20 lineto +closepath stroke + 5.81 2.75 moveto + 6.09 2.75 lineto +closepath stroke + 5.81 2.75 moveto + 5.55 2.75 lineto +closepath stroke + 5.81 2.75 moveto + 5.76 2.30 lineto +closepath stroke + 6.38 2.75 moveto + 6.09 2.75 lineto +closepath stroke + 6.38 2.75 moveto + 6.04 3.20 lineto +closepath stroke + 6.38 2.75 moveto + 6.32 3.26 lineto +closepath stroke + 6.38 2.75 moveto + 6.69 2.75 lineto +closepath stroke + 6.38 2.75 moveto + 6.32 2.24 lineto +closepath stroke + 6.38 2.75 moveto + 6.04 2.30 lineto +closepath stroke + 7.00 2.75 moveto + 6.69 2.75 lineto +closepath stroke + 7.00 2.75 moveto + 6.64 3.26 lineto +closepath stroke + 7.00 2.75 moveto + 6.94 3.32 lineto +closepath stroke + 7.00 2.75 moveto + 7.28 3.39 lineto +closepath stroke + 7.00 2.75 moveto + 7.35 2.75 lineto +closepath stroke + 7.00 2.75 moveto + 6.94 2.18 lineto +closepath stroke + 7.00 2.75 moveto + 6.64 2.24 lineto +closepath stroke + 7.69 2.75 moveto + 7.35 2.75 lineto +closepath stroke + 7.69 2.75 moveto + 7.63 3.39 lineto +closepath stroke + 7.69 2.75 moveto + 8.00 3.47 lineto +closepath stroke + 7.69 2.75 moveto + 8.07 2.75 lineto +closepath stroke + 7.69 2.75 moveto + 8.00 2.03 lineto +closepath stroke + 7.69 2.75 moveto + 7.63 2.11 lineto +closepath stroke + 7.69 2.75 moveto + 7.29 2.18 lineto +closepath stroke + 8.45 2.75 moveto + 8.07 2.75 lineto +closepath stroke + 8.45 2.75 moveto + 8.38 3.47 lineto +closepath stroke + 8.45 2.75 moveto + 8.79 3.56 lineto +closepath stroke + 8.45 2.75 moveto + 8.87 2.75 lineto +closepath stroke + 8.45 2.75 moveto + 8.79 1.94 lineto +closepath stroke + 8.45 2.75 moveto + 8.38 2.03 lineto +closepath stroke + 9.29 2.75 moveto + 8.87 2.75 lineto +closepath stroke + 9.29 2.75 moveto + 9.20 3.56 lineto +closepath stroke + 9.29 2.75 moveto + 10.14 3.66 lineto +closepath stroke + 9.29 2.75 moveto + 10.14 2.75 lineto +closepath stroke + 9.29 2.75 moveto + 10.14 1.84 lineto +closepath stroke + 9.29 2.75 moveto + 9.20 1.94 lineto +closepath stroke + 11.00 2.75 moveto + 10.14 2.75 lineto +closepath stroke + 11.00 2.75 moveto + 11.00 3.66 lineto +closepath stroke + 11.00 2.75 moveto + 11.00 1.84 lineto +closepath stroke + 2.09 2.87 moveto + 2.18 2.90 lineto +closepath stroke + 2.09 2.87 moveto + 2.09 2.81 lineto +closepath stroke + 2.09 2.87 moveto + 2.07 2.93 lineto +closepath stroke + 2.28 2.92 moveto + 2.29 2.83 lineto +closepath stroke + 2.28 2.92 moveto + 2.19 2.83 lineto +closepath stroke + 2.28 2.92 moveto + 2.18 2.90 lineto +closepath stroke + 2.28 2.92 moveto + 2.39 2.94 lineto +closepath stroke + 2.28 2.92 moveto + 2.17 2.96 lineto +closepath stroke + 2.28 2.92 moveto + 2.26 3.00 lineto +closepath stroke + 2.50 2.96 moveto + 2.51 2.86 lineto +closepath stroke + 2.50 2.96 moveto + 2.40 2.86 lineto +closepath stroke + 2.50 2.96 moveto + 2.39 2.94 lineto +closepath stroke + 2.50 2.96 moveto + 2.62 2.99 lineto +closepath stroke + 2.50 2.96 moveto + 2.36 3.02 lineto +closepath stroke + 2.50 2.96 moveto + 2.46 3.06 lineto +closepath stroke + 2.73 3.01 moveto + 2.75 2.88 lineto +closepath stroke + 2.73 3.01 moveto + 2.63 2.88 lineto +closepath stroke + 2.73 3.01 moveto + 2.62 2.99 lineto +closepath stroke + 2.73 3.01 moveto + 2.86 3.04 lineto +closepath stroke + 2.73 3.01 moveto + 2.58 3.09 lineto +closepath stroke + 2.73 3.01 moveto + 2.69 3.14 lineto +closepath stroke + 2.99 3.07 moveto + 3.01 2.91 lineto +closepath stroke + 2.99 3.07 moveto + 2.88 2.91 lineto +closepath stroke + 2.99 3.07 moveto + 2.86 3.04 lineto +closepath stroke + 2.99 3.07 moveto + 3.14 3.10 lineto +closepath stroke + 2.99 3.07 moveto + 2.82 3.17 lineto +closepath stroke + 2.99 3.07 moveto + 2.95 3.22 lineto +closepath stroke + 3.28 3.13 moveto + 3.30 2.94 lineto +closepath stroke + 3.28 3.13 moveto + 3.15 2.94 lineto +closepath stroke + 3.28 3.13 moveto + 3.14 3.10 lineto +closepath stroke + 3.28 3.13 moveto + 3.44 3.16 lineto +closepath stroke + 3.28 3.13 moveto + 3.09 3.25 lineto +closepath stroke + 3.28 3.13 moveto + 3.22 3.31 lineto +closepath stroke + 3.60 3.20 moveto + 3.62 2.97 lineto +closepath stroke + 3.60 3.20 moveto + 3.46 2.97 lineto +closepath stroke + 3.60 3.20 moveto + 3.44 3.16 lineto +closepath stroke + 3.60 3.20 moveto + 3.77 3.23 lineto +closepath stroke + 3.60 3.20 moveto + 3.38 3.34 lineto +closepath stroke + 3.60 3.20 moveto + 3.53 3.41 lineto +closepath stroke + 3.94 3.27 moveto + 3.97 3.01 lineto +closepath stroke + 3.94 3.27 moveto + 3.79 3.01 lineto +closepath stroke + 3.94 3.27 moveto + 3.77 3.23 lineto +closepath stroke + 3.94 3.27 moveto + 4.13 3.31 lineto +closepath stroke + 3.94 3.27 moveto + 3.70 3.45 lineto +closepath stroke + 3.94 3.27 moveto + 3.86 3.52 lineto +closepath stroke + 4.32 3.35 moveto + 4.36 3.05 lineto +closepath stroke + 4.32 3.35 moveto + 4.16 3.05 lineto +closepath stroke + 4.32 3.35 moveto + 4.13 3.31 lineto +closepath stroke + 4.32 3.35 moveto + 4.53 3.39 lineto +closepath stroke + 4.32 3.35 moveto + 4.05 3.56 lineto +closepath stroke + 4.32 3.35 moveto + 4.23 3.64 lineto +closepath stroke + 4.74 3.44 moveto + 4.78 3.09 lineto +closepath stroke + 4.74 3.44 moveto + 4.57 3.09 lineto +closepath stroke + 4.74 3.44 moveto + 4.53 3.39 lineto +closepath stroke + 4.74 3.44 moveto + 4.97 3.49 lineto +closepath stroke + 4.74 3.44 moveto + 4.44 3.68 lineto +closepath stroke + 4.74 3.44 moveto + 4.64 3.77 lineto +closepath stroke + 5.20 3.54 moveto + 5.25 3.14 lineto +closepath stroke + 5.20 3.54 moveto + 5.01 3.14 lineto +closepath stroke + 5.20 3.54 moveto + 4.97 3.49 lineto +closepath stroke + 5.20 3.54 moveto + 5.46 3.59 lineto +closepath stroke + 5.20 3.54 moveto + 4.87 3.82 lineto +closepath stroke + 5.20 3.54 moveto + 5.08 3.91 lineto +closepath stroke + 5.71 3.65 moveto + 6.04 3.20 lineto +closepath stroke + 5.71 3.65 moveto + 5.76 3.20 lineto +closepath stroke + 5.71 3.65 moveto + 5.50 3.20 lineto +closepath stroke + 5.71 3.65 moveto + 5.46 3.59 lineto +closepath stroke + 5.71 3.65 moveto + 5.99 3.70 lineto +closepath stroke + 5.71 3.65 moveto + 5.34 3.97 lineto +closepath stroke + 5.71 3.65 moveto + 5.57 4.07 lineto +closepath stroke + 6.27 3.76 moveto + 6.64 3.26 lineto +closepath stroke + 6.27 3.76 moveto + 6.32 3.26 lineto +closepath stroke + 6.27 3.76 moveto + 5.99 3.70 lineto +closepath stroke + 6.27 3.76 moveto + 6.58 3.83 lineto +closepath stroke + 6.27 3.76 moveto + 5.85 4.13 lineto +closepath stroke + 6.27 3.76 moveto + 6.11 4.25 lineto +closepath stroke + 6.88 3.89 moveto + 6.94 3.32 lineto +closepath stroke + 6.88 3.89 moveto + 6.58 3.83 lineto +closepath stroke + 6.88 3.89 moveto + 7.22 3.97 lineto +closepath stroke + 6.88 3.89 moveto + 6.42 4.31 lineto +closepath stroke + 6.88 3.89 moveto + 6.71 4.44 lineto +closepath stroke + 7.56 4.04 moveto + 7.63 3.39 lineto +closepath stroke + 7.56 4.04 moveto + 7.28 3.39 lineto +closepath stroke + 7.56 4.04 moveto + 7.22 3.97 lineto +closepath stroke + 7.56 4.04 moveto + 7.93 4.12 lineto +closepath stroke + 7.56 4.04 moveto + 7.04 4.51 lineto +closepath stroke + 7.56 4.04 moveto + 7.36 4.77 lineto +closepath stroke + 8.30 4.20 moveto + 8.38 3.47 lineto +closepath stroke + 8.30 4.20 moveto + 8.00 3.47 lineto +closepath stroke + 8.30 4.20 moveto + 7.93 4.12 lineto +closepath stroke + 8.30 4.20 moveto + 8.71 4.28 lineto +closepath stroke + 8.30 4.20 moveto + 7.73 4.85 lineto +closepath stroke + 9.12 4.37 moveto + 9.20 3.56 lineto +closepath stroke + 9.12 4.37 moveto + 8.79 3.56 lineto +closepath stroke + 9.12 4.37 moveto + 8.71 4.28 lineto +closepath stroke + 9.12 4.37 moveto + 10.06 4.93 lineto +closepath stroke + 9.12 4.37 moveto + 10.06 4.47 lineto +closepath stroke + 9.12 4.37 moveto + 8.14 4.93 lineto +closepath stroke + 11.00 4.56 moveto + 10.06 4.47 lineto +closepath stroke + 11.00 4.56 moveto + 11.00 5.03 lineto +closepath stroke + 11.00 4.56 moveto + 11.00 3.66 lineto +closepath stroke + 11.00 4.56 moveto + 10.14 3.66 lineto +closepath stroke + 2.05 2.99 moveto + 2.17 2.96 lineto +closepath stroke + 2.05 2.99 moveto + 2.07 2.93 lineto +closepath stroke + 2.05 2.99 moveto + 2.14 3.03 lineto +closepath stroke + 2.05 2.99 moveto + 2.10 3.11 lineto +closepath stroke + 2.05 2.99 moveto + 2.02 3.05 lineto +closepath stroke + 2.23 3.08 moveto + 2.36 3.02 lineto +closepath stroke + 2.23 3.08 moveto + 2.26 3.00 lineto +closepath stroke + 2.23 3.08 moveto + 2.14 3.03 lineto +closepath stroke + 2.23 3.08 moveto + 2.33 3.12 lineto +closepath stroke + 2.23 3.08 moveto + 2.19 3.15 lineto +closepath stroke + 2.23 3.08 moveto + 2.28 3.21 lineto +closepath stroke + 2.43 3.16 moveto + 2.58 3.09 lineto +closepath stroke + 2.43 3.16 moveto + 2.46 3.06 lineto +closepath stroke + 2.43 3.16 moveto + 2.33 3.12 lineto +closepath stroke + 2.43 3.16 moveto + 2.54 3.21 lineto +closepath stroke + 2.43 3.16 moveto + 2.38 3.26 lineto +closepath stroke + 2.43 3.16 moveto + 2.48 3.33 lineto +closepath stroke + 2.65 3.26 moveto + 2.82 3.17 lineto +closepath stroke + 2.65 3.26 moveto + 2.69 3.14 lineto +closepath stroke + 2.65 3.26 moveto + 2.54 3.21 lineto +closepath stroke + 2.65 3.26 moveto + 2.77 3.32 lineto +closepath stroke + 2.65 3.26 moveto + 2.59 3.38 lineto +closepath stroke + 2.65 3.26 moveto + 2.69 3.46 lineto +closepath stroke + 2.90 3.37 moveto + 3.09 3.25 lineto +closepath stroke + 2.90 3.37 moveto + 2.95 3.22 lineto +closepath stroke + 2.90 3.37 moveto + 2.77 3.32 lineto +closepath stroke + 2.90 3.37 moveto + 3.03 3.43 lineto +closepath stroke + 2.90 3.37 moveto + 2.82 3.51 lineto +closepath stroke + 2.90 3.37 moveto + 2.93 3.60 lineto +closepath stroke + 3.16 3.49 moveto + 3.38 3.34 lineto +closepath stroke + 3.16 3.49 moveto + 3.22 3.31 lineto +closepath stroke + 3.16 3.49 moveto + 3.03 3.43 lineto +closepath stroke + 3.16 3.49 moveto + 3.31 3.56 lineto +closepath stroke + 3.16 3.49 moveto + 3.07 3.66 lineto +closepath stroke + 3.16 3.49 moveto + 3.20 3.75 lineto +closepath stroke + 3.46 3.62 moveto + 3.70 3.45 lineto +closepath stroke + 3.46 3.62 moveto + 3.53 3.41 lineto +closepath stroke + 3.46 3.62 moveto + 3.31 3.56 lineto +closepath stroke + 3.46 3.62 moveto + 3.62 3.69 lineto +closepath stroke + 3.46 3.62 moveto + 3.35 3.82 lineto +closepath stroke + 3.78 3.77 moveto + 4.05 3.56 lineto +closepath stroke + 3.78 3.77 moveto + 3.86 3.52 lineto +closepath stroke + 3.78 3.77 moveto + 3.62 3.69 lineto +closepath stroke + 3.78 3.77 moveto + 3.96 3.85 lineto +closepath stroke + 3.78 3.77 moveto + 3.51 3.89 lineto +closepath stroke + 3.78 3.77 moveto + 3.65 3.99 lineto +closepath stroke + 3.78 3.77 moveto + 3.81 4.11 lineto +closepath stroke + 4.14 3.92 moveto + 4.44 3.68 lineto +closepath stroke + 4.14 3.92 moveto + 4.23 3.64 lineto +closepath stroke + 4.14 3.92 moveto + 3.96 3.85 lineto +closepath stroke + 4.14 3.92 moveto + 4.33 4.01 lineto +closepath stroke + 4.14 3.92 moveto + 3.99 4.19 lineto +closepath stroke + 4.14 3.92 moveto + 4.16 4.31 lineto +closepath stroke + 4.53 4.10 moveto + 4.87 3.82 lineto +closepath stroke + 4.53 4.10 moveto + 4.64 3.77 lineto +closepath stroke + 4.53 4.10 moveto + 4.33 4.01 lineto +closepath stroke + 4.53 4.10 moveto + 4.74 4.19 lineto +closepath stroke + 4.53 4.10 moveto + 4.36 4.40 lineto +closepath stroke + 4.53 4.10 moveto + 4.55 4.54 lineto +closepath stroke + 4.96 4.29 moveto + 5.34 3.97 lineto +closepath stroke + 4.96 4.29 moveto + 5.08 3.91 lineto +closepath stroke + 4.96 4.29 moveto + 4.74 4.19 lineto +closepath stroke + 4.96 4.29 moveto + 5.20 4.40 lineto +closepath stroke + 4.96 4.29 moveto + 4.76 4.63 lineto +closepath stroke + 5.43 4.50 moveto + 5.85 4.13 lineto +closepath stroke + 5.43 4.50 moveto + 5.57 4.07 lineto +closepath stroke + 5.43 4.50 moveto + 5.20 4.40 lineto +closepath stroke + 5.43 4.50 moveto + 5.69 4.62 lineto +closepath stroke + 5.43 4.50 moveto + 5.00 4.74 lineto +closepath stroke + 5.43 4.50 moveto + 5.21 5.00 lineto +closepath stroke + 5.96 4.73 moveto + 6.42 4.31 lineto +closepath stroke + 5.96 4.73 moveto + 6.11 4.25 lineto +closepath stroke + 5.96 4.73 moveto + 5.69 4.62 lineto +closepath stroke + 5.96 4.73 moveto + 6.24 4.86 lineto +closepath stroke + 5.96 4.73 moveto + 5.47 5.12 lineto +closepath stroke + 6.53 4.99 moveto + 7.04 4.51 lineto +closepath stroke + 6.53 4.99 moveto + 6.71 4.44 lineto +closepath stroke + 6.53 4.99 moveto + 6.24 4.86 lineto +closepath stroke + 6.53 4.99 moveto + 6.84 5.24 lineto +closepath stroke + 6.53 4.99 moveto + 5.76 5.24 lineto +closepath stroke + 7.16 5.50 moveto + 9.08 5.50 lineto +closepath stroke + 7.16 5.50 moveto + 8.14 4.93 lineto +closepath stroke + 7.16 5.50 moveto + 7.73 4.85 lineto +closepath stroke + 7.16 5.50 moveto + 7.36 4.77 lineto +closepath stroke + 7.16 5.50 moveto + 6.84 5.24 lineto +closepath stroke + 7.16 5.50 moveto + 6.07 5.50 lineto +closepath stroke + 1.99 3.10 moveto + 2.07 3.16 lineto +closepath stroke + 1.99 3.10 moveto + 2.02 3.05 lineto +closepath stroke + 1.99 3.10 moveto + 2.01 3.22 lineto +closepath stroke + 1.99 3.10 moveto + 1.94 3.15 lineto +closepath stroke + 2.15 3.22 moveto + 2.19 3.15 lineto +closepath stroke + 2.15 3.22 moveto + 2.10 3.11 lineto +closepath stroke + 2.15 3.22 moveto + 2.07 3.16 lineto +closepath stroke + 2.15 3.22 moveto + 2.24 3.28 lineto +closepath stroke + 2.15 3.22 moveto + 2.09 3.28 lineto +closepath stroke + 2.15 3.22 moveto + 2.16 3.36 lineto +closepath stroke + 2.33 3.35 moveto + 2.38 3.26 lineto +closepath stroke + 2.33 3.35 moveto + 2.28 3.21 lineto +closepath stroke + 2.33 3.35 moveto + 2.24 3.28 lineto +closepath stroke + 2.33 3.35 moveto + 2.42 3.42 lineto +closepath stroke + 2.33 3.35 moveto + 2.25 3.43 lineto +closepath stroke + 2.33 3.35 moveto + 2.33 3.52 lineto +closepath stroke + 2.52 3.49 moveto + 2.59 3.38 lineto +closepath stroke + 2.52 3.49 moveto + 2.48 3.33 lineto +closepath stroke + 2.52 3.49 moveto + 2.42 3.42 lineto +closepath stroke + 2.52 3.49 moveto + 2.63 3.57 lineto +closepath stroke + 2.52 3.49 moveto + 2.43 3.59 lineto +closepath stroke + 2.52 3.49 moveto + 2.52 3.69 lineto +closepath stroke + 2.74 3.65 moveto + 2.82 3.51 lineto +closepath stroke + 2.74 3.65 moveto + 2.69 3.46 lineto +closepath stroke + 2.74 3.65 moveto + 2.63 3.57 lineto +closepath stroke + 2.74 3.65 moveto + 2.85 3.73 lineto +closepath stroke + 2.74 3.65 moveto + 2.63 3.77 lineto +closepath stroke + 2.74 3.65 moveto + 2.73 3.88 lineto +closepath stroke + 2.97 3.82 moveto + 3.07 3.66 lineto +closepath stroke + 2.97 3.82 moveto + 2.93 3.60 lineto +closepath stroke + 2.97 3.82 moveto + 2.85 3.73 lineto +closepath stroke + 2.97 3.82 moveto + 3.10 3.92 lineto +closepath stroke + 2.97 3.82 moveto + 2.85 3.96 lineto +closepath stroke + 2.97 3.82 moveto + 2.95 4.08 lineto +closepath stroke + 3.23 4.01 moveto + 3.51 3.89 lineto +closepath stroke + 3.23 4.01 moveto + 3.35 3.82 lineto +closepath stroke + 3.23 4.01 moveto + 3.20 3.75 lineto +closepath stroke + 3.23 4.01 moveto + 3.10 3.92 lineto +closepath stroke + 3.23 4.01 moveto + 3.38 4.11 lineto +closepath stroke + 3.23 4.01 moveto + 3.08 4.18 lineto +closepath stroke + 3.52 4.22 moveto + 3.65 3.99 lineto +closepath stroke + 3.52 4.22 moveto + 3.38 4.11 lineto +closepath stroke + 3.52 4.22 moveto + 3.68 4.33 lineto +closepath stroke + 3.52 4.22 moveto + 3.23 4.28 lineto +closepath stroke + 3.52 4.22 moveto + 3.35 4.41 lineto +closepath stroke + 3.84 4.45 moveto + 3.99 4.19 lineto +closepath stroke + 3.84 4.45 moveto + 3.81 4.11 lineto +closepath stroke + 3.84 4.45 moveto + 3.68 4.33 lineto +closepath stroke + 3.84 4.45 moveto + 4.01 4.57 lineto +closepath stroke + 3.84 4.45 moveto + 3.50 4.53 lineto +closepath stroke + 3.84 4.45 moveto + 3.63 4.67 lineto +closepath stroke + 4.18 4.70 moveto + 4.36 4.40 lineto +closepath stroke + 4.18 4.70 moveto + 4.16 4.31 lineto +closepath stroke + 4.18 4.70 moveto + 4.01 4.57 lineto +closepath stroke + 4.18 4.70 moveto + 4.37 4.84 lineto +closepath stroke + 4.18 4.70 moveto + 3.81 4.80 lineto +closepath stroke + 4.18 4.70 moveto + 3.95 5.10 lineto +closepath stroke + 4.56 4.98 moveto + 4.76 4.63 lineto +closepath stroke + 4.56 4.98 moveto + 4.55 4.54 lineto +closepath stroke + 4.56 4.98 moveto + 4.37 4.84 lineto +closepath stroke + 4.56 4.98 moveto + 5.00 4.74 lineto +closepath stroke + 4.56 4.98 moveto + 4.77 5.24 lineto +closepath stroke + 4.56 4.98 moveto + 4.14 5.24 lineto +closepath stroke + 4.98 5.50 moveto + 5.76 5.24 lineto +closepath stroke + 4.98 5.50 moveto + 5.47 5.12 lineto +closepath stroke + 4.98 5.50 moveto + 6.07 5.50 lineto +closepath stroke + 4.98 5.50 moveto + 5.21 5.00 lineto +closepath stroke + 4.98 5.50 moveto + 4.77 5.24 lineto +closepath stroke + 4.98 5.50 moveto + 4.35 5.50 lineto +closepath stroke + 1.90 3.20 moveto + 1.97 3.27 lineto +closepath stroke + 1.90 3.20 moveto + 1.94 3.15 lineto +closepath stroke + 1.90 3.20 moveto + 1.90 3.32 lineto +closepath stroke + 1.90 3.20 moveto + 1.85 3.23 lineto +closepath stroke + 2.04 3.34 moveto + 2.09 3.28 lineto +closepath stroke + 2.04 3.34 moveto + 2.01 3.22 lineto +closepath stroke + 2.04 3.34 moveto + 1.97 3.27 lineto +closepath stroke + 2.04 3.34 moveto + 2.11 3.43 lineto +closepath stroke + 2.04 3.34 moveto + 1.97 3.39 lineto +closepath stroke + 2.18 3.51 moveto + 2.25 3.43 lineto +closepath stroke + 2.18 3.51 moveto + 2.16 3.36 lineto +closepath stroke + 2.18 3.51 moveto + 2.11 3.43 lineto +closepath stroke + 2.18 3.51 moveto + 2.26 3.60 lineto +closepath stroke + 2.18 3.51 moveto + 2.04 3.48 lineto +closepath stroke + 2.18 3.51 moveto + 2.10 3.57 lineto +closepath stroke + 2.18 3.51 moveto + 2.16 3.68 lineto +closepath stroke + 2.34 3.69 moveto + 2.43 3.59 lineto +closepath stroke + 2.34 3.69 moveto + 2.33 3.52 lineto +closepath stroke + 2.34 3.69 moveto + 2.26 3.60 lineto +closepath stroke + 2.34 3.69 moveto + 2.43 3.79 lineto +closepath stroke + 2.34 3.69 moveto + 2.24 3.77 lineto +closepath stroke + 2.52 3.89 moveto + 2.63 3.77 lineto +closepath stroke + 2.52 3.89 moveto + 2.52 3.69 lineto +closepath stroke + 2.52 3.89 moveto + 2.43 3.79 lineto +closepath stroke + 2.52 3.89 moveto + 2.62 3.99 lineto +closepath stroke + 2.52 3.89 moveto + 2.33 3.86 lineto +closepath stroke + 2.52 3.89 moveto + 2.39 3.98 lineto +closepath stroke + 2.72 4.10 moveto + 2.85 3.96 lineto +closepath stroke + 2.72 4.10 moveto + 2.73 3.88 lineto +closepath stroke + 2.72 4.10 moveto + 2.62 3.99 lineto +closepath stroke + 2.72 4.10 moveto + 2.83 4.22 lineto +closepath stroke + 2.72 4.10 moveto + 2.49 4.09 lineto +closepath stroke + 2.72 4.10 moveto + 2.56 4.22 lineto +closepath stroke + 2.93 4.34 moveto + 3.23 4.28 lineto +closepath stroke + 2.93 4.34 moveto + 3.08 4.18 lineto +closepath stroke + 2.93 4.34 moveto + 2.95 4.08 lineto +closepath stroke + 2.93 4.34 moveto + 2.83 4.22 lineto +closepath stroke + 2.93 4.34 moveto + 3.05 4.47 lineto +closepath stroke + 2.93 4.34 moveto + 2.67 4.33 lineto +closepath stroke + 2.93 4.34 moveto + 2.75 4.47 lineto +closepath stroke + 2.93 4.34 moveto + 2.84 4.63 lineto +closepath stroke + 3.17 4.61 moveto + 3.50 4.53 lineto +closepath stroke + 3.17 4.61 moveto + 3.35 4.41 lineto +closepath stroke + 3.17 4.61 moveto + 3.05 4.47 lineto +closepath stroke + 3.17 4.61 moveto + 3.30 4.75 lineto +closepath stroke + 3.17 4.61 moveto + 2.96 4.76 lineto +closepath stroke + 3.43 4.90 moveto + 3.81 4.80 lineto +closepath stroke + 3.43 4.90 moveto + 3.63 4.67 lineto +closepath stroke + 3.43 4.90 moveto + 3.30 4.75 lineto +closepath stroke + 3.43 4.90 moveto + 3.58 5.20 lineto +closepath stroke + 3.43 4.90 moveto + 3.09 4.90 lineto +closepath stroke + 3.43 4.90 moveto + 3.19 5.20 lineto +closepath stroke + 3.72 5.50 moveto + 4.14 5.24 lineto +closepath stroke + 3.72 5.50 moveto + 3.95 5.10 lineto +closepath stroke + 3.72 5.50 moveto + 3.58 5.20 lineto +closepath stroke + 3.72 5.50 moveto + 4.35 5.50 lineto +closepath stroke + 3.72 5.50 moveto + 3.33 5.50 lineto +closepath stroke + 1.80 3.27 moveto + 1.85 3.36 lineto +closepath stroke + 1.80 3.27 moveto + 1.85 3.23 lineto +closepath stroke + 1.80 3.27 moveto + 1.77 3.39 lineto +closepath stroke + 1.80 3.27 moveto + 1.74 3.30 lineto +closepath stroke + 1.90 3.44 moveto + 1.97 3.39 lineto +closepath stroke + 1.90 3.44 moveto + 1.90 3.32 lineto +closepath stroke + 1.90 3.44 moveto + 1.85 3.36 lineto +closepath stroke + 1.90 3.44 moveto + 2.04 3.48 lineto +closepath stroke + 1.90 3.44 moveto + 1.95 3.54 lineto +closepath stroke + 1.90 3.44 moveto + 1.82 3.48 lineto +closepath stroke + 2.01 3.63 moveto + 2.10 3.57 lineto +closepath stroke + 2.01 3.63 moveto + 1.95 3.54 lineto +closepath stroke + 2.01 3.63 moveto + 2.07 3.74 lineto +closepath stroke + 2.01 3.63 moveto + 1.88 3.57 lineto +closepath stroke + 2.01 3.63 moveto + 1.91 3.68 lineto +closepath stroke + 2.13 3.84 moveto + 2.33 3.86 lineto +closepath stroke + 2.13 3.84 moveto + 2.24 3.77 lineto +closepath stroke + 2.13 3.84 moveto + 2.16 3.68 lineto +closepath stroke + 2.13 3.84 moveto + 2.07 3.74 lineto +closepath stroke + 2.13 3.84 moveto + 2.20 3.96 lineto +closepath stroke + 2.13 3.84 moveto + 1.97 3.78 lineto +closepath stroke + 2.13 3.84 moveto + 2.01 3.90 lineto +closepath stroke + 2.26 4.07 moveto + 2.49 4.09 lineto +closepath stroke + 2.26 4.07 moveto + 2.39 3.98 lineto +closepath stroke + 2.26 4.07 moveto + 2.20 3.96 lineto +closepath stroke + 2.26 4.07 moveto + 2.34 4.20 lineto +closepath stroke + 2.26 4.07 moveto + 2.08 4.01 lineto +closepath stroke + 2.26 4.07 moveto + 2.12 4.14 lineto +closepath stroke + 2.26 4.07 moveto + 2.16 4.28 lineto +closepath stroke + 2.41 4.33 moveto + 2.67 4.33 lineto +closepath stroke + 2.41 4.33 moveto + 2.56 4.22 lineto +closepath stroke + 2.41 4.33 moveto + 2.34 4.20 lineto +closepath stroke + 2.41 4.33 moveto + 2.49 4.47 lineto +closepath stroke + 2.41 4.33 moveto + 2.24 4.40 lineto +closepath stroke + 2.41 4.33 moveto + 2.29 4.56 lineto +closepath stroke + 2.57 4.61 moveto + 2.75 4.47 lineto +closepath stroke + 2.57 4.61 moveto + 2.49 4.47 lineto +closepath stroke + 2.57 4.61 moveto + 2.66 4.76 lineto +closepath stroke + 2.57 4.61 moveto + 2.37 4.70 lineto +closepath stroke + 2.57 4.61 moveto + 2.42 4.87 lineto +closepath stroke + 2.75 4.91 moveto + 3.09 4.90 lineto +closepath stroke + 2.75 4.91 moveto + 2.96 4.76 lineto +closepath stroke + 2.75 4.91 moveto + 2.84 4.63 lineto +closepath stroke + 2.75 4.91 moveto + 2.66 4.76 lineto +closepath stroke + 2.75 4.91 moveto + 2.85 5.21 lineto +closepath stroke + 2.75 4.91 moveto + 2.51 5.02 lineto +closepath stroke + 2.94 5.50 moveto + 3.19 5.20 lineto +closepath stroke + 2.94 5.50 moveto + 2.85 5.21 lineto +closepath stroke + 2.94 5.50 moveto + 3.33 5.50 lineto +closepath stroke + 2.94 5.50 moveto + 2.61 5.31 lineto +closepath stroke + 2.94 5.50 moveto + 2.61 5.50 lineto +closepath stroke + 1.69 3.32 moveto + 1.72 3.42 lineto +closepath stroke + 1.69 3.32 moveto + 1.74 3.30 lineto +closepath stroke + 1.69 3.32 moveto + 1.62 3.33 lineto +closepath stroke + 1.75 3.51 moveto + 1.82 3.48 lineto +closepath stroke + 1.75 3.51 moveto + 1.77 3.39 lineto +closepath stroke + 1.75 3.51 moveto + 1.72 3.42 lineto +closepath stroke + 1.75 3.51 moveto + 1.88 3.57 lineto +closepath stroke + 1.75 3.51 moveto + 1.78 3.62 lineto +closepath stroke + 1.75 3.51 moveto + 1.65 3.43 lineto +closepath stroke + 1.75 3.51 moveto + 1.67 3.53 lineto +closepath stroke + 1.82 3.72 moveto + 1.97 3.78 lineto +closepath stroke + 1.82 3.72 moveto + 1.91 3.68 lineto +closepath stroke + 1.82 3.72 moveto + 1.78 3.62 lineto +closepath stroke + 1.82 3.72 moveto + 1.85 3.84 lineto +closepath stroke + 1.82 3.72 moveto + 1.70 3.63 lineto +closepath stroke + 1.82 3.72 moveto + 1.71 3.74 lineto +closepath stroke + 1.89 3.95 moveto + 2.08 4.01 lineto +closepath stroke + 1.89 3.95 moveto + 2.01 3.90 lineto +closepath stroke + 1.89 3.95 moveto + 1.85 3.84 lineto +closepath stroke + 1.89 3.95 moveto + 1.93 4.08 lineto +closepath stroke + 1.89 3.95 moveto + 1.75 3.86 lineto +closepath stroke + 1.89 3.95 moveto + 1.76 3.98 lineto +closepath stroke + 1.89 3.95 moveto + 1.77 4.11 lineto +closepath stroke + 1.97 4.20 moveto + 2.12 4.14 lineto +closepath stroke + 1.97 4.20 moveto + 1.93 4.08 lineto +closepath stroke + 1.97 4.20 moveto + 2.02 4.34 lineto +closepath stroke + 1.97 4.20 moveto + 1.82 4.24 lineto +closepath stroke + 1.97 4.20 moveto + 1.83 4.38 lineto +closepath stroke + 2.06 4.48 moveto + 2.24 4.40 lineto +closepath stroke + 2.06 4.48 moveto + 2.16 4.28 lineto +closepath stroke + 2.06 4.48 moveto + 2.02 4.34 lineto +closepath stroke + 2.06 4.48 moveto + 2.11 4.64 lineto +closepath stroke + 2.06 4.48 moveto + 1.88 4.52 lineto +closepath stroke + 2.06 4.48 moveto + 1.89 4.68 lineto +closepath stroke + 2.16 4.79 moveto + 2.37 4.70 lineto +closepath stroke + 2.16 4.79 moveto + 2.29 4.56 lineto +closepath stroke + 2.16 4.79 moveto + 2.11 4.64 lineto +closepath stroke + 2.16 4.79 moveto + 2.22 4.96 lineto +closepath stroke + 2.16 4.79 moveto + 1.94 4.83 lineto +closepath stroke + 2.27 5.13 moveto + 2.61 5.31 lineto +closepath stroke + 2.27 5.13 moveto + 2.51 5.02 lineto +closepath stroke + 2.27 5.13 moveto + 2.42 4.87 lineto +closepath stroke + 2.27 5.13 moveto + 2.22 4.96 lineto +closepath stroke + 2.27 5.13 moveto + 2.27 5.31 lineto +closepath stroke + 2.27 5.13 moveto + 2.00 5.00 lineto +closepath stroke + 2.27 5.13 moveto + 2.02 5.31 lineto +closepath stroke + 2.27 5.50 moveto + 2.61 5.50 lineto +closepath stroke + 2.27 5.50 moveto + 2.27 5.31 lineto +closepath stroke + 2.27 5.50 moveto + 2.02 5.50 lineto +closepath stroke + 1.56 3.35 moveto + 1.65 3.43 lineto +closepath stroke + 1.56 3.35 moveto + 1.62 3.33 lineto +closepath stroke + 1.56 3.35 moveto + 1.57 3.45 lineto +closepath stroke + 1.56 3.35 moveto + 1.49 3.45 lineto +closepath stroke + 1.56 3.35 moveto + 1.50 3.35 lineto +closepath stroke + 1.58 3.55 moveto + 1.70 3.63 lineto +closepath stroke + 1.58 3.55 moveto + 1.67 3.53 lineto +closepath stroke + 1.58 3.55 moveto + 1.57 3.45 lineto +closepath stroke + 1.58 3.55 moveto + 1.60 3.66 lineto +closepath stroke + 1.58 3.55 moveto + 1.50 3.55 lineto +closepath stroke + 1.58 3.55 moveto + 1.49 3.66 lineto +closepath stroke + 1.61 3.76 moveto + 1.75 3.86 lineto +closepath stroke + 1.61 3.76 moveto + 1.71 3.74 lineto +closepath stroke + 1.61 3.76 moveto + 1.60 3.66 lineto +closepath stroke + 1.61 3.76 moveto + 1.62 3.88 lineto +closepath stroke + 1.61 3.76 moveto + 1.50 3.76 lineto +closepath stroke + 1.61 3.76 moveto + 1.49 3.88 lineto +closepath stroke + 1.63 4.01 moveto + 1.76 3.98 lineto +closepath stroke + 1.63 4.01 moveto + 1.62 3.88 lineto +closepath stroke + 1.63 4.01 moveto + 1.65 4.14 lineto +closepath stroke + 1.63 4.01 moveto + 1.50 4.01 lineto +closepath stroke + 1.63 4.01 moveto + 1.49 4.14 lineto +closepath stroke + 1.66 4.27 moveto + 1.82 4.24 lineto +closepath stroke + 1.66 4.27 moveto + 1.77 4.11 lineto +closepath stroke + 1.66 4.27 moveto + 1.65 4.14 lineto +closepath stroke + 1.66 4.27 moveto + 1.68 4.42 lineto +closepath stroke + 1.66 4.27 moveto + 1.50 4.27 lineto +closepath stroke + 1.69 4.56 moveto + 1.88 4.52 lineto +closepath stroke + 1.69 4.56 moveto + 1.83 4.38 lineto +closepath stroke + 1.69 4.56 moveto + 1.68 4.42 lineto +closepath stroke + 1.69 4.56 moveto + 1.71 4.72 lineto +closepath stroke + 1.69 4.56 moveto + 1.52 4.42 lineto +closepath stroke + 1.69 4.56 moveto + 1.50 4.56 lineto +closepath stroke + 1.72 4.88 moveto + 2.00 5.00 lineto +closepath stroke + 1.72 4.88 moveto + 1.94 4.83 lineto +closepath stroke + 1.72 4.88 moveto + 1.89 4.68 lineto +closepath stroke + 1.72 4.88 moveto + 1.71 4.72 lineto +closepath stroke + 1.72 4.88 moveto + 1.74 5.19 lineto +closepath stroke + 1.72 4.88 moveto + 1.52 4.72 lineto +closepath stroke + 1.72 4.88 moveto + 1.50 4.88 lineto +closepath stroke + 1.76 5.50 moveto + 2.02 5.50 lineto +closepath stroke + 1.76 5.50 moveto + 2.02 5.31 lineto +closepath stroke + 1.76 5.50 moveto + 1.74 5.19 lineto +closepath stroke + 1.76 5.50 moveto + 1.52 5.19 lineto +closepath stroke + 1.76 5.50 moveto + 1.50 5.50 lineto +closepath stroke + 1.44 3.35 moveto + 1.43 3.45 lineto +closepath stroke + 1.44 3.35 moveto + 1.50 3.35 lineto +closepath stroke + 1.44 3.35 moveto + 1.38 3.33 lineto +closepath stroke + 1.42 3.55 moveto + 1.50 3.55 lineto +closepath stroke + 1.42 3.55 moveto + 1.49 3.45 lineto +closepath stroke + 1.42 3.55 moveto + 1.43 3.45 lineto +closepath stroke + 1.42 3.55 moveto + 1.40 3.66 lineto +closepath stroke + 1.42 3.55 moveto + 1.37 3.43 lineto +closepath stroke + 1.42 3.55 moveto + 1.33 3.53 lineto +closepath stroke + 1.39 3.76 moveto + 1.50 3.76 lineto +closepath stroke + 1.39 3.76 moveto + 1.49 3.66 lineto +closepath stroke + 1.39 3.76 moveto + 1.40 3.66 lineto +closepath stroke + 1.39 3.76 moveto + 1.38 3.88 lineto +closepath stroke + 1.39 3.76 moveto + 1.32 3.64 lineto +closepath stroke + 1.39 3.76 moveto + 1.29 3.74 lineto +closepath stroke + 1.37 4.01 moveto + 1.50 4.01 lineto +closepath stroke + 1.37 4.01 moveto + 1.49 3.88 lineto +closepath stroke + 1.37 4.01 moveto + 1.38 3.88 lineto +closepath stroke + 1.37 4.01 moveto + 1.35 4.14 lineto +closepath stroke + 1.37 4.01 moveto + 1.28 3.86 lineto +closepath stroke + 1.37 4.01 moveto + 1.24 3.98 lineto +closepath stroke + 1.34 4.27 moveto + 1.52 4.42 lineto +closepath stroke + 1.34 4.27 moveto + 1.50 4.27 lineto +closepath stroke + 1.34 4.27 moveto + 1.49 4.14 lineto +closepath stroke + 1.34 4.27 moveto + 1.35 4.14 lineto +closepath stroke + 1.34 4.27 moveto + 1.32 4.42 lineto +closepath stroke + 1.34 4.27 moveto + 1.23 4.11 lineto +closepath stroke + 1.34 4.27 moveto + 1.18 4.24 lineto +closepath stroke + 1.31 4.56 moveto + 1.52 4.72 lineto +closepath stroke + 1.31 4.56 moveto + 1.50 4.56 lineto +closepath stroke + 1.31 4.56 moveto + 1.32 4.42 lineto +closepath stroke + 1.31 4.56 moveto + 1.29 4.72 lineto +closepath stroke + 1.31 4.56 moveto + 1.17 4.38 lineto +closepath stroke + 1.31 4.56 moveto + 1.12 4.52 lineto +closepath stroke + 1.31 4.56 moveto + 1.07 4.67 lineto +closepath stroke + 1.28 4.88 moveto + 1.52 5.19 lineto +closepath stroke + 1.28 4.88 moveto + 1.50 4.88 lineto +closepath stroke + 1.28 4.88 moveto + 1.29 4.72 lineto +closepath stroke + 1.28 4.88 moveto + 1.26 5.19 lineto +closepath stroke + 1.28 4.88 moveto + 1.06 4.83 lineto +closepath stroke + 1.28 4.88 moveto + 1.00 5.00 lineto +closepath stroke + 1.24 5.50 moveto + 1.50 5.50 lineto +closepath stroke + 1.24 5.50 moveto + 1.26 5.19 lineto +closepath stroke + 1.24 5.50 moveto + 0.98 5.31 lineto +closepath stroke + 1.24 5.50 moveto + 0.98 5.50 lineto +closepath stroke + 1.31 3.32 moveto + 1.37 3.43 lineto +closepath stroke + 1.31 3.32 moveto + 1.38 3.33 lineto +closepath stroke + 1.31 3.32 moveto + 1.28 3.42 lineto +closepath stroke + 1.31 3.32 moveto + 1.21 3.38 lineto +closepath stroke + 1.31 3.32 moveto + 1.26 3.30 lineto +closepath stroke + 1.25 3.51 moveto + 1.32 3.64 lineto +closepath stroke + 1.25 3.51 moveto + 1.33 3.53 lineto +closepath stroke + 1.25 3.51 moveto + 1.28 3.42 lineto +closepath stroke + 1.25 3.51 moveto + 1.22 3.62 lineto +closepath stroke + 1.25 3.51 moveto + 1.18 3.48 lineto +closepath stroke + 1.25 3.51 moveto + 1.12 3.57 lineto +closepath stroke + 1.18 3.72 moveto + 1.28 3.86 lineto +closepath stroke + 1.18 3.72 moveto + 1.29 3.74 lineto +closepath stroke + 1.18 3.72 moveto + 1.22 3.62 lineto +closepath stroke + 1.18 3.72 moveto + 1.15 3.84 lineto +closepath stroke + 1.18 3.72 moveto + 1.09 3.68 lineto +closepath stroke + 1.18 3.72 moveto + 1.03 3.78 lineto +closepath stroke + 1.11 3.95 moveto + 1.23 4.11 lineto +closepath stroke + 1.11 3.95 moveto + 1.24 3.98 lineto +closepath stroke + 1.11 3.95 moveto + 1.15 3.84 lineto +closepath stroke + 1.11 3.95 moveto + 1.07 4.08 lineto +closepath stroke + 1.11 3.95 moveto + 0.99 3.90 lineto +closepath stroke + 1.11 3.95 moveto + 0.92 4.01 lineto +closepath stroke + 1.03 4.20 moveto + 1.17 4.38 lineto +closepath stroke + 1.03 4.20 moveto + 1.18 4.24 lineto +closepath stroke + 1.03 4.20 moveto + 1.07 4.08 lineto +closepath stroke + 1.03 4.20 moveto + 0.98 4.34 lineto +closepath stroke + 1.03 4.20 moveto + 0.88 4.14 lineto +closepath stroke + 1.03 4.20 moveto + 0.81 4.27 lineto +closepath stroke + 0.94 4.48 moveto + 1.12 4.52 lineto +closepath stroke + 0.94 4.48 moveto + 0.98 4.34 lineto +closepath stroke + 0.94 4.48 moveto + 0.89 4.64 lineto +closepath stroke + 0.94 4.48 moveto + 0.76 4.40 lineto +closepath stroke + 0.84 4.79 moveto + 1.06 4.83 lineto +closepath stroke + 0.84 4.79 moveto + 1.07 4.67 lineto +closepath stroke + 0.84 4.79 moveto + 0.89 4.64 lineto +closepath stroke + 0.84 4.79 moveto + 0.78 4.96 lineto +closepath stroke + 0.84 4.79 moveto + 0.71 4.56 lineto +closepath stroke + 0.84 4.79 moveto + 0.63 4.70 lineto +closepath stroke + 0.73 5.13 moveto + 0.98 5.31 lineto +closepath stroke + 0.73 5.13 moveto + 1.00 5.00 lineto +closepath stroke + 0.73 5.13 moveto + 0.78 4.96 lineto +closepath stroke + 0.73 5.13 moveto + 0.73 5.31 lineto +closepath stroke + 0.73 5.13 moveto + 0.36 5.31 lineto +closepath stroke + 0.73 5.13 moveto + 0.58 4.87 lineto +closepath stroke + 0.73 5.13 moveto + 0.49 5.02 lineto +closepath stroke + 0.73 5.50 moveto + 0.98 5.50 lineto +closepath stroke + 0.73 5.50 moveto + 0.73 5.31 lineto +closepath stroke + 0.73 5.50 moveto + 0.36 5.50 lineto +closepath stroke + 1.20 3.27 moveto + 1.15 3.36 lineto +closepath stroke + 1.20 3.27 moveto + 1.26 3.30 lineto +closepath stroke + 1.20 3.27 moveto + 1.15 3.23 lineto +closepath stroke + 1.10 3.44 moveto + 1.18 3.48 lineto +closepath stroke + 1.10 3.44 moveto + 1.21 3.38 lineto +closepath stroke + 1.10 3.44 moveto + 1.15 3.36 lineto +closepath stroke + 1.10 3.44 moveto + 1.04 3.54 lineto +closepath stroke + 1.10 3.44 moveto + 1.10 3.32 lineto +closepath stroke + 1.10 3.44 moveto + 1.03 3.39 lineto +closepath stroke + 0.99 3.63 moveto + 1.09 3.68 lineto +closepath stroke + 0.99 3.63 moveto + 1.12 3.57 lineto +closepath stroke + 0.99 3.63 moveto + 1.04 3.54 lineto +closepath stroke + 0.99 3.63 moveto + 0.93 3.74 lineto +closepath stroke + 0.99 3.63 moveto + 0.98 3.49 lineto +closepath stroke + 0.99 3.63 moveto + 0.90 3.57 lineto +closepath stroke + 0.99 3.63 moveto + 0.82 3.66 lineto +closepath stroke + 0.87 3.84 moveto + 0.99 3.90 lineto +closepath stroke + 0.87 3.84 moveto + 1.03 3.78 lineto +closepath stroke + 0.87 3.84 moveto + 0.93 3.74 lineto +closepath stroke + 0.87 3.84 moveto + 0.80 3.96 lineto +closepath stroke + 0.87 3.84 moveto + 0.76 3.77 lineto +closepath stroke + 0.87 3.84 moveto + 0.67 3.86 lineto +closepath stroke + 0.74 4.07 moveto + 0.88 4.14 lineto +closepath stroke + 0.74 4.07 moveto + 0.92 4.01 lineto +closepath stroke + 0.74 4.07 moveto + 0.80 3.96 lineto +closepath stroke + 0.74 4.07 moveto + 0.66 4.20 lineto +closepath stroke + 0.74 4.07 moveto + 0.61 3.98 lineto +closepath stroke + 0.74 4.07 moveto + 0.51 4.09 lineto +closepath stroke + 0.59 4.33 moveto + 0.71 4.56 lineto +closepath stroke + 0.59 4.33 moveto + 0.76 4.40 lineto +closepath stroke + 0.59 4.33 moveto + 0.81 4.27 lineto +closepath stroke + 0.59 4.33 moveto + 0.66 4.20 lineto +closepath stroke + 0.59 4.33 moveto + 0.51 4.47 lineto +closepath stroke + 0.59 4.33 moveto + 0.44 4.22 lineto +closepath stroke + 0.43 4.61 moveto + 0.58 4.87 lineto +closepath stroke + 0.43 4.61 moveto + 0.63 4.70 lineto +closepath stroke + 0.43 4.61 moveto + 0.51 4.47 lineto +closepath stroke + 0.43 4.61 moveto + 0.34 4.76 lineto +closepath stroke + 0.43 4.61 moveto + 0.21 4.76 lineto +closepath stroke + 0.43 4.61 moveto + 0.35 4.35 lineto +closepath stroke + 0.43 4.61 moveto + 0.21 4.47 lineto +closepath stroke + 0.25 4.91 moveto + 0.49 5.02 lineto +closepath stroke + 0.25 4.91 moveto + 0.34 4.76 lineto +closepath stroke + 0.25 4.91 moveto + 0.13 5.21 lineto +closepath stroke + 0.25 4.91 moveto + 0.13 4.91 lineto +closepath stroke + 0.00 4.91 moveto + 0.13 4.91 lineto +closepath stroke + 0.00 4.91 moveto + 0.21 4.76 lineto +closepath stroke + 0.00 4.91 moveto + 0.00 5.21 lineto +closepath stroke + 0.00 4.91 moveto + 0.00 4.63 lineto +closepath stroke + 1.10 3.20 moveto + 1.10 3.32 lineto +closepath stroke + 1.10 3.20 moveto + 1.15 3.23 lineto +closepath stroke + 1.10 3.20 moveto + 1.03 3.27 lineto +closepath stroke + 1.10 3.20 moveto + 0.98 3.21 lineto +closepath stroke + 1.10 3.20 moveto + 1.06 3.15 lineto +closepath stroke + 0.96 3.34 moveto + 0.98 3.49 lineto +closepath stroke + 0.96 3.34 moveto + 1.03 3.39 lineto +closepath stroke + 0.96 3.34 moveto + 1.03 3.27 lineto +closepath stroke + 0.96 3.34 moveto + 0.89 3.43 lineto +closepath stroke + 0.96 3.34 moveto + 0.91 3.28 lineto +closepath stroke + 0.96 3.34 moveto + 0.82 3.35 lineto +closepath stroke + 0.82 3.51 moveto + 0.90 3.57 lineto +closepath stroke + 0.82 3.51 moveto + 0.89 3.43 lineto +closepath stroke + 0.82 3.51 moveto + 0.74 3.60 lineto +closepath stroke + 0.82 3.51 moveto + 0.75 3.43 lineto +closepath stroke + 0.82 3.51 moveto + 0.65 3.50 lineto +closepath stroke + 0.66 3.69 moveto + 0.76 3.77 lineto +closepath stroke + 0.66 3.69 moveto + 0.82 3.66 lineto +closepath stroke + 0.66 3.69 moveto + 0.74 3.60 lineto +closepath stroke + 0.66 3.69 moveto + 0.57 3.79 lineto +closepath stroke + 0.66 3.69 moveto + 0.57 3.59 lineto +closepath stroke + 0.48 3.89 moveto + 0.61 3.98 lineto +closepath stroke + 0.48 3.89 moveto + 0.67 3.86 lineto +closepath stroke + 0.48 3.89 moveto + 0.57 3.79 lineto +closepath stroke + 0.48 3.89 moveto + 0.38 3.99 lineto +closepath stroke + 0.48 3.89 moveto + 0.48 3.69 lineto +closepath stroke + 0.48 3.89 moveto + 0.37 3.77 lineto +closepath stroke + 0.28 4.10 moveto + 0.35 4.35 lineto +closepath stroke + 0.28 4.10 moveto + 0.44 4.22 lineto +closepath stroke + 0.28 4.10 moveto + 0.51 4.09 lineto +closepath stroke + 0.28 4.10 moveto + 0.38 3.99 lineto +closepath stroke + 0.28 4.10 moveto + 0.14 4.22 lineto +closepath stroke + 0.28 4.10 moveto + 0.27 3.88 lineto +closepath stroke + 0.28 4.10 moveto + 0.14 3.88 lineto +closepath stroke + 0.00 4.34 moveto + 0.21 4.47 lineto +closepath stroke + 0.00 4.34 moveto + 0.14 4.22 lineto +closepath stroke + 0.00 4.34 moveto + 0.00 4.63 lineto +closepath stroke + 0.00 4.34 moveto + 0.00 4.00 lineto +closepath stroke + 1.01 3.10 moveto + 0.93 3.16 lineto +closepath stroke + 1.01 3.10 moveto + 1.06 3.15 lineto +closepath stroke + 1.01 3.10 moveto + 0.98 3.05 lineto +closepath stroke + 0.85 3.22 moveto + 0.91 3.28 lineto +closepath stroke + 0.85 3.22 moveto + 0.98 3.21 lineto +closepath stroke + 0.85 3.22 moveto + 0.93 3.16 lineto +closepath stroke + 0.85 3.22 moveto + 0.76 3.28 lineto +closepath stroke + 0.85 3.22 moveto + 0.90 3.11 lineto +closepath stroke + 0.85 3.22 moveto + 0.81 3.15 lineto +closepath stroke + 0.67 3.35 moveto + 0.75 3.43 lineto +closepath stroke + 0.67 3.35 moveto + 0.82 3.35 lineto +closepath stroke + 0.67 3.35 moveto + 0.76 3.28 lineto +closepath stroke + 0.67 3.35 moveto + 0.58 3.42 lineto +closepath stroke + 0.67 3.35 moveto + 0.72 3.21 lineto +closepath stroke + 0.67 3.35 moveto + 0.62 3.26 lineto +closepath stroke + 0.48 3.49 moveto + 0.48 3.69 lineto +closepath stroke + 0.48 3.49 moveto + 0.57 3.59 lineto +closepath stroke + 0.48 3.49 moveto + 0.65 3.50 lineto +closepath stroke + 0.48 3.49 moveto + 0.58 3.42 lineto +closepath stroke + 0.48 3.49 moveto + 0.37 3.57 lineto +closepath stroke + 0.48 3.49 moveto + 0.52 3.33 lineto +closepath stroke + 0.48 3.49 moveto + 0.41 3.38 lineto +closepath stroke + 0.26 3.65 moveto + 0.27 3.88 lineto +closepath stroke + 0.26 3.65 moveto + 0.37 3.77 lineto +closepath stroke + 0.26 3.65 moveto + 0.37 3.57 lineto +closepath stroke + 0.26 3.65 moveto + 0.13 3.65 lineto +closepath stroke + 0.26 3.65 moveto + 0.31 3.46 lineto +closepath stroke + 0.26 3.65 moveto + 0.13 3.51 lineto +closepath stroke + 0.00 3.65 moveto + 0.14 3.88 lineto +closepath stroke + 0.00 3.65 moveto + 0.13 3.65 lineto +closepath stroke + 0.00 3.65 moveto + 0.00 4.00 lineto +closepath stroke + 0.00 3.65 moveto + 0.00 3.51 lineto +closepath stroke + 0.95 2.99 moveto + 0.90 3.11 lineto +closepath stroke + 0.95 2.99 moveto + 0.98 3.05 lineto +closepath stroke + 0.95 2.99 moveto + 0.86 3.03 lineto +closepath stroke + 0.95 2.99 moveto + 0.83 2.96 lineto +closepath stroke + 0.95 2.99 moveto + 0.93 2.93 lineto +closepath stroke + 0.77 3.08 moveto + 0.72 3.21 lineto +closepath stroke + 0.77 3.08 moveto + 0.81 3.15 lineto +closepath stroke + 0.77 3.08 moveto + 0.86 3.03 lineto +closepath stroke + 0.77 3.08 moveto + 0.67 3.12 lineto +closepath stroke + 0.77 3.08 moveto + 0.74 3.00 lineto +closepath stroke + 0.57 3.16 moveto + 0.52 3.33 lineto +closepath stroke + 0.57 3.16 moveto + 0.62 3.26 lineto +closepath stroke + 0.57 3.16 moveto + 0.67 3.12 lineto +closepath stroke + 0.57 3.16 moveto + 0.46 3.21 lineto +closepath stroke + 0.57 3.16 moveto + 0.64 3.04 lineto +closepath stroke + 0.57 3.16 moveto + 0.54 3.06 lineto +closepath stroke + 0.57 3.16 moveto + 0.42 3.09 lineto +closepath stroke + 0.35 3.26 moveto + 0.31 3.46 lineto +closepath stroke + 0.35 3.26 moveto + 0.41 3.38 lineto +closepath stroke + 0.35 3.26 moveto + 0.46 3.21 lineto +closepath stroke + 0.35 3.26 moveto + 0.17 3.32 lineto +closepath stroke + 0.35 3.26 moveto + 0.31 3.14 lineto +closepath stroke + 0.00 3.37 moveto + 0.13 3.51 lineto +closepath stroke + 0.00 3.37 moveto + 0.17 3.32 lineto +closepath stroke + 0.00 3.37 moveto + 0.00 3.51 lineto +closepath stroke + 0.00 3.37 moveto + 0.13 3.19 lineto +closepath stroke + 0.00 3.37 moveto + 0.00 3.19 lineto +closepath stroke + 0.91 2.87 moveto + 0.82 2.90 lineto +closepath stroke + 0.91 2.87 moveto + 0.93 2.93 lineto +closepath stroke + 0.91 2.87 moveto + 0.91 2.81 lineto +closepath stroke + 0.72 2.92 moveto + 0.74 3.00 lineto +closepath stroke + 0.72 2.92 moveto + 0.83 2.96 lineto +closepath stroke + 0.72 2.92 moveto + 0.82 2.90 lineto +closepath stroke + 0.72 2.92 moveto + 0.64 3.04 lineto +closepath stroke + 0.72 2.92 moveto + 0.61 2.94 lineto +closepath stroke + 0.72 2.92 moveto + 0.81 2.83 lineto +closepath stroke + 0.72 2.92 moveto + 0.71 2.83 lineto +closepath stroke + 0.50 2.96 moveto + 0.54 3.06 lineto +closepath stroke + 0.50 2.96 moveto + 0.61 2.94 lineto +closepath stroke + 0.50 2.96 moveto + 0.38 2.99 lineto +closepath stroke + 0.50 2.96 moveto + 0.60 2.86 lineto +closepath stroke + 0.50 2.96 moveto + 0.49 2.86 lineto +closepath stroke + 0.27 3.01 moveto + 0.13 3.19 lineto +closepath stroke + 0.27 3.01 moveto + 0.31 3.14 lineto +closepath stroke + 0.27 3.01 moveto + 0.42 3.09 lineto +closepath stroke + 0.27 3.01 moveto + 0.38 2.99 lineto +closepath stroke + 0.27 3.01 moveto + 0.13 3.01 lineto +closepath stroke + 0.27 3.01 moveto + 0.37 2.88 lineto +closepath stroke + 0.27 3.01 moveto + 0.13 2.88 lineto +closepath stroke + 0.00 3.01 moveto + 0.00 3.19 lineto +closepath stroke + 0.00 3.01 moveto + 0.13 3.01 lineto +closepath stroke + 0.00 3.01 moveto + 0.00 2.88 lineto +closepath stroke + 0.90 2.75 moveto + 0.81 2.83 lineto +closepath stroke + 0.90 2.75 moveto + 0.91 2.81 lineto +closepath stroke + 0.90 2.75 moveto + 0.80 2.75 lineto +closepath stroke + 0.90 2.75 moveto + 0.91 2.69 lineto +closepath stroke + 0.70 2.75 moveto + 0.60 2.86 lineto +closepath stroke + 0.70 2.75 moveto + 0.71 2.83 lineto +closepath stroke + 0.70 2.75 moveto + 0.80 2.75 lineto +closepath stroke + 0.70 2.75 moveto + 0.59 2.75 lineto +closepath stroke + 0.70 2.75 moveto + 0.81 2.69 lineto +closepath stroke + 0.70 2.75 moveto + 0.71 2.67 lineto +closepath stroke + 0.48 2.75 moveto + 0.37 2.88 lineto +closepath stroke + 0.48 2.75 moveto + 0.49 2.86 lineto +closepath stroke + 0.48 2.75 moveto + 0.59 2.75 lineto +closepath stroke + 0.48 2.75 moveto + 0.24 2.75 lineto +closepath stroke + 0.48 2.75 moveto + 0.60 2.67 lineto +closepath stroke + 0.48 2.75 moveto + 0.49 2.64 lineto +closepath stroke + 0.48 2.75 moveto + 0.37 2.62 lineto +closepath stroke + 0.00 2.75 moveto + 0.13 2.88 lineto +closepath stroke + 0.00 2.75 moveto + 0.24 2.75 lineto +closepath stroke + 0.00 2.75 moveto + 0.00 2.88 lineto +closepath stroke + 0.00 2.75 moveto + 0.13 2.62 lineto +closepath stroke + 0.00 2.75 moveto + 0.00 2.62 lineto +closepath stroke + 0.91 2.63 moveto + 0.81 2.69 lineto +closepath stroke + 0.91 2.63 moveto + 0.91 2.69 lineto +closepath stroke + 0.91 2.63 moveto + 0.82 2.60 lineto +closepath stroke + 0.91 2.63 moveto + 0.93 2.57 lineto +closepath stroke + 0.72 2.58 moveto + 0.60 2.67 lineto +closepath stroke + 0.72 2.58 moveto + 0.71 2.67 lineto +closepath stroke + 0.72 2.58 moveto + 0.82 2.60 lineto +closepath stroke + 0.72 2.58 moveto + 0.61 2.56 lineto +closepath stroke + 0.72 2.58 moveto + 0.83 2.54 lineto +closepath stroke + 0.72 2.58 moveto + 0.74 2.50 lineto +closepath stroke + 0.72 2.58 moveto + 0.64 2.46 lineto +closepath stroke + 0.50 2.54 moveto + 0.49 2.64 lineto +closepath stroke + 0.50 2.54 moveto + 0.61 2.56 lineto +closepath stroke + 0.50 2.54 moveto + 0.38 2.51 lineto +closepath stroke + 0.50 2.54 moveto + 0.54 2.44 lineto +closepath stroke + 0.50 2.54 moveto + 0.42 2.39 lineto +closepath stroke + 0.27 2.49 moveto + 0.13 2.62 lineto +closepath stroke + 0.27 2.49 moveto + 0.37 2.62 lineto +closepath stroke + 0.27 2.49 moveto + 0.38 2.51 lineto +closepath stroke + 0.27 2.49 moveto + 0.13 2.49 lineto +closepath stroke + 0.27 2.49 moveto + 0.31 2.36 lineto +closepath stroke + 0.27 2.49 moveto + 0.13 2.31 lineto +closepath stroke + 0.00 2.49 moveto + 0.00 2.62 lineto +closepath stroke + 0.00 2.49 moveto + 0.13 2.49 lineto +closepath stroke + 0.00 2.49 moveto + 0.00 2.31 lineto +closepath stroke + 0.95 2.51 moveto + 0.83 2.54 lineto +closepath stroke + 0.95 2.51 moveto + 0.93 2.57 lineto +closepath stroke + 0.95 2.51 moveto + 0.86 2.47 lineto +closepath stroke + 0.95 2.51 moveto + 0.98 2.45 lineto +closepath stroke + 0.77 2.42 moveto + 0.74 2.50 lineto +closepath stroke + 0.77 2.42 moveto + 0.86 2.47 lineto +closepath stroke + 0.77 2.42 moveto + 0.67 2.38 lineto +closepath stroke + 0.77 2.42 moveto + 0.89 2.41 lineto +closepath stroke + 0.77 2.42 moveto + 0.81 2.35 lineto +closepath stroke + 0.57 2.34 moveto + 0.54 2.44 lineto +closepath stroke + 0.57 2.34 moveto + 0.64 2.46 lineto +closepath stroke + 0.57 2.34 moveto + 0.67 2.38 lineto +closepath stroke + 0.57 2.34 moveto + 0.46 2.29 lineto +closepath stroke + 0.57 2.34 moveto + 0.71 2.31 lineto +closepath stroke + 0.57 2.34 moveto + 0.62 2.24 lineto +closepath stroke + 0.35 2.24 moveto + 0.31 2.36 lineto +closepath stroke + 0.35 2.24 moveto + 0.42 2.39 lineto +closepath stroke + 0.35 2.24 moveto + 0.46 2.29 lineto +closepath stroke + 0.35 2.24 moveto + 0.17 2.18 lineto +closepath stroke + 0.35 2.24 moveto + 0.51 2.19 lineto +closepath stroke + 0.35 2.24 moveto + 0.41 2.12 lineto +closepath stroke + 0.35 2.24 moveto + 0.31 2.04 lineto +closepath stroke + 0.00 2.13 moveto + 0.00 2.31 lineto +closepath stroke + 0.00 2.13 moveto + 0.13 2.31 lineto +closepath stroke + 0.00 2.13 moveto + 0.17 2.18 lineto +closepath stroke + 0.00 2.13 moveto + 0.13 1.99 lineto +closepath stroke + 0.00 2.13 moveto + 0.00 1.99 lineto +closepath stroke + 1.01 2.40 moveto + 0.89 2.41 lineto +closepath stroke + 1.01 2.40 moveto + 0.98 2.45 lineto +closepath stroke + 1.01 2.40 moveto + 0.93 2.34 lineto +closepath stroke + 1.01 2.40 moveto + 0.99 2.28 lineto +closepath stroke + 1.01 2.40 moveto + 1.06 2.35 lineto +closepath stroke + 0.85 2.28 moveto + 0.71 2.31 lineto +closepath stroke + 0.85 2.28 moveto + 0.81 2.35 lineto +closepath stroke + 0.85 2.28 moveto + 0.93 2.34 lineto +closepath stroke + 0.85 2.28 moveto + 0.76 2.22 lineto +closepath stroke + 0.85 2.28 moveto + 0.91 2.22 lineto +closepath stroke + 0.85 2.28 moveto + 0.84 2.14 lineto +closepath stroke + 0.67 2.15 moveto + 0.51 2.19 lineto +closepath stroke + 0.67 2.15 moveto + 0.62 2.24 lineto +closepath stroke + 0.67 2.15 moveto + 0.76 2.22 lineto +closepath stroke + 0.67 2.15 moveto + 0.58 2.08 lineto +closepath stroke + 0.67 2.15 moveto + 0.75 2.07 lineto +closepath stroke + 0.67 2.15 moveto + 0.67 1.98 lineto +closepath stroke + 0.48 2.01 moveto + 0.41 2.12 lineto +closepath stroke + 0.48 2.01 moveto + 0.58 2.08 lineto +closepath stroke + 0.48 2.01 moveto + 0.37 1.93 lineto +closepath stroke + 0.48 2.01 moveto + 0.57 1.91 lineto +closepath stroke + 0.48 2.01 moveto + 0.48 1.81 lineto +closepath stroke + 0.26 1.85 moveto + 0.13 1.99 lineto +closepath stroke + 0.26 1.85 moveto + 0.31 2.04 lineto +closepath stroke + 0.26 1.85 moveto + 0.37 1.93 lineto +closepath stroke + 0.26 1.85 moveto + 0.13 1.85 lineto +closepath stroke + 0.26 1.85 moveto + 0.37 1.73 lineto +closepath stroke + 0.26 1.85 moveto + 0.27 1.62 lineto +closepath stroke + 0.00 1.85 moveto + 0.00 1.99 lineto +closepath stroke + 0.00 1.85 moveto + 0.13 1.85 lineto +closepath stroke + 0.00 1.85 moveto + 0.14 1.62 lineto +closepath stroke + 0.00 1.85 moveto + 0.00 1.50 lineto +closepath stroke + 1.10 2.30 moveto + 1.03 2.23 lineto +closepath stroke + 1.10 2.30 moveto + 1.06 2.35 lineto +closepath stroke + 1.10 2.30 moveto + 1.15 2.27 lineto +closepath stroke + 0.96 2.16 moveto + 0.91 2.22 lineto +closepath stroke + 0.96 2.16 moveto + 0.99 2.28 lineto +closepath stroke + 0.96 2.16 moveto + 1.03 2.23 lineto +closepath stroke + 0.96 2.16 moveto + 0.89 2.07 lineto +closepath stroke + 0.96 2.16 moveto + 1.08 2.19 lineto +closepath stroke + 0.96 2.16 moveto + 1.03 2.11 lineto +closepath stroke + 0.82 1.99 moveto + 0.75 2.07 lineto +closepath stroke + 0.82 1.99 moveto + 0.84 2.14 lineto +closepath stroke + 0.82 1.99 moveto + 0.89 2.07 lineto +closepath stroke + 0.82 1.99 moveto + 0.74 1.90 lineto +closepath stroke + 0.82 1.99 moveto + 0.96 2.02 lineto +closepath stroke + 0.82 1.99 moveto + 0.90 1.93 lineto +closepath stroke + 0.66 1.81 moveto + 0.57 1.91 lineto +closepath stroke + 0.66 1.81 moveto + 0.67 1.98 lineto +closepath stroke + 0.66 1.81 moveto + 0.74 1.90 lineto +closepath stroke + 0.66 1.81 moveto + 0.57 1.71 lineto +closepath stroke + 0.66 1.81 moveto + 0.82 1.84 lineto +closepath stroke + 0.66 1.81 moveto + 0.76 1.73 lineto +closepath stroke + 0.48 1.61 moveto + 0.37 1.73 lineto +closepath stroke + 0.48 1.61 moveto + 0.48 1.81 lineto +closepath stroke + 0.48 1.61 moveto + 0.57 1.71 lineto +closepath stroke + 0.48 1.61 moveto + 0.38 1.51 lineto +closepath stroke + 0.48 1.61 moveto + 0.67 1.64 lineto +closepath stroke + 0.48 1.61 moveto + 0.61 1.52 lineto +closepath stroke + 0.28 1.40 moveto + 0.14 1.62 lineto +closepath stroke + 0.28 1.40 moveto + 0.27 1.62 lineto +closepath stroke + 0.28 1.40 moveto + 0.38 1.51 lineto +closepath stroke + 0.28 1.40 moveto + 0.14 1.28 lineto +closepath stroke + 0.28 1.40 moveto + 0.51 1.41 lineto +closepath stroke + 0.28 1.40 moveto + 0.44 1.28 lineto +closepath stroke + 0.28 1.40 moveto + 0.35 1.15 lineto +closepath stroke + 0.00 1.16 moveto + 0.00 1.50 lineto +closepath stroke + 0.00 1.16 moveto + 0.14 1.28 lineto +closepath stroke + 0.00 1.16 moveto + 0.21 1.03 lineto +closepath stroke + 0.00 1.16 moveto + 0.00 0.87 lineto +closepath stroke + 1.20 2.23 moveto + 1.08 2.19 lineto +closepath stroke + 1.20 2.23 moveto + 1.15 2.27 lineto +closepath stroke + 1.20 2.23 moveto + 1.15 2.14 lineto +closepath stroke + 1.20 2.23 moveto + 1.26 2.20 lineto +closepath stroke + 1.10 2.06 moveto + 0.96 2.02 lineto +closepath stroke + 1.10 2.06 moveto + 1.03 2.11 lineto +closepath stroke + 1.10 2.06 moveto + 1.15 2.14 lineto +closepath stroke + 1.10 2.06 moveto + 1.05 1.96 lineto +closepath stroke + 1.10 2.06 moveto + 1.21 2.12 lineto +closepath stroke + 1.10 2.06 moveto + 1.18 2.02 lineto +closepath stroke + 0.99 1.87 moveto + 0.82 1.84 lineto +closepath stroke + 0.99 1.87 moveto + 0.90 1.93 lineto +closepath stroke + 0.99 1.87 moveto + 1.05 1.96 lineto +closepath stroke + 0.99 1.87 moveto + 0.93 1.76 lineto +closepath stroke + 0.99 1.87 moveto + 1.12 1.93 lineto +closepath stroke + 0.99 1.87 moveto + 1.09 1.82 lineto +closepath stroke + 0.87 1.66 moveto + 0.67 1.64 lineto +closepath stroke + 0.87 1.66 moveto + 0.76 1.73 lineto +closepath stroke + 0.87 1.66 moveto + 0.93 1.76 lineto +closepath stroke + 0.87 1.66 moveto + 0.80 1.54 lineto +closepath stroke + 0.87 1.66 moveto + 1.03 1.72 lineto +closepath stroke + 0.87 1.66 moveto + 0.99 1.60 lineto +closepath stroke + 0.74 1.43 moveto + 0.51 1.41 lineto +closepath stroke + 0.74 1.43 moveto + 0.61 1.52 lineto +closepath stroke + 0.74 1.43 moveto + 0.80 1.54 lineto +closepath stroke + 0.74 1.43 moveto + 0.66 1.30 lineto +closepath stroke + 0.74 1.43 moveto + 0.92 1.49 lineto +closepath stroke + 0.74 1.43 moveto + 0.88 1.36 lineto +closepath stroke + 0.59 1.17 moveto + 0.44 1.28 lineto +closepath stroke + 0.59 1.17 moveto + 0.66 1.30 lineto +closepath stroke + 0.59 1.17 moveto + 0.51 1.03 lineto +closepath stroke + 0.59 1.17 moveto + 0.81 1.23 lineto +closepath stroke + 0.59 1.17 moveto + 0.76 1.10 lineto +closepath stroke + 0.43 0.89 moveto + 0.21 1.03 lineto +closepath stroke + 0.43 0.89 moveto + 0.35 1.15 lineto +closepath stroke + 0.43 0.89 moveto + 0.51 1.03 lineto +closepath stroke + 0.43 0.89 moveto + 0.21 0.74 lineto +closepath stroke + 0.43 0.89 moveto + 0.34 0.74 lineto +closepath stroke + 0.43 0.89 moveto + 0.68 0.96 lineto +closepath stroke + 0.43 0.89 moveto + 0.63 0.80 lineto +closepath stroke + 0.25 0.59 moveto + 0.13 0.59 lineto +closepath stroke + 0.25 0.59 moveto + 0.34 0.74 lineto +closepath stroke + 0.25 0.59 moveto + 0.13 0.29 lineto +closepath stroke + 0.25 0.59 moveto + 0.54 0.65 lineto +closepath stroke + 0.25 0.59 moveto + 0.49 0.48 lineto +closepath stroke + 0.00 0.59 moveto + 0.00 0.87 lineto +closepath stroke + 0.00 0.59 moveto + 0.21 0.74 lineto +closepath stroke + 0.00 0.59 moveto + 0.13 0.59 lineto +closepath stroke + 0.00 0.59 moveto + 0.00 0.29 lineto +closepath stroke + 1.31 2.18 moveto + 1.21 2.12 lineto +closepath stroke + 1.31 2.18 moveto + 1.26 2.20 lineto +closepath stroke + 1.31 2.18 moveto + 1.28 2.08 lineto +closepath stroke + 1.31 2.18 moveto + 1.37 2.07 lineto +closepath stroke + 1.31 2.18 moveto + 1.38 2.17 lineto +closepath stroke + 1.25 1.99 moveto + 1.12 1.93 lineto +closepath stroke + 1.25 1.99 moveto + 1.18 2.02 lineto +closepath stroke + 1.25 1.99 moveto + 1.28 2.08 lineto +closepath stroke + 1.25 1.99 moveto + 1.22 1.88 lineto +closepath stroke + 1.25 1.99 moveto + 1.33 1.97 lineto +closepath stroke + 1.25 1.99 moveto + 1.32 1.86 lineto +closepath stroke + 1.18 1.78 moveto + 1.03 1.72 lineto +closepath stroke + 1.18 1.78 moveto + 1.09 1.82 lineto +closepath stroke + 1.18 1.78 moveto + 1.22 1.88 lineto +closepath stroke + 1.18 1.78 moveto + 1.15 1.66 lineto +closepath stroke + 1.18 1.78 moveto + 1.29 1.76 lineto +closepath stroke + 1.18 1.78 moveto + 1.28 1.64 lineto +closepath stroke + 1.11 1.55 moveto + 0.92 1.49 lineto +closepath stroke + 1.11 1.55 moveto + 0.99 1.60 lineto +closepath stroke + 1.11 1.55 moveto + 1.15 1.66 lineto +closepath stroke + 1.11 1.55 moveto + 1.07 1.42 lineto +closepath stroke + 1.11 1.55 moveto + 1.24 1.52 lineto +closepath stroke + 1.11 1.55 moveto + 1.23 1.39 lineto +closepath stroke + 1.03 1.30 moveto + 0.81 1.23 lineto +closepath stroke + 1.03 1.30 moveto + 0.88 1.36 lineto +closepath stroke + 1.03 1.30 moveto + 1.07 1.42 lineto +closepath stroke + 1.03 1.30 moveto + 0.98 1.16 lineto +closepath stroke + 1.03 1.30 moveto + 1.18 1.26 lineto +closepath stroke + 1.03 1.30 moveto + 1.17 1.12 lineto +closepath stroke + 0.94 1.02 moveto + 0.68 0.96 lineto +closepath stroke + 0.94 1.02 moveto + 0.76 1.10 lineto +closepath stroke + 0.94 1.02 moveto + 0.98 1.16 lineto +closepath stroke + 0.94 1.02 moveto + 0.89 0.86 lineto +closepath stroke + 0.94 1.02 moveto + 1.12 0.98 lineto +closepath stroke + 0.94 1.02 moveto + 1.11 0.82 lineto +closepath stroke + 0.84 0.71 moveto + 0.54 0.65 lineto +closepath stroke + 0.84 0.71 moveto + 0.63 0.80 lineto +closepath stroke + 0.84 0.71 moveto + 0.89 0.86 lineto +closepath stroke + 0.84 0.71 moveto + 0.78 0.54 lineto +closepath stroke + 0.84 0.71 moveto + 1.06 0.67 lineto +closepath stroke + 0.73 0.37 moveto + 0.49 0.48 lineto +closepath stroke + 0.73 0.37 moveto + 0.78 0.54 lineto +closepath stroke + 0.73 0.37 moveto + 0.36 0.19 lineto +closepath stroke + 0.73 0.37 moveto + 0.73 0.19 lineto +closepath stroke + 0.73 0.37 moveto + 1.00 0.50 lineto +closepath stroke + 0.73 0.37 moveto + 0.98 0.19 lineto +closepath stroke + 0.73 0.00 moveto + 0.36 0.00 lineto +closepath stroke + 0.73 0.00 moveto + 0.73 0.19 lineto +closepath stroke + 0.73 0.00 moveto + 0.98 0.00 lineto +closepath stroke + 1.44 2.15 moveto + 1.43 2.05 lineto +closepath stroke + 1.44 2.15 moveto + 1.38 2.17 lineto +closepath stroke + 1.44 2.15 moveto + 1.50 2.15 lineto +closepath stroke + 1.42 1.95 moveto + 1.33 1.97 lineto +closepath stroke + 1.42 1.95 moveto + 1.37 2.07 lineto +closepath stroke + 1.42 1.95 moveto + 1.43 2.05 lineto +closepath stroke + 1.42 1.95 moveto + 1.40 1.84 lineto +closepath stroke + 1.42 1.95 moveto + 1.49 2.05 lineto +closepath stroke + 1.42 1.95 moveto + 1.50 1.95 lineto +closepath stroke + 1.39 1.74 moveto + 1.29 1.76 lineto +closepath stroke + 1.39 1.74 moveto + 1.32 1.86 lineto +closepath stroke + 1.39 1.74 moveto + 1.40 1.84 lineto +closepath stroke + 1.39 1.74 moveto + 1.38 1.62 lineto +closepath stroke + 1.39 1.74 moveto + 1.49 1.84 lineto +closepath stroke + 1.39 1.74 moveto + 1.50 1.74 lineto +closepath stroke + 1.37 1.49 moveto + 1.24 1.52 lineto +closepath stroke + 1.37 1.49 moveto + 1.28 1.64 lineto +closepath stroke + 1.37 1.49 moveto + 1.38 1.62 lineto +closepath stroke + 1.37 1.49 moveto + 1.35 1.36 lineto +closepath stroke + 1.37 1.49 moveto + 1.49 1.62 lineto +closepath stroke + 1.37 1.49 moveto + 1.50 1.49 lineto +closepath stroke + 1.34 1.23 moveto + 1.18 1.26 lineto +closepath stroke + 1.34 1.23 moveto + 1.23 1.39 lineto +closepath stroke + 1.34 1.23 moveto + 1.35 1.36 lineto +closepath stroke + 1.34 1.23 moveto + 1.32 1.08 lineto +closepath stroke + 1.34 1.23 moveto + 1.49 1.36 lineto +closepath stroke + 1.34 1.23 moveto + 1.50 1.23 lineto +closepath stroke + 1.31 0.94 moveto + 1.12 0.98 lineto +closepath stroke + 1.31 0.94 moveto + 1.17 1.12 lineto +closepath stroke + 1.31 0.94 moveto + 1.32 1.08 lineto +closepath stroke + 1.31 0.94 moveto + 1.29 0.78 lineto +closepath stroke + 1.31 0.94 moveto + 1.48 1.08 lineto +closepath stroke + 1.31 0.94 moveto + 1.50 0.94 lineto +closepath stroke + 1.31 0.94 moveto + 1.52 0.78 lineto +closepath stroke + 1.28 0.62 moveto + 1.00 0.50 lineto +closepath stroke + 1.28 0.62 moveto + 1.06 0.67 lineto +closepath stroke + 1.28 0.62 moveto + 1.11 0.82 lineto +closepath stroke + 1.28 0.62 moveto + 1.29 0.78 lineto +closepath stroke + 1.28 0.62 moveto + 1.26 0.31 lineto +closepath stroke + 1.28 0.62 moveto + 1.50 0.62 lineto +closepath stroke + 1.24 0.00 moveto + 0.98 0.00 lineto +closepath stroke + 1.24 0.00 moveto + 0.98 0.19 lineto +closepath stroke + 1.24 0.00 moveto + 1.26 0.31 lineto +closepath stroke + 1.24 0.00 moveto + 1.48 0.31 lineto +closepath stroke + 1.24 0.00 moveto + 1.50 0.00 lineto +closepath stroke + 1.56 2.15 moveto + 1.49 2.05 lineto +closepath stroke + 1.56 2.15 moveto + 1.50 2.15 lineto +closepath stroke + 1.56 2.15 moveto + 1.57 2.05 lineto +closepath stroke + 1.56 2.15 moveto + 1.62 2.17 lineto +closepath stroke + 1.58 1.95 moveto + 1.49 1.84 lineto +closepath stroke + 1.58 1.95 moveto + 1.50 1.95 lineto +closepath stroke + 1.58 1.95 moveto + 1.57 2.05 lineto +closepath stroke + 1.58 1.95 moveto + 1.60 1.84 lineto +closepath stroke + 1.58 1.95 moveto + 1.63 2.07 lineto +closepath stroke + 1.58 1.95 moveto + 1.67 1.97 lineto +closepath stroke + 1.61 1.74 moveto + 1.49 1.62 lineto +closepath stroke + 1.61 1.74 moveto + 1.50 1.74 lineto +closepath stroke + 1.61 1.74 moveto + 1.60 1.84 lineto +closepath stroke + 1.61 1.74 moveto + 1.62 1.62 lineto +closepath stroke + 1.61 1.74 moveto + 1.68 1.86 lineto +closepath stroke + 1.61 1.74 moveto + 1.71 1.76 lineto +closepath stroke + 1.63 1.49 moveto + 1.49 1.36 lineto +closepath stroke + 1.63 1.49 moveto + 1.50 1.49 lineto +closepath stroke + 1.63 1.49 moveto + 1.62 1.62 lineto +closepath stroke + 1.63 1.49 moveto + 1.65 1.36 lineto +closepath stroke + 1.63 1.49 moveto + 1.72 1.64 lineto +closepath stroke + 1.63 1.49 moveto + 1.76 1.52 lineto +closepath stroke + 1.66 1.23 moveto + 1.48 1.08 lineto +closepath stroke + 1.66 1.23 moveto + 1.50 1.23 lineto +closepath stroke + 1.66 1.23 moveto + 1.65 1.36 lineto +closepath stroke + 1.66 1.23 moveto + 1.68 1.08 lineto +closepath stroke + 1.66 1.23 moveto + 1.77 1.39 lineto +closepath stroke + 1.66 1.23 moveto + 1.82 1.26 lineto +closepath stroke + 1.69 0.94 moveto + 1.50 0.94 lineto +closepath stroke + 1.69 0.94 moveto + 1.68 1.08 lineto +closepath stroke + 1.69 0.94 moveto + 1.71 0.78 lineto +closepath stroke + 1.69 0.94 moveto + 1.83 1.12 lineto +closepath stroke + 1.69 0.94 moveto + 1.88 0.98 lineto +closepath stroke + 1.72 0.62 moveto + 1.50 0.62 lineto +closepath stroke + 1.72 0.62 moveto + 1.52 0.78 lineto +closepath stroke + 1.72 0.62 moveto + 1.71 0.78 lineto +closepath stroke + 1.72 0.62 moveto + 1.48 0.31 lineto +closepath stroke + 1.72 0.62 moveto + 1.74 0.31 lineto +closepath stroke + 1.72 0.62 moveto + 1.89 0.82 lineto +closepath stroke + 1.72 0.62 moveto + 1.94 0.67 lineto +closepath stroke + 1.72 0.62 moveto + 2.00 0.50 lineto +closepath stroke + 1.76 0.00 moveto + 1.50 0.00 lineto +closepath stroke + 1.76 0.00 moveto + 1.74 0.31 lineto +closepath stroke + 1.76 0.00 moveto + 2.02 0.19 lineto +closepath stroke + 1.76 0.00 moveto + 2.02 0.00 lineto +closepath stroke + 1.69 2.18 moveto + 1.63 2.07 lineto +closepath stroke + 1.69 2.18 moveto + 1.62 2.17 lineto +closepath stroke + 1.69 2.18 moveto + 1.72 2.08 lineto +closepath stroke + 1.69 2.18 moveto + 1.79 2.12 lineto +closepath stroke + 1.69 2.18 moveto + 1.74 2.20 lineto +closepath stroke + 1.75 1.99 moveto + 1.68 1.86 lineto +closepath stroke + 1.75 1.99 moveto + 1.67 1.97 lineto +closepath stroke + 1.75 1.99 moveto + 1.72 2.08 lineto +closepath stroke + 1.75 1.99 moveto + 1.78 1.88 lineto +closepath stroke + 1.75 1.99 moveto + 1.82 2.02 lineto +closepath stroke + 1.75 1.99 moveto + 1.88 1.93 lineto +closepath stroke + 1.82 1.78 moveto + 1.72 1.64 lineto +closepath stroke + 1.82 1.78 moveto + 1.71 1.76 lineto +closepath stroke + 1.82 1.78 moveto + 1.78 1.88 lineto +closepath stroke + 1.82 1.78 moveto + 1.85 1.66 lineto +closepath stroke + 1.82 1.78 moveto + 1.91 1.82 lineto +closepath stroke + 1.82 1.78 moveto + 1.97 1.72 lineto +closepath stroke + 1.89 1.55 moveto + 1.77 1.39 lineto +closepath stroke + 1.89 1.55 moveto + 1.76 1.52 lineto +closepath stroke + 1.89 1.55 moveto + 1.85 1.66 lineto +closepath stroke + 1.89 1.55 moveto + 1.93 1.42 lineto +closepath stroke + 1.89 1.55 moveto + 2.01 1.60 lineto +closepath stroke + 1.89 1.55 moveto + 2.08 1.49 lineto +closepath stroke + 1.97 1.30 moveto + 1.83 1.12 lineto +closepath stroke + 1.97 1.30 moveto + 1.82 1.26 lineto +closepath stroke + 1.97 1.30 moveto + 1.93 1.42 lineto +closepath stroke + 1.97 1.30 moveto + 2.02 1.16 lineto +closepath stroke + 1.97 1.30 moveto + 2.12 1.36 lineto +closepath stroke + 1.97 1.30 moveto + 2.19 1.23 lineto +closepath stroke + 2.06 1.02 moveto + 1.89 0.82 lineto +closepath stroke + 2.06 1.02 moveto + 1.88 0.98 lineto +closepath stroke + 2.06 1.02 moveto + 2.02 1.16 lineto +closepath stroke + 2.06 1.02 moveto + 2.11 0.86 lineto +closepath stroke + 2.06 1.02 moveto + 2.24 1.10 lineto +closepath stroke + 2.06 1.02 moveto + 2.32 0.96 lineto +closepath stroke + 2.16 0.71 moveto + 1.94 0.67 lineto +closepath stroke + 2.16 0.71 moveto + 2.11 0.86 lineto +closepath stroke + 2.16 0.71 moveto + 2.22 0.54 lineto +closepath stroke + 2.16 0.71 moveto + 2.37 0.80 lineto +closepath stroke + 2.16 0.71 moveto + 2.46 0.65 lineto +closepath stroke + 2.27 0.37 moveto + 2.02 0.19 lineto +closepath stroke + 2.27 0.37 moveto + 2.00 0.50 lineto +closepath stroke + 2.27 0.37 moveto + 2.22 0.54 lineto +closepath stroke + 2.27 0.37 moveto + 2.27 0.19 lineto +closepath stroke + 2.27 0.37 moveto + 2.51 0.48 lineto +closepath stroke + 2.27 0.37 moveto + 2.61 0.19 lineto +closepath stroke + 2.27 0.00 moveto + 2.02 0.00 lineto +closepath stroke + 2.27 0.00 moveto + 2.27 0.19 lineto +closepath stroke + 2.27 0.00 moveto + 2.61 0.00 lineto +closepath stroke + 1.80 2.23 moveto + 1.85 2.14 lineto +closepath stroke + 1.80 2.23 moveto + 1.74 2.20 lineto +closepath stroke + 1.80 2.23 moveto + 1.92 2.19 lineto +closepath stroke + 1.80 2.23 moveto + 1.85 2.27 lineto +closepath stroke + 1.90 2.06 moveto + 1.82 2.02 lineto +closepath stroke + 1.90 2.06 moveto + 1.79 2.12 lineto +closepath stroke + 1.90 2.06 moveto + 1.85 2.14 lineto +closepath stroke + 1.90 2.06 moveto + 1.96 1.96 lineto +closepath stroke + 1.90 2.06 moveto + 1.97 2.11 lineto +closepath stroke + 2.01 1.87 moveto + 1.91 1.82 lineto +closepath stroke + 2.01 1.87 moveto + 1.88 1.93 lineto +closepath stroke + 2.01 1.87 moveto + 1.96 1.96 lineto +closepath stroke + 2.01 1.87 moveto + 2.07 1.76 lineto +closepath stroke + 2.01 1.87 moveto + 2.02 2.01 lineto +closepath stroke + 2.01 1.87 moveto + 2.10 1.93 lineto +closepath stroke + 2.13 1.66 moveto + 2.01 1.60 lineto +closepath stroke + 2.13 1.66 moveto + 1.97 1.72 lineto +closepath stroke + 2.13 1.66 moveto + 2.07 1.76 lineto +closepath stroke + 2.13 1.66 moveto + 2.20 1.54 lineto +closepath stroke + 2.13 1.66 moveto + 2.16 1.82 lineto +closepath stroke + 2.13 1.66 moveto + 2.24 1.73 lineto +closepath stroke + 2.26 1.43 moveto + 2.12 1.36 lineto +closepath stroke + 2.26 1.43 moveto + 2.08 1.49 lineto +closepath stroke + 2.26 1.43 moveto + 2.20 1.54 lineto +closepath stroke + 2.26 1.43 moveto + 2.34 1.30 lineto +closepath stroke + 2.26 1.43 moveto + 2.30 1.62 lineto +closepath stroke + 2.26 1.43 moveto + 2.39 1.52 lineto +closepath stroke + 2.41 1.17 moveto + 2.24 1.10 lineto +closepath stroke + 2.41 1.17 moveto + 2.19 1.23 lineto +closepath stroke + 2.41 1.17 moveto + 2.34 1.30 lineto +closepath stroke + 2.41 1.17 moveto + 2.49 1.03 lineto +closepath stroke + 2.41 1.17 moveto + 2.47 1.39 lineto +closepath stroke + 2.41 1.17 moveto + 2.56 1.28 lineto +closepath stroke + 2.57 0.89 moveto + 2.37 0.80 lineto +closepath stroke + 2.57 0.89 moveto + 2.32 0.96 lineto +closepath stroke + 2.57 0.89 moveto + 2.49 1.03 lineto +closepath stroke + 2.57 0.89 moveto + 2.66 0.74 lineto +closepath stroke + 2.57 0.89 moveto + 2.65 1.15 lineto +closepath stroke + 2.57 0.89 moveto + 2.75 1.03 lineto +closepath stroke + 2.75 0.59 moveto + 2.51 0.48 lineto +closepath stroke + 2.75 0.59 moveto + 2.46 0.65 lineto +closepath stroke + 2.75 0.59 moveto + 2.66 0.74 lineto +closepath stroke + 2.75 0.59 moveto + 2.85 0.29 lineto +closepath stroke + 2.75 0.59 moveto + 2.84 0.87 lineto +closepath stroke + 2.75 0.59 moveto + 2.96 0.74 lineto +closepath stroke + 2.75 0.59 moveto + 3.09 0.60 lineto +closepath stroke + 2.94 0.00 moveto + 2.61 0.00 lineto +closepath stroke + 2.94 0.00 moveto + 2.61 0.19 lineto +closepath stroke + 2.94 0.00 moveto + 2.85 0.29 lineto +closepath stroke + 2.94 0.00 moveto + 3.19 0.30 lineto +closepath stroke + 2.94 0.00 moveto + 3.33 0.00 lineto +closepath stroke + 1.90 2.30 moveto + 1.97 2.23 lineto +closepath stroke + 1.90 2.30 moveto + 1.85 2.27 lineto +closepath stroke + 1.90 2.30 moveto + 1.94 2.35 lineto +closepath stroke + 2.04 2.16 moveto + 1.97 2.11 lineto +closepath stroke + 2.04 2.16 moveto + 1.92 2.19 lineto +closepath stroke + 2.04 2.16 moveto + 1.97 2.23 lineto +closepath stroke + 2.04 2.16 moveto + 2.02 2.01 lineto +closepath stroke + 2.04 2.16 moveto + 2.11 2.07 lineto +closepath stroke + 2.04 2.16 moveto + 2.01 2.28 lineto +closepath stroke + 2.04 2.16 moveto + 2.09 2.22 lineto +closepath stroke + 2.18 1.99 moveto + 2.16 1.82 lineto +closepath stroke + 2.18 1.99 moveto + 2.10 1.93 lineto +closepath stroke + 2.18 1.99 moveto + 2.11 2.07 lineto +closepath stroke + 2.18 1.99 moveto + 2.26 1.90 lineto +closepath stroke + 2.18 1.99 moveto + 2.16 2.14 lineto +closepath stroke + 2.18 1.99 moveto + 2.25 2.07 lineto +closepath stroke + 2.18 1.99 moveto + 2.35 2.00 lineto +closepath stroke + 2.34 1.81 moveto + 2.30 1.62 lineto +closepath stroke + 2.34 1.81 moveto + 2.24 1.73 lineto +closepath stroke + 2.34 1.81 moveto + 2.26 1.90 lineto +closepath stroke + 2.34 1.81 moveto + 2.43 1.71 lineto +closepath stroke + 2.34 1.81 moveto + 2.43 1.91 lineto +closepath stroke + 2.52 1.61 moveto + 2.47 1.39 lineto +closepath stroke + 2.52 1.61 moveto + 2.39 1.52 lineto +closepath stroke + 2.52 1.61 moveto + 2.43 1.71 lineto +closepath stroke + 2.52 1.61 moveto + 2.62 1.51 lineto +closepath stroke + 2.52 1.61 moveto + 2.52 1.81 lineto +closepath stroke + 2.52 1.61 moveto + 2.63 1.73 lineto +closepath stroke + 2.72 1.40 moveto + 2.65 1.15 lineto +closepath stroke + 2.72 1.40 moveto + 2.56 1.28 lineto +closepath stroke + 2.72 1.40 moveto + 2.62 1.51 lineto +closepath stroke + 2.72 1.40 moveto + 2.83 1.28 lineto +closepath stroke + 2.72 1.40 moveto + 2.73 1.62 lineto +closepath stroke + 2.72 1.40 moveto + 2.85 1.54 lineto +closepath stroke + 2.93 1.16 moveto + 2.84 0.87 lineto +closepath stroke + 2.93 1.16 moveto + 2.75 1.03 lineto +closepath stroke + 2.93 1.16 moveto + 2.83 1.28 lineto +closepath stroke + 2.93 1.16 moveto + 3.05 1.03 lineto +closepath stroke + 2.93 1.16 moveto + 2.95 1.42 lineto +closepath stroke + 2.93 1.16 moveto + 3.08 1.32 lineto +closepath stroke + 3.17 0.89 moveto + 2.96 0.74 lineto +closepath stroke + 3.17 0.89 moveto + 3.05 1.03 lineto +closepath stroke + 3.17 0.89 moveto + 3.30 0.75 lineto +closepath stroke + 3.17 0.89 moveto + 3.20 1.19 lineto +closepath stroke + 3.17 0.89 moveto + 3.35 1.09 lineto +closepath stroke + 3.43 0.60 moveto + 3.19 0.30 lineto +closepath stroke + 3.43 0.60 moveto + 3.09 0.60 lineto +closepath stroke + 3.43 0.60 moveto + 3.30 0.75 lineto +closepath stroke + 3.43 0.60 moveto + 3.58 0.30 lineto +closepath stroke + 3.43 0.60 moveto + 3.48 0.94 lineto +closepath stroke + 3.43 0.60 moveto + 3.63 0.83 lineto +closepath stroke + 3.43 0.60 moveto + 3.81 0.70 lineto +closepath stroke + 3.72 0.00 moveto + 3.33 0.00 lineto +closepath stroke + 3.72 0.00 moveto + 3.58 0.30 lineto +closepath stroke + 3.72 0.00 moveto + 3.95 0.40 lineto +closepath stroke + 3.72 0.00 moveto + 4.14 0.26 lineto +closepath stroke + 3.72 0.00 moveto + 4.35 0.00 lineto +closepath stroke + 1.99 2.40 moveto + 2.01 2.28 lineto +closepath stroke + 1.99 2.40 moveto + 1.94 2.35 lineto +closepath stroke + 1.99 2.40 moveto + 2.07 2.34 lineto +closepath stroke + 1.99 2.40 moveto + 2.02 2.45 lineto +closepath stroke + 2.15 2.28 moveto + 2.16 2.14 lineto +closepath stroke + 2.15 2.28 moveto + 2.09 2.22 lineto +closepath stroke + 2.15 2.28 moveto + 2.07 2.34 lineto +closepath stroke + 2.15 2.28 moveto + 2.24 2.22 lineto +closepath stroke + 2.15 2.28 moveto + 2.10 2.39 lineto +closepath stroke + 2.15 2.28 moveto + 2.19 2.35 lineto +closepath stroke + 2.33 2.15 moveto + 2.25 2.07 lineto +closepath stroke + 2.33 2.15 moveto + 2.24 2.22 lineto +closepath stroke + 2.33 2.15 moveto + 2.42 2.08 lineto +closepath stroke + 2.33 2.15 moveto + 2.28 2.29 lineto +closepath stroke + 2.33 2.15 moveto + 2.38 2.24 lineto +closepath stroke + 2.52 2.01 moveto + 2.52 1.81 lineto +closepath stroke + 2.52 2.01 moveto + 2.43 1.91 lineto +closepath stroke + 2.52 2.01 moveto + 2.35 2.00 lineto +closepath stroke + 2.52 2.01 moveto + 2.42 2.08 lineto +closepath stroke + 2.52 2.01 moveto + 2.63 1.93 lineto +closepath stroke + 2.52 2.01 moveto + 2.48 2.17 lineto +closepath stroke + 2.52 2.01 moveto + 2.59 2.12 lineto +closepath stroke + 2.52 2.01 moveto + 2.71 2.07 lineto +closepath stroke + 2.74 1.85 moveto + 2.73 1.62 lineto +closepath stroke + 2.74 1.85 moveto + 2.63 1.73 lineto +closepath stroke + 2.74 1.85 moveto + 2.63 1.93 lineto +closepath stroke + 2.74 1.85 moveto + 2.85 1.77 lineto +closepath stroke + 2.74 1.85 moveto + 2.82 1.99 lineto +closepath stroke + 2.74 1.85 moveto + 2.95 1.93 lineto +closepath stroke + 2.97 1.68 moveto + 2.95 1.42 lineto +closepath stroke + 2.97 1.68 moveto + 2.85 1.54 lineto +closepath stroke + 2.97 1.68 moveto + 2.85 1.77 lineto +closepath stroke + 2.97 1.68 moveto + 3.10 1.58 lineto +closepath stroke + 2.97 1.68 moveto + 3.07 1.84 lineto +closepath stroke + 2.97 1.68 moveto + 3.22 1.78 lineto +closepath stroke + 3.23 1.49 moveto + 3.20 1.19 lineto +closepath stroke + 3.23 1.49 moveto + 3.08 1.32 lineto +closepath stroke + 3.23 1.49 moveto + 3.10 1.58 lineto +closepath stroke + 3.23 1.49 moveto + 3.38 1.39 lineto +closepath stroke + 3.23 1.49 moveto + 3.35 1.68 lineto +closepath stroke + 3.23 1.49 moveto + 3.51 1.61 lineto +closepath stroke + 3.52 1.28 moveto + 3.48 0.94 lineto +closepath stroke + 3.52 1.28 moveto + 3.35 1.09 lineto +closepath stroke + 3.52 1.28 moveto + 3.38 1.39 lineto +closepath stroke + 3.52 1.28 moveto + 3.68 1.17 lineto +closepath stroke + 3.52 1.28 moveto + 3.65 1.51 lineto +closepath stroke + 3.52 1.28 moveto + 3.83 1.43 lineto +closepath stroke + 3.84 1.05 moveto + 3.63 0.83 lineto +closepath stroke + 3.84 1.05 moveto + 3.68 1.17 lineto +closepath stroke + 3.84 1.05 moveto + 4.01 0.93 lineto +closepath stroke + 3.84 1.05 moveto + 3.99 1.31 lineto +closepath stroke + 3.84 1.05 moveto + 4.18 1.23 lineto +closepath stroke + 4.18 0.80 moveto + 3.95 0.40 lineto +closepath stroke + 4.18 0.80 moveto + 3.81 0.70 lineto +closepath stroke + 4.18 0.80 moveto + 4.01 0.93 lineto +closepath stroke + 4.18 0.80 moveto + 4.37 0.66 lineto +closepath stroke + 4.18 0.80 moveto + 4.36 1.10 lineto +closepath stroke + 4.18 0.80 moveto + 4.57 1.01 lineto +closepath stroke + 4.56 0.52 moveto + 4.14 0.26 lineto +closepath stroke + 4.56 0.52 moveto + 4.37 0.66 lineto +closepath stroke + 4.56 0.52 moveto + 4.77 0.26 lineto +closepath stroke + 4.56 0.52 moveto + 4.76 0.87 lineto +closepath stroke + 4.56 0.52 moveto + 5.00 0.76 lineto +closepath stroke + 4.98 0.00 moveto + 4.35 0.00 lineto +closepath stroke + 4.98 0.00 moveto + 4.77 0.26 lineto +closepath stroke + 4.98 0.00 moveto + 5.21 0.50 lineto +closepath stroke + 4.98 0.00 moveto + 5.47 0.38 lineto +closepath stroke + 4.98 0.00 moveto + 5.76 0.26 lineto +closepath stroke + 4.98 0.00 moveto + 6.07 0.00 lineto +closepath stroke + 2.05 2.51 moveto + 2.10 2.39 lineto +closepath stroke + 2.05 2.51 moveto + 2.02 2.45 lineto +closepath stroke + 2.05 2.51 moveto + 2.14 2.47 lineto +closepath stroke + 2.05 2.51 moveto + 2.07 2.57 lineto +closepath stroke + 2.23 2.42 moveto + 2.28 2.29 lineto +closepath stroke + 2.23 2.42 moveto + 2.19 2.35 lineto +closepath stroke + 2.23 2.42 moveto + 2.14 2.47 lineto +closepath stroke + 2.23 2.42 moveto + 2.33 2.38 lineto +closepath stroke + 2.23 2.42 moveto + 2.16 2.52 lineto +closepath stroke + 2.23 2.42 moveto + 2.26 2.50 lineto +closepath stroke + 2.43 2.34 moveto + 2.48 2.17 lineto +closepath stroke + 2.43 2.34 moveto + 2.38 2.24 lineto +closepath stroke + 2.43 2.34 moveto + 2.33 2.38 lineto +closepath stroke + 2.43 2.34 moveto + 2.54 2.29 lineto +closepath stroke + 2.43 2.34 moveto + 2.36 2.46 lineto +closepath stroke + 2.43 2.34 moveto + 2.46 2.44 lineto +closepath stroke + 2.65 2.24 moveto + 2.59 2.12 lineto +closepath stroke + 2.65 2.24 moveto + 2.54 2.29 lineto +closepath stroke + 2.65 2.24 moveto + 2.77 2.18 lineto +closepath stroke + 2.65 2.24 moveto + 2.58 2.39 lineto +closepath stroke + 2.65 2.24 moveto + 2.69 2.36 lineto +closepath stroke + 2.65 2.24 moveto + 2.82 2.33 lineto +closepath stroke + 2.90 2.13 moveto + 2.82 1.99 lineto +closepath stroke + 2.90 2.13 moveto + 2.71 2.07 lineto +closepath stroke + 2.90 2.13 moveto + 2.77 2.18 lineto +closepath stroke + 2.90 2.13 moveto + 3.03 2.07 lineto +closepath stroke + 2.90 2.13 moveto + 2.95 2.28 lineto +closepath stroke + 3.16 2.01 moveto + 3.07 1.84 lineto +closepath stroke + 3.16 2.01 moveto + 2.95 1.93 lineto +closepath stroke + 3.16 2.01 moveto + 3.03 2.07 lineto +closepath stroke + 3.16 2.01 moveto + 3.31 1.94 lineto +closepath stroke + 3.16 2.01 moveto + 3.08 2.22 lineto +closepath stroke + 3.16 2.01 moveto + 3.22 2.19 lineto +closepath stroke + 3.46 1.88 moveto + 3.35 1.68 lineto +closepath stroke + 3.46 1.88 moveto + 3.22 1.78 lineto +closepath stroke + 3.46 1.88 moveto + 3.31 1.94 lineto +closepath stroke + 3.46 1.88 moveto + 3.62 1.81 lineto +closepath stroke + 3.46 1.88 moveto + 3.37 2.12 lineto +closepath stroke + 3.46 1.88 moveto + 3.53 2.09 lineto +closepath stroke + 3.46 1.88 moveto + 3.70 2.05 lineto +closepath stroke + 3.78 1.73 moveto + 3.65 1.51 lineto +closepath stroke + 3.78 1.73 moveto + 3.51 1.61 lineto +closepath stroke + 3.78 1.73 moveto + 3.62 1.81 lineto +closepath stroke + 3.78 1.73 moveto + 3.96 1.65 lineto +closepath stroke + 3.78 1.73 moveto + 3.86 1.98 lineto +closepath stroke + 3.78 1.73 moveto + 4.05 1.94 lineto +closepath stroke + 4.14 1.58 moveto + 3.99 1.31 lineto +closepath stroke + 4.14 1.58 moveto + 3.83 1.43 lineto +closepath stroke + 4.14 1.58 moveto + 3.96 1.65 lineto +closepath stroke + 4.14 1.58 moveto + 4.33 1.49 lineto +closepath stroke + 4.14 1.58 moveto + 4.23 1.86 lineto +closepath stroke + 4.14 1.58 moveto + 4.44 1.82 lineto +closepath stroke + 4.53 1.40 moveto + 4.64 1.73 lineto +closepath stroke + 4.53 1.40 moveto + 4.87 1.68 lineto +closepath stroke + 4.53 1.40 moveto + 4.36 1.10 lineto +closepath stroke + 4.53 1.40 moveto + 4.18 1.23 lineto +closepath stroke + 4.53 1.40 moveto + 4.33 1.49 lineto +closepath stroke + 4.53 1.40 moveto + 4.74 1.31 lineto +closepath stroke + 4.96 1.21 moveto + 5.08 1.59 lineto +closepath stroke + 4.96 1.21 moveto + 5.34 1.53 lineto +closepath stroke + 4.96 1.21 moveto + 5.20 1.10 lineto +closepath stroke + 4.96 1.21 moveto + 4.76 0.87 lineto +closepath stroke + 4.96 1.21 moveto + 4.57 1.01 lineto +closepath stroke + 4.96 1.21 moveto + 4.74 1.31 lineto +closepath stroke + 5.43 1.00 moveto + 5.57 1.43 lineto +closepath stroke + 5.43 1.00 moveto + 5.85 1.37 lineto +closepath stroke + 5.43 1.00 moveto + 5.69 0.88 lineto +closepath stroke + 5.43 1.00 moveto + 5.20 1.10 lineto +closepath stroke + 5.43 1.00 moveto + 5.21 0.50 lineto +closepath stroke + 5.43 1.00 moveto + 5.00 0.76 lineto +closepath stroke + 5.96 0.77 moveto + 6.11 1.25 lineto +closepath stroke + 5.96 0.77 moveto + 6.42 1.19 lineto +closepath stroke + 5.96 0.77 moveto + 6.24 0.64 lineto +closepath stroke + 5.96 0.77 moveto + 5.69 0.88 lineto +closepath stroke + 5.96 0.77 moveto + 5.47 0.38 lineto +closepath stroke + 6.53 0.51 moveto + 6.71 1.06 lineto +closepath stroke + 6.53 0.51 moveto + 7.04 0.99 lineto +closepath stroke + 6.53 0.51 moveto + 6.84 0.26 lineto +closepath stroke + 6.53 0.51 moveto + 6.24 0.64 lineto +closepath stroke + 6.53 0.51 moveto + 5.76 0.26 lineto +closepath stroke + 7.16 0.00 moveto + 7.73 0.65 lineto +closepath stroke + 7.16 0.00 moveto + 8.14 0.57 lineto +closepath stroke + 7.16 0.00 moveto + 9.08 0.00 lineto +closepath stroke + 7.16 0.00 moveto + 7.36 0.73 lineto +closepath stroke + 7.16 0.00 moveto + 6.84 0.26 lineto +closepath stroke + 7.16 0.00 moveto + 6.07 0.00 lineto +closepath stroke + 2.09 2.63 moveto + 2.16 2.52 lineto +closepath stroke + 2.09 2.63 moveto + 2.07 2.57 lineto +closepath stroke + 2.09 2.63 moveto + 2.09 2.69 lineto +closepath stroke + 2.09 2.63 moveto + 2.18 2.60 lineto +closepath stroke + 2.28 2.58 moveto + 2.36 2.46 lineto +closepath stroke + 2.28 2.58 moveto + 2.26 2.50 lineto +closepath stroke + 2.28 2.58 moveto + 2.19 2.67 lineto +closepath stroke + 2.28 2.58 moveto + 2.29 2.67 lineto +closepath stroke + 2.28 2.58 moveto + 2.18 2.60 lineto +closepath stroke + 2.28 2.58 moveto + 2.39 2.56 lineto +closepath stroke + 2.50 2.54 moveto + 2.58 2.39 lineto +closepath stroke + 2.50 2.54 moveto + 2.46 2.44 lineto +closepath stroke + 2.50 2.54 moveto + 2.40 2.64 lineto +closepath stroke + 2.50 2.54 moveto + 2.51 2.64 lineto +closepath stroke + 2.50 2.54 moveto + 2.39 2.56 lineto +closepath stroke + 2.50 2.54 moveto + 2.62 2.51 lineto +closepath stroke + 2.73 2.49 moveto + 2.63 2.62 lineto +closepath stroke + 2.73 2.49 moveto + 2.75 2.62 lineto +closepath stroke + 2.73 2.49 moveto + 2.62 2.51 lineto +closepath stroke + 2.73 2.49 moveto + 2.69 2.36 lineto +closepath stroke + 2.73 2.49 moveto + 2.86 2.46 lineto +closepath stroke + 2.99 2.43 moveto + 3.08 2.22 lineto +closepath stroke + 2.99 2.43 moveto + 2.95 2.28 lineto +closepath stroke + 2.99 2.43 moveto + 2.88 2.59 lineto +closepath stroke + 2.99 2.43 moveto + 3.01 2.59 lineto +closepath stroke + 2.99 2.43 moveto + 2.86 2.46 lineto +closepath stroke + 2.99 2.43 moveto + 2.82 2.33 lineto +closepath stroke + 2.99 2.43 moveto + 3.14 2.40 lineto +closepath stroke + 3.28 2.37 moveto + 3.37 2.12 lineto +closepath stroke + 3.28 2.37 moveto + 3.22 2.19 lineto +closepath stroke + 3.28 2.37 moveto + 3.15 2.56 lineto +closepath stroke + 3.28 2.37 moveto + 3.30 2.56 lineto +closepath stroke + 3.28 2.37 moveto + 3.14 2.40 lineto +closepath stroke + 3.28 2.37 moveto + 3.44 2.34 lineto +closepath stroke + 3.60 2.30 moveto + 3.46 2.53 lineto +closepath stroke + 3.60 2.30 moveto + 3.62 2.53 lineto +closepath stroke + 3.60 2.30 moveto + 3.44 2.34 lineto +closepath stroke + 3.60 2.30 moveto + 3.53 2.09 lineto +closepath stroke + 3.60 2.30 moveto + 3.77 2.27 lineto +closepath stroke + 3.94 2.23 moveto + 3.79 2.49 lineto +closepath stroke + 3.94 2.23 moveto + 3.97 2.49 lineto +closepath stroke + 3.94 2.23 moveto + 3.77 2.27 lineto +closepath stroke + 3.94 2.23 moveto + 3.86 1.98 lineto +closepath stroke + 3.94 2.23 moveto + 3.70 2.05 lineto +closepath stroke + 3.94 2.23 moveto + 4.13 2.19 lineto +closepath stroke + 4.32 2.15 moveto + 4.16 2.45 lineto +closepath stroke + 4.32 2.15 moveto + 4.36 2.45 lineto +closepath stroke + 4.32 2.15 moveto + 4.13 2.19 lineto +closepath stroke + 4.32 2.15 moveto + 4.23 1.86 lineto +closepath stroke + 4.32 2.15 moveto + 4.05 1.94 lineto +closepath stroke + 4.32 2.15 moveto + 4.53 2.11 lineto +closepath stroke + 4.74 2.06 moveto + 4.97 2.01 lineto +closepath stroke + 4.74 2.06 moveto + 4.64 1.73 lineto +closepath stroke + 4.74 2.06 moveto + 4.57 2.41 lineto +closepath stroke + 4.74 2.06 moveto + 4.78 2.41 lineto +closepath stroke + 4.74 2.06 moveto + 4.53 2.11 lineto +closepath stroke + 4.74 2.06 moveto + 4.44 1.82 lineto +closepath stroke + 5.20 1.96 moveto + 5.46 1.91 lineto +closepath stroke + 5.20 1.96 moveto + 5.08 1.59 lineto +closepath stroke + 5.20 1.96 moveto + 5.25 2.36 lineto +closepath stroke + 5.20 1.96 moveto + 4.87 1.68 lineto +closepath stroke + 5.20 1.96 moveto + 4.97 2.01 lineto +closepath stroke + 5.20 1.96 moveto + 5.01 2.36 lineto +closepath stroke + 5.71 1.85 moveto + 5.99 1.80 lineto +closepath stroke + 5.71 1.85 moveto + 5.57 1.43 lineto +closepath stroke + 5.71 1.85 moveto + 6.04 2.30 lineto +closepath stroke + 5.71 1.85 moveto + 5.34 1.53 lineto +closepath stroke + 5.71 1.85 moveto + 5.46 1.91 lineto +closepath stroke + 5.71 1.85 moveto + 5.50 2.30 lineto +closepath stroke + 5.71 1.85 moveto + 5.76 2.30 lineto +closepath stroke + 6.27 1.74 moveto + 6.58 1.67 lineto +closepath stroke + 6.27 1.74 moveto + 6.11 1.25 lineto +closepath stroke + 6.27 1.74 moveto + 6.64 2.24 lineto +closepath stroke + 6.27 1.74 moveto + 5.85 1.37 lineto +closepath stroke + 6.27 1.74 moveto + 5.99 1.80 lineto +closepath stroke + 6.27 1.74 moveto + 6.32 2.24 lineto +closepath stroke + 6.88 1.61 moveto + 7.29 2.18 lineto +closepath stroke + 6.88 1.61 moveto + 7.22 1.53 lineto +closepath stroke + 6.88 1.61 moveto + 6.71 1.06 lineto +closepath stroke + 6.88 1.61 moveto + 6.42 1.19 lineto +closepath stroke + 6.88 1.61 moveto + 6.58 1.67 lineto +closepath stroke + 6.88 1.61 moveto + 6.94 2.18 lineto +closepath stroke + 7.56 1.46 moveto + 7.63 2.11 lineto +closepath stroke + 7.56 1.46 moveto + 7.93 1.38 lineto +closepath stroke + 7.56 1.46 moveto + 7.36 0.73 lineto +closepath stroke + 7.56 1.46 moveto + 7.22 1.53 lineto +closepath stroke + 7.56 1.46 moveto + 7.04 0.99 lineto +closepath stroke + 8.30 1.30 moveto + 8.38 2.03 lineto +closepath stroke + 8.30 1.30 moveto + 8.71 1.22 lineto +closepath stroke + 8.30 1.30 moveto + 7.73 0.65 lineto +closepath stroke + 8.30 1.30 moveto + 8.00 2.03 lineto +closepath stroke + 8.30 1.30 moveto + 7.93 1.38 lineto +closepath stroke + 9.12 1.13 moveto + 9.20 1.94 lineto +closepath stroke + 9.12 1.13 moveto + 10.06 1.03 lineto +closepath stroke + 9.12 1.13 moveto + 10.06 0.57 lineto +closepath stroke + 9.12 1.13 moveto + 8.79 1.94 lineto +closepath stroke + 9.12 1.13 moveto + 8.71 1.22 lineto +closepath stroke + 9.12 1.13 moveto + 8.14 0.57 lineto +closepath stroke + 11.00 0.94 moveto + 10.14 1.84 lineto +closepath stroke + 11.00 0.94 moveto + 11.00 1.84 lineto +closepath stroke + 11.00 0.94 moveto + 10.06 1.03 lineto +closepath stroke + 11.00 0.94 moveto + 11.00 0.47 lineto +closepath stroke + 2.29 2.83 moveto + 2.20 2.75 lineto +closepath stroke + 2.29 2.83 moveto + 2.19 2.83 lineto +closepath stroke + 2.29 2.83 moveto + 2.39 2.94 lineto +closepath stroke + 2.29 2.83 moveto + 2.40 2.86 lineto +closepath stroke + 2.20 2.75 moveto + 2.19 2.83 lineto +closepath stroke + 2.20 2.75 moveto + 2.19 2.67 lineto +closepath stroke + 2.20 2.75 moveto + 2.29 2.67 lineto +closepath stroke + 2.19 2.83 moveto + 2.18 2.90 lineto +closepath stroke + 2.19 2.83 moveto + 2.09 2.81 lineto +closepath stroke + 2.18 2.90 moveto + 2.09 2.81 lineto +closepath stroke + 2.18 2.90 moveto + 2.17 2.96 lineto +closepath stroke + 2.18 2.90 moveto + 2.07 2.93 lineto +closepath stroke + 2.51 2.86 moveto + 2.41 2.75 lineto +closepath stroke + 2.51 2.86 moveto + 2.40 2.86 lineto +closepath stroke + 2.51 2.86 moveto + 2.62 2.99 lineto +closepath stroke + 2.51 2.86 moveto + 2.63 2.88 lineto +closepath stroke + 2.41 2.75 moveto + 2.40 2.86 lineto +closepath stroke + 2.41 2.75 moveto + 2.40 2.64 lineto +closepath stroke + 2.41 2.75 moveto + 2.51 2.64 lineto +closepath stroke + 2.40 2.86 moveto + 2.39 2.94 lineto +closepath stroke + 2.39 2.94 moveto + 2.36 3.02 lineto +closepath stroke + 2.39 2.94 moveto + 2.26 3.00 lineto +closepath stroke + 2.75 2.88 moveto + 2.64 2.75 lineto +closepath stroke + 2.75 2.88 moveto + 2.63 2.88 lineto +closepath stroke + 2.75 2.88 moveto + 2.86 3.04 lineto +closepath stroke + 2.75 2.88 moveto + 2.88 2.91 lineto +closepath stroke + 2.64 2.75 moveto + 2.63 2.88 lineto +closepath stroke + 2.64 2.75 moveto + 2.63 2.62 lineto +closepath stroke + 2.64 2.75 moveto + 2.75 2.62 lineto +closepath stroke + 2.63 2.88 moveto + 2.62 2.99 lineto +closepath stroke + 2.62 2.99 moveto + 2.58 3.09 lineto +closepath stroke + 2.62 2.99 moveto + 2.46 3.06 lineto +closepath stroke + 3.01 2.91 moveto + 2.90 2.75 lineto +closepath stroke + 3.01 2.91 moveto + 2.88 2.91 lineto +closepath stroke + 3.01 2.91 moveto + 3.14 3.10 lineto +closepath stroke + 3.01 2.91 moveto + 3.15 2.94 lineto +closepath stroke + 2.90 2.75 moveto + 2.88 2.91 lineto +closepath stroke + 2.90 2.75 moveto + 2.88 2.59 lineto +closepath stroke + 2.90 2.75 moveto + 3.01 2.59 lineto +closepath stroke + 2.88 2.91 moveto + 2.86 3.04 lineto +closepath stroke + 2.86 3.04 moveto + 2.82 3.17 lineto +closepath stroke + 2.86 3.04 moveto + 2.69 3.14 lineto +closepath stroke + 3.30 2.94 moveto + 3.17 2.75 lineto +closepath stroke + 3.30 2.94 moveto + 3.15 2.94 lineto +closepath stroke + 3.30 2.94 moveto + 3.44 3.16 lineto +closepath stroke + 3.30 2.94 moveto + 3.46 2.97 lineto +closepath stroke + 3.17 2.75 moveto + 3.15 2.94 lineto +closepath stroke + 3.17 2.75 moveto + 3.15 2.56 lineto +closepath stroke + 3.17 2.75 moveto + 3.30 2.56 lineto +closepath stroke + 3.15 2.94 moveto + 3.14 3.10 lineto +closepath stroke + 3.14 3.10 moveto + 3.09 3.25 lineto +closepath stroke + 3.14 3.10 moveto + 2.95 3.22 lineto +closepath stroke + 3.62 2.97 moveto + 3.48 2.75 lineto +closepath stroke + 3.62 2.97 moveto + 3.46 2.97 lineto +closepath stroke + 3.62 2.97 moveto + 3.77 3.23 lineto +closepath stroke + 3.62 2.97 moveto + 3.79 3.01 lineto +closepath stroke + 3.48 2.75 moveto + 3.46 2.97 lineto +closepath stroke + 3.48 2.75 moveto + 3.46 2.53 lineto +closepath stroke + 3.48 2.75 moveto + 3.62 2.53 lineto +closepath stroke + 3.46 2.97 moveto + 3.44 3.16 lineto +closepath stroke + 3.44 3.16 moveto + 3.38 3.34 lineto +closepath stroke + 3.44 3.16 moveto + 3.22 3.31 lineto +closepath stroke + 3.97 3.01 moveto + 3.82 2.75 lineto +closepath stroke + 3.97 3.01 moveto + 3.79 3.01 lineto +closepath stroke + 3.97 3.01 moveto + 4.13 3.31 lineto +closepath stroke + 3.97 3.01 moveto + 4.16 3.05 lineto +closepath stroke + 3.82 2.75 moveto + 3.79 3.01 lineto +closepath stroke + 3.82 2.75 moveto + 3.79 2.49 lineto +closepath stroke + 3.82 2.75 moveto + 3.97 2.49 lineto +closepath stroke + 3.79 3.01 moveto + 3.77 3.23 lineto +closepath stroke + 3.77 3.23 moveto + 3.70 3.45 lineto +closepath stroke + 3.77 3.23 moveto + 3.53 3.41 lineto +closepath stroke + 4.36 3.05 moveto + 4.19 2.75 lineto +closepath stroke + 4.36 3.05 moveto + 4.16 3.05 lineto +closepath stroke + 4.36 3.05 moveto + 4.53 3.39 lineto +closepath stroke + 4.36 3.05 moveto + 4.57 3.09 lineto +closepath stroke + 4.19 2.75 moveto + 4.16 3.05 lineto +closepath stroke + 4.19 2.75 moveto + 4.16 2.45 lineto +closepath stroke + 4.19 2.75 moveto + 4.36 2.45 lineto +closepath stroke + 4.16 3.05 moveto + 4.13 3.31 lineto +closepath stroke + 4.13 3.31 moveto + 4.05 3.56 lineto +closepath stroke + 4.13 3.31 moveto + 3.86 3.52 lineto +closepath stroke + 4.78 3.09 moveto + 4.60 2.75 lineto +closepath stroke + 4.78 3.09 moveto + 4.57 3.09 lineto +closepath stroke + 4.78 3.09 moveto + 4.97 3.49 lineto +closepath stroke + 4.78 3.09 moveto + 5.01 3.14 lineto +closepath stroke + 4.60 2.75 moveto + 4.57 3.09 lineto +closepath stroke + 4.60 2.75 moveto + 4.57 2.41 lineto +closepath stroke + 4.60 2.75 moveto + 4.78 2.41 lineto +closepath stroke + 4.57 3.09 moveto + 4.53 3.39 lineto +closepath stroke + 4.53 3.39 moveto + 4.44 3.68 lineto +closepath stroke + 4.53 3.39 moveto + 4.23 3.64 lineto +closepath stroke + 5.25 3.14 moveto + 5.05 2.75 lineto +closepath stroke + 5.25 3.14 moveto + 5.01 3.14 lineto +closepath stroke + 5.25 3.14 moveto + 5.46 3.59 lineto +closepath stroke + 5.25 3.14 moveto + 5.50 3.20 lineto +closepath stroke + 5.05 2.75 moveto + 5.01 3.14 lineto +closepath stroke + 5.05 2.75 moveto + 5.01 2.36 lineto +closepath stroke + 5.05 2.75 moveto + 5.25 2.36 lineto +closepath stroke + 5.01 3.14 moveto + 4.97 3.49 lineto +closepath stroke + 4.97 3.49 moveto + 4.87 3.82 lineto +closepath stroke + 4.97 3.49 moveto + 4.64 3.77 lineto +closepath stroke + 5.76 3.20 moveto + 6.04 3.20 lineto +closepath stroke + 5.76 3.20 moveto + 6.09 2.75 lineto +closepath stroke + 5.76 3.20 moveto + 5.50 3.20 lineto +closepath stroke + 5.76 3.20 moveto + 5.55 2.75 lineto +closepath stroke + 6.04 3.20 moveto + 6.09 2.75 lineto +closepath stroke + 6.04 3.20 moveto + 5.99 3.70 lineto +closepath stroke + 6.04 3.20 moveto + 6.32 3.26 lineto +closepath stroke + 6.09 2.75 moveto + 6.04 2.30 lineto +closepath stroke + 6.09 2.75 moveto + 5.76 2.30 lineto +closepath stroke + 5.50 3.20 moveto + 5.55 2.75 lineto +closepath stroke + 5.50 3.20 moveto + 5.46 3.59 lineto +closepath stroke + 5.55 2.75 moveto + 5.76 2.30 lineto +closepath stroke + 5.55 2.75 moveto + 5.50 2.30 lineto +closepath stroke + 5.46 3.59 moveto + 5.34 3.97 lineto +closepath stroke + 5.46 3.59 moveto + 5.08 3.91 lineto +closepath stroke + 6.32 3.26 moveto + 6.64 3.26 lineto +closepath stroke + 6.32 3.26 moveto + 6.69 2.75 lineto +closepath stroke + 6.32 3.26 moveto + 5.99 3.70 lineto +closepath stroke + 6.64 3.26 moveto + 6.69 2.75 lineto +closepath stroke + 6.64 3.26 moveto + 6.58 3.83 lineto +closepath stroke + 6.64 3.26 moveto + 6.94 3.32 lineto +closepath stroke + 6.69 2.75 moveto + 6.64 2.24 lineto +closepath stroke + 6.69 2.75 moveto + 6.32 2.24 lineto +closepath stroke + 5.99 3.70 moveto + 5.85 4.13 lineto +closepath stroke + 5.99 3.70 moveto + 5.57 4.07 lineto +closepath stroke + 6.58 3.83 moveto + 6.94 3.32 lineto +closepath stroke + 6.58 3.83 moveto + 6.42 4.31 lineto +closepath stroke + 6.58 3.83 moveto + 6.11 4.25 lineto +closepath stroke + 6.94 3.32 moveto + 7.22 3.97 lineto +closepath stroke + 6.94 3.32 moveto + 7.28 3.39 lineto +closepath stroke + 7.28 3.39 moveto + 7.63 3.39 lineto +closepath stroke + 7.28 3.39 moveto + 7.35 2.75 lineto +closepath stroke + 7.28 3.39 moveto + 7.22 3.97 lineto +closepath stroke + 7.63 3.39 moveto + 7.35 2.75 lineto +closepath stroke + 7.63 3.39 moveto + 7.93 4.12 lineto +closepath stroke + 7.63 3.39 moveto + 8.00 3.47 lineto +closepath stroke + 7.35 2.75 moveto + 7.29 2.18 lineto +closepath stroke + 7.35 2.75 moveto + 6.94 2.18 lineto +closepath stroke + 7.22 3.97 moveto + 7.04 4.51 lineto +closepath stroke + 7.22 3.97 moveto + 6.71 4.44 lineto +closepath stroke + 8.00 3.47 moveto + 8.38 3.47 lineto +closepath stroke + 8.00 3.47 moveto + 8.07 2.75 lineto +closepath stroke + 8.00 3.47 moveto + 7.93 4.12 lineto +closepath stroke + 8.38 3.47 moveto + 8.07 2.75 lineto +closepath stroke + 8.38 3.47 moveto + 8.71 4.28 lineto +closepath stroke + 8.38 3.47 moveto + 8.79 3.56 lineto +closepath stroke + 8.07 2.75 moveto + 8.38 2.03 lineto +closepath stroke + 8.07 2.75 moveto + 8.00 2.03 lineto +closepath stroke + 7.93 4.12 moveto + 7.36 4.77 lineto +closepath stroke + 7.93 4.12 moveto + 7.73 4.85 lineto +closepath stroke + 8.79 3.56 moveto + 9.20 3.56 lineto +closepath stroke + 8.79 3.56 moveto + 8.87 2.75 lineto +closepath stroke + 8.79 3.56 moveto + 8.71 4.28 lineto +closepath stroke + 9.20 3.56 moveto + 8.87 2.75 lineto +closepath stroke + 9.20 3.56 moveto + 10.06 4.47 lineto +closepath stroke + 9.20 3.56 moveto + 10.14 3.66 lineto +closepath stroke + 8.87 2.75 moveto + 9.20 1.94 lineto +closepath stroke + 8.87 2.75 moveto + 8.79 1.94 lineto +closepath stroke + 8.71 4.28 moveto + 7.73 4.85 lineto +closepath stroke + 8.71 4.28 moveto + 8.14 4.93 lineto +closepath stroke + 10.06 4.93 moveto + 11.00 5.03 lineto +closepath stroke + 10.06 4.93 moveto + 10.06 4.47 lineto +closepath stroke + 10.06 4.93 moveto + 9.08 5.50 lineto +closepath stroke + 10.06 4.93 moveto + 8.14 4.93 lineto +closepath stroke + 11.00 5.03 moveto + 10.06 4.47 lineto +closepath stroke + 10.06 4.47 moveto + 10.14 3.66 lineto +closepath stroke + 10.14 3.66 moveto + 11.00 3.66 lineto +closepath stroke + 10.14 3.66 moveto + 10.14 2.75 lineto +closepath stroke + 11.00 3.66 moveto + 10.14 2.75 lineto +closepath stroke + 10.14 2.75 moveto + 11.00 1.84 lineto +closepath stroke + 10.14 2.75 moveto + 10.14 1.84 lineto +closepath stroke + 2.17 2.96 moveto + 2.07 2.93 lineto +closepath stroke + 2.17 2.96 moveto + 2.14 3.03 lineto +closepath stroke + 2.17 2.96 moveto + 2.26 3.00 lineto +closepath stroke + 2.36 3.02 moveto + 2.26 3.00 lineto +closepath stroke + 2.36 3.02 moveto + 2.33 3.12 lineto +closepath stroke + 2.36 3.02 moveto + 2.46 3.06 lineto +closepath stroke + 2.26 3.00 moveto + 2.14 3.03 lineto +closepath stroke + 2.14 3.03 moveto + 2.19 3.15 lineto +closepath stroke + 2.14 3.03 moveto + 2.10 3.11 lineto +closepath stroke + 2.58 3.09 moveto + 2.46 3.06 lineto +closepath stroke + 2.58 3.09 moveto + 2.54 3.21 lineto +closepath stroke + 2.58 3.09 moveto + 2.69 3.14 lineto +closepath stroke + 2.46 3.06 moveto + 2.33 3.12 lineto +closepath stroke + 2.33 3.12 moveto + 2.38 3.26 lineto +closepath stroke + 2.33 3.12 moveto + 2.28 3.21 lineto +closepath stroke + 2.82 3.17 moveto + 2.69 3.14 lineto +closepath stroke + 2.82 3.17 moveto + 2.77 3.32 lineto +closepath stroke + 2.82 3.17 moveto + 2.95 3.22 lineto +closepath stroke + 2.69 3.14 moveto + 2.54 3.21 lineto +closepath stroke + 2.54 3.21 moveto + 2.59 3.38 lineto +closepath stroke + 2.54 3.21 moveto + 2.48 3.33 lineto +closepath stroke + 3.09 3.25 moveto + 2.95 3.22 lineto +closepath stroke + 3.09 3.25 moveto + 3.03 3.43 lineto +closepath stroke + 3.09 3.25 moveto + 3.22 3.31 lineto +closepath stroke + 2.95 3.22 moveto + 2.77 3.32 lineto +closepath stroke + 2.77 3.32 moveto + 2.82 3.51 lineto +closepath stroke + 2.77 3.32 moveto + 2.69 3.46 lineto +closepath stroke + 3.38 3.34 moveto + 3.22 3.31 lineto +closepath stroke + 3.38 3.34 moveto + 3.31 3.56 lineto +closepath stroke + 3.38 3.34 moveto + 3.53 3.41 lineto +closepath stroke + 3.22 3.31 moveto + 3.03 3.43 lineto +closepath stroke + 3.03 3.43 moveto + 3.07 3.66 lineto +closepath stroke + 3.03 3.43 moveto + 2.93 3.60 lineto +closepath stroke + 3.70 3.45 moveto + 3.53 3.41 lineto +closepath stroke + 3.70 3.45 moveto + 3.62 3.69 lineto +closepath stroke + 3.70 3.45 moveto + 3.86 3.52 lineto +closepath stroke + 3.53 3.41 moveto + 3.31 3.56 lineto +closepath stroke + 3.31 3.56 moveto + 3.35 3.82 lineto +closepath stroke + 3.31 3.56 moveto + 3.20 3.75 lineto +closepath stroke + 4.05 3.56 moveto + 3.86 3.52 lineto +closepath stroke + 4.05 3.56 moveto + 3.96 3.85 lineto +closepath stroke + 4.05 3.56 moveto + 4.23 3.64 lineto +closepath stroke + 3.86 3.52 moveto + 3.62 3.69 lineto +closepath stroke + 3.62 3.69 moveto + 3.51 3.89 lineto +closepath stroke + 3.62 3.69 moveto + 3.35 3.82 lineto +closepath stroke + 4.44 3.68 moveto + 4.23 3.64 lineto +closepath stroke + 4.44 3.68 moveto + 4.33 4.01 lineto +closepath stroke + 4.44 3.68 moveto + 4.64 3.77 lineto +closepath stroke + 4.23 3.64 moveto + 3.96 3.85 lineto +closepath stroke + 3.96 3.85 moveto + 3.99 4.19 lineto +closepath stroke + 3.96 3.85 moveto + 3.81 4.11 lineto +closepath stroke + 4.87 3.82 moveto + 4.64 3.77 lineto +closepath stroke + 4.87 3.82 moveto + 4.74 4.19 lineto +closepath stroke + 4.87 3.82 moveto + 5.08 3.91 lineto +closepath stroke + 4.64 3.77 moveto + 4.33 4.01 lineto +closepath stroke + 4.33 4.01 moveto + 4.36 4.40 lineto +closepath stroke + 4.33 4.01 moveto + 4.16 4.31 lineto +closepath stroke + 5.34 3.97 moveto + 5.08 3.91 lineto +closepath stroke + 5.34 3.97 moveto + 5.20 4.40 lineto +closepath stroke + 5.34 3.97 moveto + 5.57 4.07 lineto +closepath stroke + 5.08 3.91 moveto + 4.74 4.19 lineto +closepath stroke + 4.74 4.19 moveto + 4.76 4.63 lineto +closepath stroke + 4.74 4.19 moveto + 4.55 4.54 lineto +closepath stroke + 5.85 4.13 moveto + 5.57 4.07 lineto +closepath stroke + 5.85 4.13 moveto + 5.69 4.62 lineto +closepath stroke + 5.85 4.13 moveto + 6.11 4.25 lineto +closepath stroke + 5.57 4.07 moveto + 5.20 4.40 lineto +closepath stroke + 5.20 4.40 moveto + 5.00 4.74 lineto +closepath stroke + 5.20 4.40 moveto + 4.76 4.63 lineto +closepath stroke + 6.42 4.31 moveto + 6.11 4.25 lineto +closepath stroke + 6.42 4.31 moveto + 6.24 4.86 lineto +closepath stroke + 6.42 4.31 moveto + 6.71 4.44 lineto +closepath stroke + 6.11 4.25 moveto + 5.69 4.62 lineto +closepath stroke + 5.69 4.62 moveto + 5.47 5.12 lineto +closepath stroke + 5.69 4.62 moveto + 5.21 5.00 lineto +closepath stroke + 7.04 4.51 moveto + 6.71 4.44 lineto +closepath stroke + 7.04 4.51 moveto + 6.84 5.24 lineto +closepath stroke + 7.04 4.51 moveto + 7.36 4.77 lineto +closepath stroke + 6.71 4.44 moveto + 6.24 4.86 lineto +closepath stroke + 6.24 4.86 moveto + 5.76 5.24 lineto +closepath stroke + 6.24 4.86 moveto + 5.47 5.12 lineto +closepath stroke + 9.08 5.50 moveto + 8.14 4.93 lineto +closepath stroke + 8.14 4.93 moveto + 7.73 4.85 lineto +closepath stroke + 7.73 4.85 moveto + 7.36 4.77 lineto +closepath stroke + 7.36 4.77 moveto + 6.84 5.24 lineto +closepath stroke + 6.84 5.24 moveto + 5.76 5.24 lineto +closepath stroke + 6.84 5.24 moveto + 6.07 5.50 lineto +closepath stroke + 11.00 1.84 moveto + 10.14 1.84 lineto +closepath stroke + 10.14 1.84 moveto + 10.06 1.03 lineto +closepath stroke + 10.14 1.84 moveto + 9.20 1.94 lineto +closepath stroke + 2.19 3.15 moveto + 2.10 3.11 lineto +closepath stroke + 2.19 3.15 moveto + 2.24 3.28 lineto +closepath stroke + 2.19 3.15 moveto + 2.28 3.21 lineto +closepath stroke + 2.10 3.11 moveto + 2.07 3.16 lineto +closepath stroke + 2.10 3.11 moveto + 2.02 3.05 lineto +closepath stroke + 2.07 3.16 moveto + 2.02 3.05 lineto +closepath stroke + 2.07 3.16 moveto + 2.09 3.28 lineto +closepath stroke + 2.07 3.16 moveto + 2.01 3.22 lineto +closepath stroke + 2.38 3.26 moveto + 2.28 3.21 lineto +closepath stroke + 2.38 3.26 moveto + 2.42 3.42 lineto +closepath stroke + 2.38 3.26 moveto + 2.48 3.33 lineto +closepath stroke + 2.28 3.21 moveto + 2.24 3.28 lineto +closepath stroke + 2.24 3.28 moveto + 2.25 3.43 lineto +closepath stroke + 2.24 3.28 moveto + 2.16 3.36 lineto +closepath stroke + 2.59 3.38 moveto + 2.48 3.33 lineto +closepath stroke + 2.59 3.38 moveto + 2.63 3.57 lineto +closepath stroke + 2.59 3.38 moveto + 2.69 3.46 lineto +closepath stroke + 2.48 3.33 moveto + 2.42 3.42 lineto +closepath stroke + 2.42 3.42 moveto + 2.43 3.59 lineto +closepath stroke + 2.42 3.42 moveto + 2.33 3.52 lineto +closepath stroke + 2.82 3.51 moveto + 2.69 3.46 lineto +closepath stroke + 2.82 3.51 moveto + 2.85 3.73 lineto +closepath stroke + 2.82 3.51 moveto + 2.93 3.60 lineto +closepath stroke + 2.69 3.46 moveto + 2.63 3.57 lineto +closepath stroke + 2.63 3.57 moveto + 2.63 3.77 lineto +closepath stroke + 2.63 3.57 moveto + 2.52 3.69 lineto +closepath stroke + 3.07 3.66 moveto + 2.93 3.60 lineto +closepath stroke + 3.07 3.66 moveto + 3.10 3.92 lineto +closepath stroke + 3.07 3.66 moveto + 3.20 3.75 lineto +closepath stroke + 2.93 3.60 moveto + 2.85 3.73 lineto +closepath stroke + 2.85 3.73 moveto + 2.85 3.96 lineto +closepath stroke + 2.85 3.73 moveto + 2.73 3.88 lineto +closepath stroke + 3.51 3.89 moveto + 3.35 3.82 lineto +closepath stroke + 3.51 3.89 moveto + 3.38 4.11 lineto +closepath stroke + 3.51 3.89 moveto + 3.65 3.99 lineto +closepath stroke + 3.35 3.82 moveto + 3.20 3.75 lineto +closepath stroke + 3.20 3.75 moveto + 3.10 3.92 lineto +closepath stroke + 3.10 3.92 moveto + 3.08 4.18 lineto +closepath stroke + 3.10 3.92 moveto + 2.95 4.08 lineto +closepath stroke + 3.38 4.11 moveto + 3.65 3.99 lineto +closepath stroke + 3.38 4.11 moveto + 3.23 4.28 lineto +closepath stroke + 3.38 4.11 moveto + 3.08 4.18 lineto +closepath stroke + 3.65 3.99 moveto + 3.68 4.33 lineto +closepath stroke + 3.65 3.99 moveto + 3.81 4.11 lineto +closepath stroke + 3.99 4.19 moveto + 3.81 4.11 lineto +closepath stroke + 3.99 4.19 moveto + 4.01 4.57 lineto +closepath stroke + 3.99 4.19 moveto + 4.16 4.31 lineto +closepath stroke + 3.81 4.11 moveto + 3.68 4.33 lineto +closepath stroke + 3.68 4.33 moveto + 3.50 4.53 lineto +closepath stroke + 3.68 4.33 moveto + 3.35 4.41 lineto +closepath stroke + 4.36 4.40 moveto + 4.16 4.31 lineto +closepath stroke + 4.36 4.40 moveto + 4.37 4.84 lineto +closepath stroke + 4.36 4.40 moveto + 4.55 4.54 lineto +closepath stroke + 4.16 4.31 moveto + 4.01 4.57 lineto +closepath stroke + 4.01 4.57 moveto + 3.81 4.80 lineto +closepath stroke + 4.01 4.57 moveto + 3.63 4.67 lineto +closepath stroke + 4.76 4.63 moveto + 4.55 4.54 lineto +closepath stroke + 4.76 4.63 moveto + 5.00 4.74 lineto +closepath stroke + 4.55 4.54 moveto + 4.37 4.84 lineto +closepath stroke + 4.37 4.84 moveto + 4.14 5.24 lineto +closepath stroke + 4.37 4.84 moveto + 3.95 5.10 lineto +closepath stroke + 5.00 4.74 moveto + 4.77 5.24 lineto +closepath stroke + 5.00 4.74 moveto + 5.21 5.00 lineto +closepath stroke + 5.76 5.24 moveto + 5.47 5.12 lineto +closepath stroke + 5.76 5.24 moveto + 6.07 5.50 lineto +closepath stroke + 5.47 5.12 moveto + 5.21 5.00 lineto +closepath stroke + 5.21 5.00 moveto + 4.77 5.24 lineto +closepath stroke + 4.77 5.24 moveto + 4.14 5.24 lineto +closepath stroke + 4.77 5.24 moveto + 4.35 5.50 lineto +closepath stroke + 2.09 3.28 moveto + 2.01 3.22 lineto +closepath stroke + 2.09 3.28 moveto + 2.11 3.43 lineto +closepath stroke + 2.09 3.28 moveto + 2.16 3.36 lineto +closepath stroke + 2.01 3.22 moveto + 1.97 3.27 lineto +closepath stroke + 2.01 3.22 moveto + 1.94 3.15 lineto +closepath stroke + 1.97 3.27 moveto + 1.94 3.15 lineto +closepath stroke + 1.97 3.27 moveto + 1.97 3.39 lineto +closepath stroke + 1.97 3.27 moveto + 1.90 3.32 lineto +closepath stroke + 2.25 3.43 moveto + 2.16 3.36 lineto +closepath stroke + 2.25 3.43 moveto + 2.26 3.60 lineto +closepath stroke + 2.25 3.43 moveto + 2.33 3.52 lineto +closepath stroke + 2.16 3.36 moveto + 2.11 3.43 lineto +closepath stroke + 2.11 3.43 moveto + 2.04 3.48 lineto +closepath stroke + 2.11 3.43 moveto + 1.97 3.39 lineto +closepath stroke + 2.43 3.59 moveto + 2.33 3.52 lineto +closepath stroke + 2.43 3.59 moveto + 2.43 3.79 lineto +closepath stroke + 2.43 3.59 moveto + 2.52 3.69 lineto +closepath stroke + 2.33 3.52 moveto + 2.26 3.60 lineto +closepath stroke + 2.26 3.60 moveto + 2.24 3.77 lineto +closepath stroke + 2.26 3.60 moveto + 2.16 3.68 lineto +closepath stroke + 2.63 3.77 moveto + 2.52 3.69 lineto +closepath stroke + 2.63 3.77 moveto + 2.62 3.99 lineto +closepath stroke + 2.63 3.77 moveto + 2.73 3.88 lineto +closepath stroke + 2.52 3.69 moveto + 2.43 3.79 lineto +closepath stroke + 2.43 3.79 moveto + 2.33 3.86 lineto +closepath stroke + 2.43 3.79 moveto + 2.24 3.77 lineto +closepath stroke + 2.85 3.96 moveto + 2.73 3.88 lineto +closepath stroke + 2.85 3.96 moveto + 2.83 4.22 lineto +closepath stroke + 2.85 3.96 moveto + 2.95 4.08 lineto +closepath stroke + 2.73 3.88 moveto + 2.62 3.99 lineto +closepath stroke + 2.62 3.99 moveto + 2.49 4.09 lineto +closepath stroke + 2.62 3.99 moveto + 2.39 3.98 lineto +closepath stroke + 3.23 4.28 moveto + 3.08 4.18 lineto +closepath stroke + 3.23 4.28 moveto + 3.05 4.47 lineto +closepath stroke + 3.23 4.28 moveto + 3.35 4.41 lineto +closepath stroke + 3.08 4.18 moveto + 2.95 4.08 lineto +closepath stroke + 2.95 4.08 moveto + 2.83 4.22 lineto +closepath stroke + 2.83 4.22 moveto + 2.67 4.33 lineto +closepath stroke + 2.83 4.22 moveto + 2.56 4.22 lineto +closepath stroke + 3.50 4.53 moveto + 3.35 4.41 lineto +closepath stroke + 3.50 4.53 moveto + 3.30 4.75 lineto +closepath stroke + 3.50 4.53 moveto + 3.63 4.67 lineto +closepath stroke + 3.35 4.41 moveto + 3.05 4.47 lineto +closepath stroke + 3.05 4.47 moveto + 2.96 4.76 lineto +closepath stroke + 3.05 4.47 moveto + 2.84 4.63 lineto +closepath stroke + 3.81 4.80 moveto + 3.63 4.67 lineto +closepath stroke + 3.81 4.80 moveto + 3.58 5.20 lineto +closepath stroke + 3.81 4.80 moveto + 3.95 5.10 lineto +closepath stroke + 3.63 4.67 moveto + 3.30 4.75 lineto +closepath stroke + 3.30 4.75 moveto + 3.09 4.90 lineto +closepath stroke + 3.30 4.75 moveto + 2.96 4.76 lineto +closepath stroke + 4.14 5.24 moveto + 3.95 5.10 lineto +closepath stroke + 4.14 5.24 moveto + 4.35 5.50 lineto +closepath stroke + 3.95 5.10 moveto + 3.58 5.20 lineto +closepath stroke + 3.58 5.20 moveto + 3.19 5.20 lineto +closepath stroke + 3.58 5.20 moveto + 3.33 5.50 lineto +closepath stroke + 1.97 3.39 moveto + 1.90 3.32 lineto +closepath stroke + 1.97 3.39 moveto + 2.04 3.48 lineto +closepath stroke + 1.90 3.32 moveto + 1.85 3.36 lineto +closepath stroke + 1.90 3.32 moveto + 1.85 3.23 lineto +closepath stroke + 1.85 3.36 moveto + 1.85 3.23 lineto +closepath stroke + 1.85 3.36 moveto + 1.82 3.48 lineto +closepath stroke + 1.85 3.36 moveto + 1.77 3.39 lineto +closepath stroke + 2.04 3.48 moveto + 1.95 3.54 lineto +closepath stroke + 2.04 3.48 moveto + 2.10 3.57 lineto +closepath stroke + 1.95 3.54 moveto + 2.10 3.57 lineto +closepath stroke + 1.95 3.54 moveto + 1.88 3.57 lineto +closepath stroke + 1.95 3.54 moveto + 1.82 3.48 lineto +closepath stroke + 2.10 3.57 moveto + 2.07 3.74 lineto +closepath stroke + 2.10 3.57 moveto + 2.16 3.68 lineto +closepath stroke + 2.33 3.86 moveto + 2.24 3.77 lineto +closepath stroke + 2.33 3.86 moveto + 2.20 3.96 lineto +closepath stroke + 2.33 3.86 moveto + 2.39 3.98 lineto +closepath stroke + 2.24 3.77 moveto + 2.16 3.68 lineto +closepath stroke + 2.16 3.68 moveto + 2.07 3.74 lineto +closepath stroke + 2.07 3.74 moveto + 1.97 3.78 lineto +closepath stroke + 2.07 3.74 moveto + 1.91 3.68 lineto +closepath stroke + 2.49 4.09 moveto + 2.39 3.98 lineto +closepath stroke + 2.49 4.09 moveto + 2.34 4.20 lineto +closepath stroke + 2.49 4.09 moveto + 2.56 4.22 lineto +closepath stroke + 2.39 3.98 moveto + 2.20 3.96 lineto +closepath stroke + 2.20 3.96 moveto + 2.08 4.01 lineto +closepath stroke + 2.20 3.96 moveto + 2.01 3.90 lineto +closepath stroke + 2.67 4.33 moveto + 2.56 4.22 lineto +closepath stroke + 2.67 4.33 moveto + 2.49 4.47 lineto +closepath stroke + 2.67 4.33 moveto + 2.75 4.47 lineto +closepath stroke + 2.56 4.22 moveto + 2.34 4.20 lineto +closepath stroke + 2.34 4.20 moveto + 2.24 4.40 lineto +closepath stroke + 2.34 4.20 moveto + 2.16 4.28 lineto +closepath stroke + 2.49 4.47 moveto + 2.75 4.47 lineto +closepath stroke + 2.49 4.47 moveto + 2.37 4.70 lineto +closepath stroke + 2.49 4.47 moveto + 2.29 4.56 lineto +closepath stroke + 2.75 4.47 moveto + 2.66 4.76 lineto +closepath stroke + 2.75 4.47 moveto + 2.84 4.63 lineto +closepath stroke + 3.09 4.90 moveto + 2.96 4.76 lineto +closepath stroke + 3.09 4.90 moveto + 3.19 5.20 lineto +closepath stroke + 3.09 4.90 moveto + 2.85 5.21 lineto +closepath stroke + 2.96 4.76 moveto + 2.84 4.63 lineto +closepath stroke + 2.84 4.63 moveto + 2.66 4.76 lineto +closepath stroke + 2.66 4.76 moveto + 2.51 5.02 lineto +closepath stroke + 2.66 4.76 moveto + 2.42 4.87 lineto +closepath stroke + 3.19 5.20 moveto + 2.85 5.21 lineto +closepath stroke + 3.19 5.20 moveto + 3.33 5.50 lineto +closepath stroke + 2.85 5.21 moveto + 2.61 5.31 lineto +closepath stroke + 2.85 5.21 moveto + 2.51 5.02 lineto +closepath stroke + 10.06 1.03 moveto + 9.20 1.94 lineto +closepath stroke + 10.06 1.03 moveto + 11.00 0.47 lineto +closepath stroke + 10.06 1.03 moveto + 10.06 0.57 lineto +closepath stroke + 9.20 1.94 moveto + 8.79 1.94 lineto +closepath stroke + 11.00 0.47 moveto + 10.06 0.57 lineto +closepath stroke + 10.06 0.57 moveto + 8.14 0.57 lineto +closepath stroke + 10.06 0.57 moveto + 9.08 0.00 lineto +closepath stroke + 8.79 1.94 moveto + 8.71 1.22 lineto +closepath stroke + 8.79 1.94 moveto + 8.38 2.03 lineto +closepath stroke + 1.82 3.48 moveto + 1.77 3.39 lineto +closepath stroke + 1.82 3.48 moveto + 1.88 3.57 lineto +closepath stroke + 1.77 3.39 moveto + 1.72 3.42 lineto +closepath stroke + 1.77 3.39 moveto + 1.74 3.30 lineto +closepath stroke + 1.72 3.42 moveto + 1.74 3.30 lineto +closepath stroke + 1.72 3.42 moveto + 1.65 3.43 lineto +closepath stroke + 1.72 3.42 moveto + 1.62 3.33 lineto +closepath stroke + 1.88 3.57 moveto + 1.78 3.62 lineto +closepath stroke + 1.88 3.57 moveto + 1.91 3.68 lineto +closepath stroke + 1.97 3.78 moveto + 1.91 3.68 lineto +closepath stroke + 1.97 3.78 moveto + 1.85 3.84 lineto +closepath stroke + 1.97 3.78 moveto + 2.01 3.90 lineto +closepath stroke + 1.91 3.68 moveto + 1.78 3.62 lineto +closepath stroke + 1.78 3.62 moveto + 1.70 3.63 lineto +closepath stroke + 1.78 3.62 moveto + 1.67 3.53 lineto +closepath stroke + 2.08 4.01 moveto + 2.01 3.90 lineto +closepath stroke + 2.08 4.01 moveto + 1.93 4.08 lineto +closepath stroke + 2.08 4.01 moveto + 2.12 4.14 lineto +closepath stroke + 2.01 3.90 moveto + 1.85 3.84 lineto +closepath stroke + 1.85 3.84 moveto + 1.75 3.86 lineto +closepath stroke + 1.85 3.84 moveto + 1.71 3.74 lineto +closepath stroke + 1.93 4.08 moveto + 2.12 4.14 lineto +closepath stroke + 1.93 4.08 moveto + 1.82 4.24 lineto +closepath stroke + 1.93 4.08 moveto + 1.77 4.11 lineto +closepath stroke + 2.12 4.14 moveto + 2.02 4.34 lineto +closepath stroke + 2.12 4.14 moveto + 2.16 4.28 lineto +closepath stroke + 2.24 4.40 moveto + 2.16 4.28 lineto +closepath stroke + 2.24 4.40 moveto + 2.11 4.64 lineto +closepath stroke + 2.24 4.40 moveto + 2.29 4.56 lineto +closepath stroke + 2.16 4.28 moveto + 2.02 4.34 lineto +closepath stroke + 2.02 4.34 moveto + 1.88 4.52 lineto +closepath stroke + 2.02 4.34 moveto + 1.83 4.38 lineto +closepath stroke + 2.37 4.70 moveto + 2.29 4.56 lineto +closepath stroke + 2.37 4.70 moveto + 2.22 4.96 lineto +closepath stroke + 2.37 4.70 moveto + 2.42 4.87 lineto +closepath stroke + 2.29 4.56 moveto + 2.11 4.64 lineto +closepath stroke + 2.11 4.64 moveto + 1.94 4.83 lineto +closepath stroke + 2.11 4.64 moveto + 1.89 4.68 lineto +closepath stroke + 2.61 5.31 moveto + 2.51 5.02 lineto +closepath stroke + 2.61 5.31 moveto + 2.61 5.50 lineto +closepath stroke + 2.61 5.31 moveto + 2.27 5.31 lineto +closepath stroke + 2.51 5.02 moveto + 2.42 4.87 lineto +closepath stroke + 2.42 4.87 moveto + 2.22 4.96 lineto +closepath stroke + 2.22 4.96 moveto + 2.00 5.00 lineto +closepath stroke + 2.22 4.96 moveto + 1.94 4.83 lineto +closepath stroke + 2.61 5.50 moveto + 2.27 5.31 lineto +closepath stroke + 2.27 5.31 moveto + 2.02 5.50 lineto +closepath stroke + 2.27 5.31 moveto + 2.02 5.31 lineto +closepath stroke + 1.65 3.43 moveto + 1.62 3.33 lineto +closepath stroke + 1.65 3.43 moveto + 1.57 3.45 lineto +closepath stroke + 1.65 3.43 moveto + 1.67 3.53 lineto +closepath stroke + 1.70 3.63 moveto + 1.67 3.53 lineto +closepath stroke + 1.70 3.63 moveto + 1.60 3.66 lineto +closepath stroke + 1.70 3.63 moveto + 1.71 3.74 lineto +closepath stroke + 1.67 3.53 moveto + 1.57 3.45 lineto +closepath stroke + 1.57 3.45 moveto + 1.50 3.55 lineto +closepath stroke + 1.57 3.45 moveto + 1.49 3.45 lineto +closepath stroke + 1.75 3.86 moveto + 1.71 3.74 lineto +closepath stroke + 1.75 3.86 moveto + 1.62 3.88 lineto +closepath stroke + 1.75 3.86 moveto + 1.76 3.98 lineto +closepath stroke + 1.71 3.74 moveto + 1.60 3.66 lineto +closepath stroke + 1.60 3.66 moveto + 1.50 3.76 lineto +closepath stroke + 1.60 3.66 moveto + 1.49 3.66 lineto +closepath stroke + 1.62 3.88 moveto + 1.76 3.98 lineto +closepath stroke + 1.62 3.88 moveto + 1.50 4.01 lineto +closepath stroke + 1.62 3.88 moveto + 1.49 3.88 lineto +closepath stroke + 1.76 3.98 moveto + 1.65 4.14 lineto +closepath stroke + 1.76 3.98 moveto + 1.77 4.11 lineto +closepath stroke + 1.82 4.24 moveto + 1.77 4.11 lineto +closepath stroke + 1.82 4.24 moveto + 1.68 4.42 lineto +closepath stroke + 1.82 4.24 moveto + 1.83 4.38 lineto +closepath stroke + 1.77 4.11 moveto + 1.65 4.14 lineto +closepath stroke + 1.65 4.14 moveto + 1.50 4.27 lineto +closepath stroke + 1.65 4.14 moveto + 1.49 4.14 lineto +closepath stroke + 1.88 4.52 moveto + 1.83 4.38 lineto +closepath stroke + 1.88 4.52 moveto + 1.71 4.72 lineto +closepath stroke + 1.88 4.52 moveto + 1.89 4.68 lineto +closepath stroke + 1.83 4.38 moveto + 1.68 4.42 lineto +closepath stroke + 1.68 4.42 moveto + 1.52 4.42 lineto +closepath stroke + 1.68 4.42 moveto + 1.50 4.27 lineto +closepath stroke + 2.00 5.00 moveto + 1.94 4.83 lineto +closepath stroke + 2.00 5.00 moveto + 1.74 5.19 lineto +closepath stroke + 2.00 5.00 moveto + 2.02 5.31 lineto +closepath stroke + 1.94 4.83 moveto + 1.89 4.68 lineto +closepath stroke + 1.89 4.68 moveto + 1.71 4.72 lineto +closepath stroke + 1.71 4.72 moveto + 1.52 4.72 lineto +closepath stroke + 1.71 4.72 moveto + 1.50 4.56 lineto +closepath stroke + 2.02 5.50 moveto + 2.02 5.31 lineto +closepath stroke + 2.02 5.31 moveto + 1.74 5.19 lineto +closepath stroke + 1.74 5.19 moveto + 1.52 5.19 lineto +closepath stroke + 1.74 5.19 moveto + 1.50 4.88 lineto +closepath stroke + 8.71 1.22 moveto + 8.38 2.03 lineto +closepath stroke + 8.71 1.22 moveto + 7.73 0.65 lineto +closepath stroke + 8.71 1.22 moveto + 8.14 0.57 lineto +closepath stroke + 8.38 2.03 moveto + 8.00 2.03 lineto +closepath stroke + 1.50 3.55 moveto + 1.49 3.45 lineto +closepath stroke + 1.50 3.55 moveto + 1.40 3.66 lineto +closepath stroke + 1.50 3.55 moveto + 1.49 3.66 lineto +closepath stroke + 1.49 3.45 moveto + 1.43 3.45 lineto +closepath stroke + 1.49 3.45 moveto + 1.50 3.35 lineto +closepath stroke + 1.43 3.45 moveto + 1.50 3.35 lineto +closepath stroke + 1.43 3.45 moveto + 1.37 3.43 lineto +closepath stroke + 1.43 3.45 moveto + 1.38 3.33 lineto +closepath stroke + 1.50 3.76 moveto + 1.49 3.66 lineto +closepath stroke + 1.50 3.76 moveto + 1.38 3.88 lineto +closepath stroke + 1.50 3.76 moveto + 1.49 3.88 lineto +closepath stroke + 1.49 3.66 moveto + 1.40 3.66 lineto +closepath stroke + 1.40 3.66 moveto + 1.32 3.64 lineto +closepath stroke + 1.40 3.66 moveto + 1.33 3.53 lineto +closepath stroke + 1.50 4.01 moveto + 1.49 3.88 lineto +closepath stroke + 1.50 4.01 moveto + 1.35 4.14 lineto +closepath stroke + 1.50 4.01 moveto + 1.49 4.14 lineto +closepath stroke + 1.49 3.88 moveto + 1.38 3.88 lineto +closepath stroke + 1.38 3.88 moveto + 1.28 3.86 lineto +closepath stroke + 1.38 3.88 moveto + 1.29 3.74 lineto +closepath stroke + 1.52 4.42 moveto + 1.50 4.27 lineto +closepath stroke + 1.52 4.42 moveto + 1.32 4.42 lineto +closepath stroke + 1.52 4.42 moveto + 1.50 4.56 lineto +closepath stroke + 1.50 4.27 moveto + 1.49 4.14 lineto +closepath stroke + 1.49 4.14 moveto + 1.35 4.14 lineto +closepath stroke + 1.35 4.14 moveto + 1.23 4.11 lineto +closepath stroke + 1.35 4.14 moveto + 1.24 3.98 lineto +closepath stroke + 1.52 4.72 moveto + 1.50 4.56 lineto +closepath stroke + 1.52 4.72 moveto + 1.29 4.72 lineto +closepath stroke + 1.52 4.72 moveto + 1.50 4.88 lineto +closepath stroke + 1.50 4.56 moveto + 1.32 4.42 lineto +closepath stroke + 1.32 4.42 moveto + 1.17 4.38 lineto +closepath stroke + 1.32 4.42 moveto + 1.18 4.24 lineto +closepath stroke + 1.52 5.19 moveto + 1.50 4.88 lineto +closepath stroke + 1.52 5.19 moveto + 1.50 5.50 lineto +closepath stroke + 1.52 5.19 moveto + 1.26 5.19 lineto +closepath stroke + 1.50 4.88 moveto + 1.29 4.72 lineto +closepath stroke + 1.29 4.72 moveto + 1.06 4.83 lineto +closepath stroke + 1.29 4.72 moveto + 1.07 4.67 lineto +closepath stroke + 1.50 5.50 moveto + 1.26 5.19 lineto +closepath stroke + 1.26 5.19 moveto + 0.98 5.31 lineto +closepath stroke + 1.26 5.19 moveto + 1.00 5.00 lineto +closepath stroke + 1.37 3.43 moveto + 1.38 3.33 lineto +closepath stroke + 1.37 3.43 moveto + 1.28 3.42 lineto +closepath stroke + 1.37 3.43 moveto + 1.33 3.53 lineto +closepath stroke + 1.32 3.64 moveto + 1.33 3.53 lineto +closepath stroke + 1.32 3.64 moveto + 1.22 3.62 lineto +closepath stroke + 1.32 3.64 moveto + 1.29 3.74 lineto +closepath stroke + 1.33 3.53 moveto + 1.28 3.42 lineto +closepath stroke + 1.28 3.42 moveto + 1.18 3.48 lineto +closepath stroke + 1.28 3.42 moveto + 1.21 3.38 lineto +closepath stroke + 1.28 3.86 moveto + 1.29 3.74 lineto +closepath stroke + 1.28 3.86 moveto + 1.15 3.84 lineto +closepath stroke + 1.28 3.86 moveto + 1.24 3.98 lineto +closepath stroke + 1.29 3.74 moveto + 1.22 3.62 lineto +closepath stroke + 1.22 3.62 moveto + 1.09 3.68 lineto +closepath stroke + 1.22 3.62 moveto + 1.12 3.57 lineto +closepath stroke + 1.23 4.11 moveto + 1.24 3.98 lineto +closepath stroke + 1.23 4.11 moveto + 1.07 4.08 lineto +closepath stroke + 1.23 4.11 moveto + 1.18 4.24 lineto +closepath stroke + 1.24 3.98 moveto + 1.15 3.84 lineto +closepath stroke + 1.15 3.84 moveto + 0.99 3.90 lineto +closepath stroke + 1.15 3.84 moveto + 1.03 3.78 lineto +closepath stroke + 1.17 4.38 moveto + 1.18 4.24 lineto +closepath stroke + 1.17 4.38 moveto + 0.98 4.34 lineto +closepath stroke + 1.17 4.38 moveto + 1.12 4.52 lineto +closepath stroke + 1.18 4.24 moveto + 1.07 4.08 lineto +closepath stroke + 1.07 4.08 moveto + 0.88 4.14 lineto +closepath stroke + 1.07 4.08 moveto + 0.92 4.01 lineto +closepath stroke + 0.98 4.34 moveto + 1.12 4.52 lineto +closepath stroke + 0.98 4.34 moveto + 0.76 4.40 lineto +closepath stroke + 0.98 4.34 moveto + 0.81 4.27 lineto +closepath stroke + 1.12 4.52 moveto + 0.89 4.64 lineto +closepath stroke + 1.12 4.52 moveto + 1.07 4.67 lineto +closepath stroke + 1.06 4.83 moveto + 1.07 4.67 lineto +closepath stroke + 1.06 4.83 moveto + 0.78 4.96 lineto +closepath stroke + 1.06 4.83 moveto + 1.00 5.00 lineto +closepath stroke + 1.07 4.67 moveto + 0.89 4.64 lineto +closepath stroke + 0.89 4.64 moveto + 0.71 4.56 lineto +closepath stroke + 0.89 4.64 moveto + 0.76 4.40 lineto +closepath stroke + 0.98 5.31 moveto + 1.00 5.00 lineto +closepath stroke + 0.98 5.31 moveto + 0.98 5.50 lineto +closepath stroke + 0.98 5.31 moveto + 0.73 5.31 lineto +closepath stroke + 1.00 5.00 moveto + 0.78 4.96 lineto +closepath stroke + 0.78 4.96 moveto + 0.58 4.87 lineto +closepath stroke + 0.78 4.96 moveto + 0.63 4.70 lineto +closepath stroke + 0.98 5.50 moveto + 0.73 5.31 lineto +closepath stroke + 0.73 5.31 moveto + 0.36 5.50 lineto +closepath stroke + 0.73 5.31 moveto + 0.36 5.31 lineto +closepath stroke + 0.36 5.50 moveto + 0.36 5.31 lineto +closepath stroke + 0.36 5.31 moveto + 0.49 5.02 lineto +closepath stroke + 0.36 5.31 moveto + 0.13 5.21 lineto +closepath stroke + 7.73 0.65 moveto + 8.14 0.57 lineto +closepath stroke + 7.73 0.65 moveto + 7.36 0.73 lineto +closepath stroke + 7.73 0.65 moveto + 7.93 1.38 lineto +closepath stroke + 8.14 0.57 moveto + 9.08 0.00 lineto +closepath stroke + 1.18 3.48 moveto + 1.21 3.38 lineto +closepath stroke + 1.18 3.48 moveto + 1.04 3.54 lineto +closepath stroke + 1.18 3.48 moveto + 1.12 3.57 lineto +closepath stroke + 1.21 3.38 moveto + 1.15 3.36 lineto +closepath stroke + 1.21 3.38 moveto + 1.26 3.30 lineto +closepath stroke + 1.15 3.36 moveto + 1.26 3.30 lineto +closepath stroke + 1.15 3.36 moveto + 1.10 3.32 lineto +closepath stroke + 1.15 3.36 moveto + 1.15 3.23 lineto +closepath stroke + 1.09 3.68 moveto + 1.12 3.57 lineto +closepath stroke + 1.09 3.68 moveto + 0.93 3.74 lineto +closepath stroke + 1.09 3.68 moveto + 1.03 3.78 lineto +closepath stroke + 1.12 3.57 moveto + 1.04 3.54 lineto +closepath stroke + 1.04 3.54 moveto + 0.98 3.49 lineto +closepath stroke + 1.04 3.54 moveto + 1.03 3.39 lineto +closepath stroke + 0.99 3.90 moveto + 1.03 3.78 lineto +closepath stroke + 0.99 3.90 moveto + 0.80 3.96 lineto +closepath stroke + 0.99 3.90 moveto + 0.92 4.01 lineto +closepath stroke + 1.03 3.78 moveto + 0.93 3.74 lineto +closepath stroke + 0.93 3.74 moveto + 0.76 3.77 lineto +closepath stroke + 0.93 3.74 moveto + 0.82 3.66 lineto +closepath stroke + 0.88 4.14 moveto + 0.92 4.01 lineto +closepath stroke + 0.88 4.14 moveto + 0.66 4.20 lineto +closepath stroke + 0.88 4.14 moveto + 0.81 4.27 lineto +closepath stroke + 0.92 4.01 moveto + 0.80 3.96 lineto +closepath stroke + 0.80 3.96 moveto + 0.61 3.98 lineto +closepath stroke + 0.80 3.96 moveto + 0.67 3.86 lineto +closepath stroke + 0.71 4.56 moveto + 0.76 4.40 lineto +closepath stroke + 0.71 4.56 moveto + 0.51 4.47 lineto +closepath stroke + 0.71 4.56 moveto + 0.63 4.70 lineto +closepath stroke + 0.76 4.40 moveto + 0.81 4.27 lineto +closepath stroke + 0.81 4.27 moveto + 0.66 4.20 lineto +closepath stroke + 0.66 4.20 moveto + 0.44 4.22 lineto +closepath stroke + 0.66 4.20 moveto + 0.51 4.09 lineto +closepath stroke + 0.58 4.87 moveto + 0.63 4.70 lineto +closepath stroke + 0.58 4.87 moveto + 0.49 5.02 lineto +closepath stroke + 0.58 4.87 moveto + 0.34 4.76 lineto +closepath stroke + 0.63 4.70 moveto + 0.51 4.47 lineto +closepath stroke + 0.51 4.47 moveto + 0.35 4.35 lineto +closepath stroke + 0.51 4.47 moveto + 0.44 4.22 lineto +closepath stroke + 0.49 5.02 moveto + 0.34 4.76 lineto +closepath stroke + 0.49 5.02 moveto + 0.13 5.21 lineto +closepath stroke + 0.34 4.76 moveto + 0.13 4.91 lineto +closepath stroke + 0.34 4.76 moveto + 0.21 4.76 lineto +closepath stroke + 0.13 5.21 moveto + 0.00 5.21 lineto +closepath stroke + 0.13 5.21 moveto + 0.13 4.91 lineto +closepath stroke + 0.13 4.91 moveto + 0.21 4.76 lineto +closepath stroke + 0.13 4.91 moveto + 0.00 5.21 lineto +closepath stroke + 0.21 4.76 moveto + 0.21 4.47 lineto +closepath stroke + 0.21 4.76 moveto + 0.00 4.63 lineto +closepath stroke + 1.10 3.32 moveto + 1.15 3.23 lineto +closepath stroke + 1.10 3.32 moveto + 1.03 3.27 lineto +closepath stroke + 1.10 3.32 moveto + 1.03 3.39 lineto +closepath stroke + 0.98 3.49 moveto + 1.03 3.39 lineto +closepath stroke + 0.98 3.49 moveto + 0.89 3.43 lineto +closepath stroke + 0.98 3.49 moveto + 0.90 3.57 lineto +closepath stroke + 1.03 3.39 moveto + 1.03 3.27 lineto +closepath stroke + 1.03 3.27 moveto + 0.91 3.28 lineto +closepath stroke + 1.03 3.27 moveto + 0.98 3.21 lineto +closepath stroke + 0.89 3.43 moveto + 0.90 3.57 lineto +closepath stroke + 0.89 3.43 moveto + 0.75 3.43 lineto +closepath stroke + 0.89 3.43 moveto + 0.82 3.35 lineto +closepath stroke + 0.90 3.57 moveto + 0.74 3.60 lineto +closepath stroke + 0.90 3.57 moveto + 0.82 3.66 lineto +closepath stroke + 0.76 3.77 moveto + 0.82 3.66 lineto +closepath stroke + 0.76 3.77 moveto + 0.57 3.79 lineto +closepath stroke + 0.76 3.77 moveto + 0.67 3.86 lineto +closepath stroke + 0.82 3.66 moveto + 0.74 3.60 lineto +closepath stroke + 0.74 3.60 moveto + 0.57 3.59 lineto +closepath stroke + 0.74 3.60 moveto + 0.65 3.50 lineto +closepath stroke + 0.61 3.98 moveto + 0.67 3.86 lineto +closepath stroke + 0.61 3.98 moveto + 0.38 3.99 lineto +closepath stroke + 0.61 3.98 moveto + 0.51 4.09 lineto +closepath stroke + 0.67 3.86 moveto + 0.57 3.79 lineto +closepath stroke + 0.57 3.79 moveto + 0.48 3.69 lineto +closepath stroke + 0.57 3.79 moveto + 0.57 3.59 lineto +closepath stroke + 0.35 4.35 moveto + 0.44 4.22 lineto +closepath stroke + 0.35 4.35 moveto + 0.21 4.47 lineto +closepath stroke + 0.35 4.35 moveto + 0.14 4.22 lineto +closepath stroke + 0.44 4.22 moveto + 0.51 4.09 lineto +closepath stroke + 0.51 4.09 moveto + 0.38 3.99 lineto +closepath stroke + 0.38 3.99 moveto + 0.27 3.88 lineto +closepath stroke + 0.38 3.99 moveto + 0.37 3.77 lineto +closepath stroke + 0.21 4.47 moveto + 0.14 4.22 lineto +closepath stroke + 0.21 4.47 moveto + 0.00 4.63 lineto +closepath stroke + 0.14 4.22 moveto + 0.14 3.88 lineto +closepath stroke + 0.14 4.22 moveto + 0.00 4.00 lineto +closepath stroke + 8.00 2.03 moveto + 7.93 1.38 lineto +closepath stroke + 8.00 2.03 moveto + 7.63 2.11 lineto +closepath stroke + 0.91 3.28 moveto + 0.98 3.21 lineto +closepath stroke + 0.91 3.28 moveto + 0.76 3.28 lineto +closepath stroke + 0.91 3.28 moveto + 0.82 3.35 lineto +closepath stroke + 0.98 3.21 moveto + 0.93 3.16 lineto +closepath stroke + 0.98 3.21 moveto + 1.06 3.15 lineto +closepath stroke + 0.93 3.16 moveto + 1.06 3.15 lineto +closepath stroke + 0.93 3.16 moveto + 0.90 3.11 lineto +closepath stroke + 0.93 3.16 moveto + 0.98 3.05 lineto +closepath stroke + 0.75 3.43 moveto + 0.82 3.35 lineto +closepath stroke + 0.75 3.43 moveto + 0.58 3.42 lineto +closepath stroke + 0.75 3.43 moveto + 0.65 3.50 lineto +closepath stroke + 0.82 3.35 moveto + 0.76 3.28 lineto +closepath stroke + 0.76 3.28 moveto + 0.72 3.21 lineto +closepath stroke + 0.76 3.28 moveto + 0.81 3.15 lineto +closepath stroke + 0.48 3.69 moveto + 0.57 3.59 lineto +closepath stroke + 0.48 3.69 moveto + 0.37 3.57 lineto +closepath stroke + 0.48 3.69 moveto + 0.37 3.77 lineto +closepath stroke + 0.57 3.59 moveto + 0.65 3.50 lineto +closepath stroke + 0.65 3.50 moveto + 0.58 3.42 lineto +closepath stroke + 0.58 3.42 moveto + 0.52 3.33 lineto +closepath stroke + 0.58 3.42 moveto + 0.62 3.26 lineto +closepath stroke + 0.27 3.88 moveto + 0.37 3.77 lineto +closepath stroke + 0.27 3.88 moveto + 0.14 3.88 lineto +closepath stroke + 0.27 3.88 moveto + 0.13 3.65 lineto +closepath stroke + 0.37 3.77 moveto + 0.37 3.57 lineto +closepath stroke + 0.37 3.57 moveto + 0.31 3.46 lineto +closepath stroke + 0.37 3.57 moveto + 0.41 3.38 lineto +closepath stroke + 0.14 3.88 moveto + 0.13 3.65 lineto +closepath stroke + 0.14 3.88 moveto + 0.00 4.00 lineto +closepath stroke + 0.13 3.65 moveto + 0.13 3.51 lineto +closepath stroke + 0.13 3.65 moveto + 0.00 3.51 lineto +closepath stroke + 7.93 1.38 moveto + 7.63 2.11 lineto +closepath stroke + 7.93 1.38 moveto + 7.36 0.73 lineto +closepath stroke + 7.63 2.11 moveto + 7.22 1.53 lineto +closepath stroke + 7.63 2.11 moveto + 7.29 2.18 lineto +closepath stroke + 0.90 3.11 moveto + 0.98 3.05 lineto +closepath stroke + 0.90 3.11 moveto + 0.86 3.03 lineto +closepath stroke + 0.90 3.11 moveto + 0.81 3.15 lineto +closepath stroke + 0.72 3.21 moveto + 0.81 3.15 lineto +closepath stroke + 0.72 3.21 moveto + 0.67 3.12 lineto +closepath stroke + 0.72 3.21 moveto + 0.62 3.26 lineto +closepath stroke + 0.81 3.15 moveto + 0.86 3.03 lineto +closepath stroke + 0.86 3.03 moveto + 0.74 3.00 lineto +closepath stroke + 0.86 3.03 moveto + 0.83 2.96 lineto +closepath stroke + 0.52 3.33 moveto + 0.62 3.26 lineto +closepath stroke + 0.52 3.33 moveto + 0.41 3.38 lineto +closepath stroke + 0.52 3.33 moveto + 0.46 3.21 lineto +closepath stroke + 0.62 3.26 moveto + 0.67 3.12 lineto +closepath stroke + 0.67 3.12 moveto + 0.64 3.04 lineto +closepath stroke + 0.67 3.12 moveto + 0.74 3.00 lineto +closepath stroke + 0.31 3.46 moveto + 0.41 3.38 lineto +closepath stroke + 0.31 3.46 moveto + 0.13 3.51 lineto +closepath stroke + 0.31 3.46 moveto + 0.17 3.32 lineto +closepath stroke + 0.41 3.38 moveto + 0.46 3.21 lineto +closepath stroke + 0.46 3.21 moveto + 0.31 3.14 lineto +closepath stroke + 0.46 3.21 moveto + 0.42 3.09 lineto +closepath stroke + 0.13 3.51 moveto + 0.17 3.32 lineto +closepath stroke + 0.13 3.51 moveto + 0.00 3.51 lineto +closepath stroke + 0.17 3.32 moveto + 0.13 3.19 lineto +closepath stroke + 0.17 3.32 moveto + 0.31 3.14 lineto +closepath stroke + 0.74 3.00 moveto + 0.83 2.96 lineto +closepath stroke + 0.74 3.00 moveto + 0.64 3.04 lineto +closepath stroke + 0.83 2.96 moveto + 0.82 2.90 lineto +closepath stroke + 0.83 2.96 moveto + 0.93 2.93 lineto +closepath stroke + 0.82 2.90 moveto + 0.93 2.93 lineto +closepath stroke + 0.82 2.90 moveto + 0.81 2.83 lineto +closepath stroke + 0.82 2.90 moveto + 0.91 2.81 lineto +closepath stroke + 0.64 3.04 moveto + 0.61 2.94 lineto +closepath stroke + 0.64 3.04 moveto + 0.54 3.06 lineto +closepath stroke + 0.61 2.94 moveto + 0.54 3.06 lineto +closepath stroke + 0.61 2.94 moveto + 0.60 2.86 lineto +closepath stroke + 0.61 2.94 moveto + 0.71 2.83 lineto +closepath stroke + 0.54 3.06 moveto + 0.38 2.99 lineto +closepath stroke + 0.54 3.06 moveto + 0.42 3.09 lineto +closepath stroke + 0.13 3.19 moveto + 0.31 3.14 lineto +closepath stroke + 0.13 3.19 moveto + 0.00 3.19 lineto +closepath stroke + 0.13 3.19 moveto + 0.13 3.01 lineto +closepath stroke + 0.31 3.14 moveto + 0.42 3.09 lineto +closepath stroke + 0.42 3.09 moveto + 0.38 2.99 lineto +closepath stroke + 0.38 2.99 moveto + 0.37 2.88 lineto +closepath stroke + 0.38 2.99 moveto + 0.49 2.86 lineto +closepath stroke + 0.00 3.19 moveto + 0.13 3.01 lineto +closepath stroke + 0.13 3.01 moveto + 0.13 2.88 lineto +closepath stroke + 0.13 3.01 moveto + 0.00 2.88 lineto +closepath stroke + 0.81 2.83 moveto + 0.91 2.81 lineto +closepath stroke + 0.81 2.83 moveto + 0.80 2.75 lineto +closepath stroke + 0.81 2.83 moveto + 0.71 2.83 lineto +closepath stroke + 0.60 2.86 moveto + 0.71 2.83 lineto +closepath stroke + 0.60 2.86 moveto + 0.59 2.75 lineto +closepath stroke + 0.60 2.86 moveto + 0.49 2.86 lineto +closepath stroke + 0.71 2.83 moveto + 0.80 2.75 lineto +closepath stroke + 0.80 2.75 moveto + 0.81 2.69 lineto +closepath stroke + 0.80 2.75 moveto + 0.91 2.69 lineto +closepath stroke + 0.37 2.88 moveto + 0.49 2.86 lineto +closepath stroke + 0.37 2.88 moveto + 0.13 2.88 lineto +closepath stroke + 0.37 2.88 moveto + 0.24 2.75 lineto +closepath stroke + 0.49 2.86 moveto + 0.59 2.75 lineto +closepath stroke + 0.59 2.75 moveto + 0.60 2.67 lineto +closepath stroke + 0.59 2.75 moveto + 0.71 2.67 lineto +closepath stroke + 0.13 2.88 moveto + 0.24 2.75 lineto +closepath stroke + 0.13 2.88 moveto + 0.00 2.88 lineto +closepath stroke + 0.24 2.75 moveto + 0.13 2.62 lineto +closepath stroke + 0.24 2.75 moveto + 0.37 2.62 lineto +closepath stroke + 7.36 0.73 moveto + 6.84 0.26 lineto +closepath stroke + 7.36 0.73 moveto + 7.04 0.99 lineto +closepath stroke + 7.22 1.53 moveto + 7.29 2.18 lineto +closepath stroke + 7.22 1.53 moveto + 7.04 0.99 lineto +closepath stroke + 7.22 1.53 moveto + 6.71 1.06 lineto +closepath stroke + 7.29 2.18 moveto + 6.94 2.18 lineto +closepath stroke + 7.04 0.99 moveto + 6.71 1.06 lineto +closepath stroke + 7.04 0.99 moveto + 6.84 0.26 lineto +closepath stroke + 6.71 1.06 moveto + 6.24 0.64 lineto +closepath stroke + 6.71 1.06 moveto + 6.42 1.19 lineto +closepath stroke + 0.81 2.69 moveto + 0.91 2.69 lineto +closepath stroke + 0.81 2.69 moveto + 0.82 2.60 lineto +closepath stroke + 0.81 2.69 moveto + 0.71 2.67 lineto +closepath stroke + 0.60 2.67 moveto + 0.71 2.67 lineto +closepath stroke + 0.60 2.67 moveto + 0.61 2.56 lineto +closepath stroke + 0.60 2.67 moveto + 0.49 2.64 lineto +closepath stroke + 0.71 2.67 moveto + 0.82 2.60 lineto +closepath stroke + 0.82 2.60 moveto + 0.83 2.54 lineto +closepath stroke + 0.82 2.60 moveto + 0.93 2.57 lineto +closepath stroke + 0.61 2.56 moveto + 0.49 2.64 lineto +closepath stroke + 0.61 2.56 moveto + 0.54 2.44 lineto +closepath stroke + 0.61 2.56 moveto + 0.64 2.46 lineto +closepath stroke + 0.49 2.64 moveto + 0.38 2.51 lineto +closepath stroke + 0.49 2.64 moveto + 0.37 2.62 lineto +closepath stroke + 0.13 2.62 moveto + 0.37 2.62 lineto +closepath stroke + 0.13 2.62 moveto + 0.00 2.62 lineto +closepath stroke + 0.13 2.62 moveto + 0.13 2.49 lineto +closepath stroke + 0.37 2.62 moveto + 0.38 2.51 lineto +closepath stroke + 0.38 2.51 moveto + 0.31 2.36 lineto +closepath stroke + 0.38 2.51 moveto + 0.42 2.39 lineto +closepath stroke + 0.00 2.62 moveto + 0.13 2.49 lineto +closepath stroke + 0.13 2.49 moveto + 0.00 2.31 lineto +closepath stroke + 0.13 2.49 moveto + 0.13 2.31 lineto +closepath stroke + 0.83 2.54 moveto + 0.93 2.57 lineto +closepath stroke + 0.83 2.54 moveto + 0.86 2.47 lineto +closepath stroke + 0.83 2.54 moveto + 0.74 2.50 lineto +closepath stroke + 0.86 2.47 moveto + 0.74 2.50 lineto +closepath stroke + 0.86 2.47 moveto + 0.89 2.41 lineto +closepath stroke + 0.86 2.47 moveto + 0.98 2.45 lineto +closepath stroke + 0.74 2.50 moveto + 0.67 2.38 lineto +closepath stroke + 0.74 2.50 moveto + 0.64 2.46 lineto +closepath stroke + 0.54 2.44 moveto + 0.64 2.46 lineto +closepath stroke + 0.54 2.44 moveto + 0.46 2.29 lineto +closepath stroke + 0.54 2.44 moveto + 0.42 2.39 lineto +closepath stroke + 0.64 2.46 moveto + 0.67 2.38 lineto +closepath stroke + 0.67 2.38 moveto + 0.71 2.31 lineto +closepath stroke + 0.67 2.38 moveto + 0.81 2.35 lineto +closepath stroke + 0.31 2.36 moveto + 0.42 2.39 lineto +closepath stroke + 0.31 2.36 moveto + 0.17 2.18 lineto +closepath stroke + 0.31 2.36 moveto + 0.13 2.31 lineto +closepath stroke + 0.42 2.39 moveto + 0.46 2.29 lineto +closepath stroke + 0.46 2.29 moveto + 0.51 2.19 lineto +closepath stroke + 0.46 2.29 moveto + 0.62 2.24 lineto +closepath stroke + 0.00 2.31 moveto + 0.13 2.31 lineto +closepath stroke + 0.13 2.31 moveto + 0.17 2.18 lineto +closepath stroke + 0.17 2.18 moveto + 0.13 1.99 lineto +closepath stroke + 0.17 2.18 moveto + 0.31 2.04 lineto +closepath stroke + 0.89 2.41 moveto + 0.98 2.45 lineto +closepath stroke + 0.89 2.41 moveto + 0.93 2.34 lineto +closepath stroke + 0.89 2.41 moveto + 0.81 2.35 lineto +closepath stroke + 0.71 2.31 moveto + 0.81 2.35 lineto +closepath stroke + 0.71 2.31 moveto + 0.76 2.22 lineto +closepath stroke + 0.71 2.31 moveto + 0.62 2.24 lineto +closepath stroke + 0.81 2.35 moveto + 0.93 2.34 lineto +closepath stroke + 0.93 2.34 moveto + 0.99 2.28 lineto +closepath stroke + 0.93 2.34 moveto + 0.91 2.22 lineto +closepath stroke + 0.51 2.19 moveto + 0.62 2.24 lineto +closepath stroke + 0.51 2.19 moveto + 0.58 2.08 lineto +closepath stroke + 0.51 2.19 moveto + 0.41 2.12 lineto +closepath stroke + 0.62 2.24 moveto + 0.76 2.22 lineto +closepath stroke + 0.76 2.22 moveto + 0.75 2.07 lineto +closepath stroke + 0.76 2.22 moveto + 0.84 2.14 lineto +closepath stroke + 0.58 2.08 moveto + 0.41 2.12 lineto +closepath stroke + 0.58 2.08 moveto + 0.57 1.91 lineto +closepath stroke + 0.58 2.08 moveto + 0.67 1.98 lineto +closepath stroke + 0.41 2.12 moveto + 0.37 1.93 lineto +closepath stroke + 0.41 2.12 moveto + 0.31 2.04 lineto +closepath stroke + 0.13 1.99 moveto + 0.31 2.04 lineto +closepath stroke + 0.13 1.99 moveto + 0.00 1.99 lineto +closepath stroke + 0.13 1.99 moveto + 0.13 1.85 lineto +closepath stroke + 0.31 2.04 moveto + 0.37 1.93 lineto +closepath stroke + 0.37 1.93 moveto + 0.37 1.73 lineto +closepath stroke + 0.37 1.93 moveto + 0.48 1.81 lineto +closepath stroke + 0.00 1.99 moveto + 0.13 1.85 lineto +closepath stroke + 0.13 1.85 moveto + 0.14 1.62 lineto +closepath stroke + 0.13 1.85 moveto + 0.27 1.62 lineto +closepath stroke + 6.84 0.26 moveto + 5.76 0.26 lineto +closepath stroke + 6.84 0.26 moveto + 6.07 0.00 lineto +closepath stroke + 6.58 1.67 moveto + 6.42 1.19 lineto +closepath stroke + 6.58 1.67 moveto + 6.11 1.25 lineto +closepath stroke + 6.58 1.67 moveto + 6.94 2.18 lineto +closepath stroke + 6.58 1.67 moveto + 6.64 2.24 lineto +closepath stroke + 6.42 1.19 moveto + 6.11 1.25 lineto +closepath stroke + 6.42 1.19 moveto + 6.24 0.64 lineto +closepath stroke + 6.11 1.25 moveto + 5.69 0.88 lineto +closepath stroke + 6.11 1.25 moveto + 5.85 1.37 lineto +closepath stroke + 6.24 0.64 moveto + 5.47 0.38 lineto +closepath stroke + 6.24 0.64 moveto + 5.76 0.26 lineto +closepath stroke + 0.99 2.28 moveto + 0.91 2.22 lineto +closepath stroke + 0.99 2.28 moveto + 1.06 2.35 lineto +closepath stroke + 0.99 2.28 moveto + 1.03 2.23 lineto +closepath stroke + 0.91 2.22 moveto + 0.89 2.07 lineto +closepath stroke + 0.91 2.22 moveto + 0.84 2.14 lineto +closepath stroke + 1.06 2.35 moveto + 1.03 2.23 lineto +closepath stroke + 1.03 2.23 moveto + 1.15 2.27 lineto +closepath stroke + 1.03 2.23 moveto + 1.08 2.19 lineto +closepath stroke + 0.75 2.07 moveto + 0.84 2.14 lineto +closepath stroke + 0.75 2.07 moveto + 0.74 1.90 lineto +closepath stroke + 0.75 2.07 moveto + 0.67 1.98 lineto +closepath stroke + 0.84 2.14 moveto + 0.89 2.07 lineto +closepath stroke + 0.89 2.07 moveto + 1.03 2.11 lineto +closepath stroke + 0.89 2.07 moveto + 0.96 2.02 lineto +closepath stroke + 0.57 1.91 moveto + 0.67 1.98 lineto +closepath stroke + 0.57 1.91 moveto + 0.57 1.71 lineto +closepath stroke + 0.57 1.91 moveto + 0.48 1.81 lineto +closepath stroke + 0.67 1.98 moveto + 0.74 1.90 lineto +closepath stroke + 0.74 1.90 moveto + 0.90 1.93 lineto +closepath stroke + 0.74 1.90 moveto + 0.82 1.84 lineto +closepath stroke + 0.37 1.73 moveto + 0.48 1.81 lineto +closepath stroke + 0.37 1.73 moveto + 0.38 1.51 lineto +closepath stroke + 0.37 1.73 moveto + 0.27 1.62 lineto +closepath stroke + 0.48 1.81 moveto + 0.57 1.71 lineto +closepath stroke + 0.57 1.71 moveto + 0.67 1.64 lineto +closepath stroke + 0.57 1.71 moveto + 0.76 1.73 lineto +closepath stroke + 0.14 1.62 moveto + 0.27 1.62 lineto +closepath stroke + 0.14 1.62 moveto + 0.00 1.50 lineto +closepath stroke + 0.14 1.62 moveto + 0.14 1.28 lineto +closepath stroke + 0.27 1.62 moveto + 0.38 1.51 lineto +closepath stroke + 0.38 1.51 moveto + 0.51 1.41 lineto +closepath stroke + 0.38 1.51 moveto + 0.61 1.52 lineto +closepath stroke + 0.00 1.50 moveto + 0.14 1.28 lineto +closepath stroke + 0.14 1.28 moveto + 0.21 1.03 lineto +closepath stroke + 0.14 1.28 moveto + 0.35 1.15 lineto +closepath stroke + 6.94 2.18 moveto + 6.64 2.24 lineto +closepath stroke + 6.64 2.24 moveto + 6.32 2.24 lineto +closepath stroke + 1.15 2.27 moveto + 1.08 2.19 lineto +closepath stroke + 1.08 2.19 moveto + 1.15 2.14 lineto +closepath stroke + 1.08 2.19 moveto + 1.03 2.11 lineto +closepath stroke + 1.03 2.11 moveto + 0.96 2.02 lineto +closepath stroke + 1.03 2.11 moveto + 1.15 2.14 lineto +closepath stroke + 0.96 2.02 moveto + 1.05 1.96 lineto +closepath stroke + 0.96 2.02 moveto + 0.90 1.93 lineto +closepath stroke + 1.15 2.14 moveto + 1.26 2.20 lineto +closepath stroke + 1.15 2.14 moveto + 1.21 2.12 lineto +closepath stroke + 0.90 1.93 moveto + 0.82 1.84 lineto +closepath stroke + 0.90 1.93 moveto + 1.05 1.96 lineto +closepath stroke + 0.82 1.84 moveto + 0.93 1.76 lineto +closepath stroke + 0.82 1.84 moveto + 0.76 1.73 lineto +closepath stroke + 1.05 1.96 moveto + 1.18 2.02 lineto +closepath stroke + 1.05 1.96 moveto + 1.12 1.93 lineto +closepath stroke + 0.67 1.64 moveto + 0.76 1.73 lineto +closepath stroke + 0.67 1.64 moveto + 0.80 1.54 lineto +closepath stroke + 0.67 1.64 moveto + 0.61 1.52 lineto +closepath stroke + 0.76 1.73 moveto + 0.93 1.76 lineto +closepath stroke + 0.93 1.76 moveto + 1.09 1.82 lineto +closepath stroke + 0.93 1.76 moveto + 1.03 1.72 lineto +closepath stroke + 0.51 1.41 moveto + 0.61 1.52 lineto +closepath stroke + 0.51 1.41 moveto + 0.66 1.30 lineto +closepath stroke + 0.51 1.41 moveto + 0.44 1.28 lineto +closepath stroke + 0.61 1.52 moveto + 0.80 1.54 lineto +closepath stroke + 0.80 1.54 moveto + 0.99 1.60 lineto +closepath stroke + 0.80 1.54 moveto + 0.92 1.49 lineto +closepath stroke + 0.66 1.30 moveto + 0.44 1.28 lineto +closepath stroke + 0.66 1.30 moveto + 0.88 1.36 lineto +closepath stroke + 0.66 1.30 moveto + 0.81 1.23 lineto +closepath stroke + 0.44 1.28 moveto + 0.51 1.03 lineto +closepath stroke + 0.44 1.28 moveto + 0.35 1.15 lineto +closepath stroke + 0.21 1.03 moveto + 0.35 1.15 lineto +closepath stroke + 0.21 1.03 moveto + 0.00 0.87 lineto +closepath stroke + 0.21 1.03 moveto + 0.21 0.74 lineto +closepath stroke + 0.35 1.15 moveto + 0.51 1.03 lineto +closepath stroke + 0.51 1.03 moveto + 0.76 1.10 lineto +closepath stroke + 0.51 1.03 moveto + 0.68 0.96 lineto +closepath stroke + 0.00 0.87 moveto + 0.21 0.74 lineto +closepath stroke + 0.21 0.74 moveto + 0.13 0.59 lineto +closepath stroke + 0.21 0.74 moveto + 0.34 0.74 lineto +closepath stroke + 0.13 0.59 moveto + 0.34 0.74 lineto +closepath stroke + 0.13 0.59 moveto + 0.00 0.29 lineto +closepath stroke + 0.13 0.59 moveto + 0.13 0.29 lineto +closepath stroke + 0.34 0.74 moveto + 0.63 0.80 lineto +closepath stroke + 0.34 0.74 moveto + 0.54 0.65 lineto +closepath stroke + 0.00 0.29 moveto + 0.13 0.29 lineto +closepath stroke + 0.13 0.29 moveto + 0.49 0.48 lineto +closepath stroke + 0.13 0.29 moveto + 0.36 0.19 lineto +closepath stroke + 1.26 2.20 moveto + 1.21 2.12 lineto +closepath stroke + 1.21 2.12 moveto + 1.28 2.08 lineto +closepath stroke + 1.21 2.12 moveto + 1.18 2.02 lineto +closepath stroke + 1.18 2.02 moveto + 1.12 1.93 lineto +closepath stroke + 1.18 2.02 moveto + 1.28 2.08 lineto +closepath stroke + 1.12 1.93 moveto + 1.22 1.88 lineto +closepath stroke + 1.12 1.93 moveto + 1.09 1.82 lineto +closepath stroke + 1.28 2.08 moveto + 1.37 2.07 lineto +closepath stroke + 1.28 2.08 moveto + 1.33 1.97 lineto +closepath stroke + 1.09 1.82 moveto + 1.03 1.72 lineto +closepath stroke + 1.09 1.82 moveto + 1.22 1.88 lineto +closepath stroke + 1.03 1.72 moveto + 1.15 1.66 lineto +closepath stroke + 1.03 1.72 moveto + 0.99 1.60 lineto +closepath stroke + 1.22 1.88 moveto + 1.32 1.86 lineto +closepath stroke + 1.22 1.88 moveto + 1.29 1.76 lineto +closepath stroke + 0.99 1.60 moveto + 0.92 1.49 lineto +closepath stroke + 0.99 1.60 moveto + 1.15 1.66 lineto +closepath stroke + 0.92 1.49 moveto + 1.07 1.42 lineto +closepath stroke + 0.92 1.49 moveto + 0.88 1.36 lineto +closepath stroke + 1.15 1.66 moveto + 1.28 1.64 lineto +closepath stroke + 1.15 1.66 moveto + 1.24 1.52 lineto +closepath stroke + 0.88 1.36 moveto + 0.81 1.23 lineto +closepath stroke + 0.88 1.36 moveto + 1.07 1.42 lineto +closepath stroke + 0.81 1.23 moveto + 0.98 1.16 lineto +closepath stroke + 0.81 1.23 moveto + 0.76 1.10 lineto +closepath stroke + 1.07 1.42 moveto + 1.23 1.39 lineto +closepath stroke + 1.07 1.42 moveto + 1.18 1.26 lineto +closepath stroke + 0.76 1.10 moveto + 0.68 0.96 lineto +closepath stroke + 0.76 1.10 moveto + 0.98 1.16 lineto +closepath stroke + 0.68 0.96 moveto + 0.89 0.86 lineto +closepath stroke + 0.68 0.96 moveto + 0.63 0.80 lineto +closepath stroke + 0.98 1.16 moveto + 1.17 1.12 lineto +closepath stroke + 0.98 1.16 moveto + 1.12 0.98 lineto +closepath stroke + 0.63 0.80 moveto + 0.54 0.65 lineto +closepath stroke + 0.63 0.80 moveto + 0.89 0.86 lineto +closepath stroke + 0.54 0.65 moveto + 0.49 0.48 lineto +closepath stroke + 0.54 0.65 moveto + 0.78 0.54 lineto +closepath stroke + 0.89 0.86 moveto + 1.11 0.82 lineto +closepath stroke + 0.89 0.86 moveto + 1.06 0.67 lineto +closepath stroke + 0.49 0.48 moveto + 0.78 0.54 lineto +closepath stroke + 0.49 0.48 moveto + 0.36 0.19 lineto +closepath stroke + 0.78 0.54 moveto + 1.06 0.67 lineto +closepath stroke + 0.78 0.54 moveto + 1.00 0.50 lineto +closepath stroke + 0.36 0.19 moveto + 0.73 0.19 lineto +closepath stroke + 0.36 0.19 moveto + 0.36 0.00 lineto +closepath stroke + 0.73 0.19 moveto + 0.36 0.00 lineto +closepath stroke + 0.73 0.19 moveto + 0.98 0.00 lineto +closepath stroke + 0.73 0.19 moveto + 0.98 0.19 lineto +closepath stroke + 5.99 1.80 moveto + 5.85 1.37 lineto +closepath stroke + 5.99 1.80 moveto + 5.57 1.43 lineto +closepath stroke + 5.99 1.80 moveto + 6.32 2.24 lineto +closepath stroke + 5.99 1.80 moveto + 6.04 2.30 lineto +closepath stroke + 5.85 1.37 moveto + 5.57 1.43 lineto +closepath stroke + 5.85 1.37 moveto + 5.69 0.88 lineto +closepath stroke + 5.57 1.43 moveto + 5.20 1.10 lineto +closepath stroke + 5.57 1.43 moveto + 5.34 1.53 lineto +closepath stroke + 1.37 2.07 moveto + 1.33 1.97 lineto +closepath stroke + 1.37 2.07 moveto + 1.38 2.17 lineto +closepath stroke + 1.37 2.07 moveto + 1.43 2.05 lineto +closepath stroke + 1.33 1.97 moveto + 1.40 1.84 lineto +closepath stroke + 1.33 1.97 moveto + 1.32 1.86 lineto +closepath stroke + 1.38 2.17 moveto + 1.43 2.05 lineto +closepath stroke + 1.43 2.05 moveto + 1.50 2.15 lineto +closepath stroke + 1.43 2.05 moveto + 1.49 2.05 lineto +closepath stroke + 1.32 1.86 moveto + 1.29 1.76 lineto +closepath stroke + 1.32 1.86 moveto + 1.40 1.84 lineto +closepath stroke + 1.29 1.76 moveto + 1.38 1.62 lineto +closepath stroke + 1.29 1.76 moveto + 1.28 1.64 lineto +closepath stroke + 1.40 1.84 moveto + 1.50 1.95 lineto +closepath stroke + 1.40 1.84 moveto + 1.49 1.84 lineto +closepath stroke + 1.28 1.64 moveto + 1.24 1.52 lineto +closepath stroke + 1.28 1.64 moveto + 1.38 1.62 lineto +closepath stroke + 1.24 1.52 moveto + 1.35 1.36 lineto +closepath stroke + 1.24 1.52 moveto + 1.23 1.39 lineto +closepath stroke + 1.38 1.62 moveto + 1.50 1.74 lineto +closepath stroke + 1.38 1.62 moveto + 1.49 1.62 lineto +closepath stroke + 1.23 1.39 moveto + 1.18 1.26 lineto +closepath stroke + 1.23 1.39 moveto + 1.35 1.36 lineto +closepath stroke + 1.18 1.26 moveto + 1.32 1.08 lineto +closepath stroke + 1.18 1.26 moveto + 1.17 1.12 lineto +closepath stroke + 1.35 1.36 moveto + 1.50 1.49 lineto +closepath stroke + 1.35 1.36 moveto + 1.49 1.36 lineto +closepath stroke + 1.17 1.12 moveto + 1.12 0.98 lineto +closepath stroke + 1.17 1.12 moveto + 1.32 1.08 lineto +closepath stroke + 1.12 0.98 moveto + 1.29 0.78 lineto +closepath stroke + 1.12 0.98 moveto + 1.11 0.82 lineto +closepath stroke + 1.32 1.08 moveto + 1.50 1.23 lineto +closepath stroke + 1.32 1.08 moveto + 1.48 1.08 lineto +closepath stroke + 1.06 0.67 moveto + 1.00 0.50 lineto +closepath stroke + 1.06 0.67 moveto + 1.11 0.82 lineto +closepath stroke + 1.00 0.50 moveto + 1.26 0.31 lineto +closepath stroke + 1.00 0.50 moveto + 0.98 0.19 lineto +closepath stroke + 1.11 0.82 moveto + 1.29 0.78 lineto +closepath stroke + 1.29 0.78 moveto + 1.52 0.78 lineto +closepath stroke + 1.29 0.78 moveto + 1.50 0.62 lineto +closepath stroke + 0.98 0.00 moveto + 0.98 0.19 lineto +closepath stroke + 0.98 0.19 moveto + 1.26 0.31 lineto +closepath stroke + 1.26 0.31 moveto + 1.50 0.62 lineto +closepath stroke + 1.26 0.31 moveto + 1.48 0.31 lineto +closepath stroke + 1.50 2.15 moveto + 1.49 2.05 lineto +closepath stroke + 1.49 2.05 moveto + 1.57 2.05 lineto +closepath stroke + 1.49 2.05 moveto + 1.50 1.95 lineto +closepath stroke + 1.50 1.95 moveto + 1.49 1.84 lineto +closepath stroke + 1.50 1.95 moveto + 1.57 2.05 lineto +closepath stroke + 1.49 1.84 moveto + 1.60 1.84 lineto +closepath stroke + 1.49 1.84 moveto + 1.50 1.74 lineto +closepath stroke + 1.57 2.05 moveto + 1.62 2.17 lineto +closepath stroke + 1.57 2.05 moveto + 1.63 2.07 lineto +closepath stroke + 1.50 1.74 moveto + 1.49 1.62 lineto +closepath stroke + 1.50 1.74 moveto + 1.60 1.84 lineto +closepath stroke + 1.49 1.62 moveto + 1.62 1.62 lineto +closepath stroke + 1.49 1.62 moveto + 1.50 1.49 lineto +closepath stroke + 1.60 1.84 moveto + 1.67 1.97 lineto +closepath stroke + 1.60 1.84 moveto + 1.68 1.86 lineto +closepath stroke + 1.50 1.49 moveto + 1.49 1.36 lineto +closepath stroke + 1.50 1.49 moveto + 1.62 1.62 lineto +closepath stroke + 1.49 1.36 moveto + 1.65 1.36 lineto +closepath stroke + 1.49 1.36 moveto + 1.50 1.23 lineto +closepath stroke + 1.62 1.62 moveto + 1.71 1.76 lineto +closepath stroke + 1.62 1.62 moveto + 1.72 1.64 lineto +closepath stroke + 1.50 1.23 moveto + 1.48 1.08 lineto +closepath stroke + 1.50 1.23 moveto + 1.65 1.36 lineto +closepath stroke + 1.48 1.08 moveto + 1.68 1.08 lineto +closepath stroke + 1.48 1.08 moveto + 1.50 0.94 lineto +closepath stroke + 1.65 1.36 moveto + 1.76 1.52 lineto +closepath stroke + 1.65 1.36 moveto + 1.77 1.39 lineto +closepath stroke + 1.68 1.08 moveto + 1.50 0.94 lineto +closepath stroke + 1.68 1.08 moveto + 1.82 1.26 lineto +closepath stroke + 1.68 1.08 moveto + 1.83 1.12 lineto +closepath stroke + 1.50 0.94 moveto + 1.71 0.78 lineto +closepath stroke + 1.50 0.94 moveto + 1.52 0.78 lineto +closepath stroke + 1.52 0.78 moveto + 1.50 0.62 lineto +closepath stroke + 1.52 0.78 moveto + 1.71 0.78 lineto +closepath stroke + 1.50 0.62 moveto + 1.48 0.31 lineto +closepath stroke + 1.71 0.78 moveto + 1.88 0.98 lineto +closepath stroke + 1.71 0.78 moveto + 1.89 0.82 lineto +closepath stroke + 1.48 0.31 moveto + 1.74 0.31 lineto +closepath stroke + 1.48 0.31 moveto + 1.50 0.00 lineto +closepath stroke + 1.74 0.31 moveto + 1.50 0.00 lineto +closepath stroke + 1.74 0.31 moveto + 2.00 0.50 lineto +closepath stroke + 1.74 0.31 moveto + 2.02 0.19 lineto +closepath stroke + 1.62 2.17 moveto + 1.63 2.07 lineto +closepath stroke + 1.63 2.07 moveto + 1.72 2.08 lineto +closepath stroke + 1.63 2.07 moveto + 1.67 1.97 lineto +closepath stroke + 1.67 1.97 moveto + 1.68 1.86 lineto +closepath stroke + 1.67 1.97 moveto + 1.72 2.08 lineto +closepath stroke + 1.68 1.86 moveto + 1.78 1.88 lineto +closepath stroke + 1.68 1.86 moveto + 1.71 1.76 lineto +closepath stroke + 1.72 2.08 moveto + 1.79 2.12 lineto +closepath stroke + 1.72 2.08 moveto + 1.82 2.02 lineto +closepath stroke + 1.71 1.76 moveto + 1.72 1.64 lineto +closepath stroke + 1.71 1.76 moveto + 1.78 1.88 lineto +closepath stroke + 1.72 1.64 moveto + 1.85 1.66 lineto +closepath stroke + 1.72 1.64 moveto + 1.76 1.52 lineto +closepath stroke + 1.78 1.88 moveto + 1.88 1.93 lineto +closepath stroke + 1.78 1.88 moveto + 1.91 1.82 lineto +closepath stroke + 1.76 1.52 moveto + 1.77 1.39 lineto +closepath stroke + 1.76 1.52 moveto + 1.85 1.66 lineto +closepath stroke + 1.77 1.39 moveto + 1.93 1.42 lineto +closepath stroke + 1.77 1.39 moveto + 1.82 1.26 lineto +closepath stroke + 1.85 1.66 moveto + 1.97 1.72 lineto +closepath stroke + 1.85 1.66 moveto + 2.01 1.60 lineto +closepath stroke + 1.82 1.26 moveto + 1.83 1.12 lineto +closepath stroke + 1.82 1.26 moveto + 1.93 1.42 lineto +closepath stroke + 1.83 1.12 moveto + 2.02 1.16 lineto +closepath stroke + 1.83 1.12 moveto + 1.88 0.98 lineto +closepath stroke + 1.93 1.42 moveto + 2.08 1.49 lineto +closepath stroke + 1.93 1.42 moveto + 2.12 1.36 lineto +closepath stroke + 1.88 0.98 moveto + 1.89 0.82 lineto +closepath stroke + 1.88 0.98 moveto + 2.02 1.16 lineto +closepath stroke + 1.89 0.82 moveto + 2.11 0.86 lineto +closepath stroke + 1.89 0.82 moveto + 1.94 0.67 lineto +closepath stroke + 2.02 1.16 moveto + 2.19 1.23 lineto +closepath stroke + 2.02 1.16 moveto + 2.24 1.10 lineto +closepath stroke + 2.11 0.86 moveto + 1.94 0.67 lineto +closepath stroke + 2.11 0.86 moveto + 2.32 0.96 lineto +closepath stroke + 2.11 0.86 moveto + 2.37 0.80 lineto +closepath stroke + 1.94 0.67 moveto + 2.22 0.54 lineto +closepath stroke + 1.94 0.67 moveto + 2.00 0.50 lineto +closepath stroke + 2.00 0.50 moveto + 2.02 0.19 lineto +closepath stroke + 2.00 0.50 moveto + 2.22 0.54 lineto +closepath stroke + 2.02 0.19 moveto + 2.27 0.19 lineto +closepath stroke + 2.02 0.19 moveto + 2.02 0.00 lineto +closepath stroke + 2.22 0.54 moveto + 2.46 0.65 lineto +closepath stroke + 2.22 0.54 moveto + 2.51 0.48 lineto +closepath stroke + 2.27 0.19 moveto + 2.02 0.00 lineto +closepath stroke + 2.27 0.19 moveto + 2.61 0.19 lineto +closepath stroke + 2.27 0.19 moveto + 2.61 0.00 lineto +closepath stroke + 5.69 0.88 moveto + 5.21 0.50 lineto +closepath stroke + 5.69 0.88 moveto + 5.47 0.38 lineto +closepath stroke + 6.32 2.24 moveto + 6.04 2.30 lineto +closepath stroke + 1.79 2.12 moveto + 1.82 2.02 lineto +closepath stroke + 1.79 2.12 moveto + 1.74 2.20 lineto +closepath stroke + 1.79 2.12 moveto + 1.85 2.14 lineto +closepath stroke + 1.82 2.02 moveto + 1.96 1.96 lineto +closepath stroke + 1.82 2.02 moveto + 1.88 1.93 lineto +closepath stroke + 1.74 2.20 moveto + 1.85 2.14 lineto +closepath stroke + 1.85 2.14 moveto + 1.92 2.19 lineto +closepath stroke + 1.85 2.14 moveto + 1.97 2.11 lineto +closepath stroke + 1.88 1.93 moveto + 1.91 1.82 lineto +closepath stroke + 1.88 1.93 moveto + 1.96 1.96 lineto +closepath stroke + 1.91 1.82 moveto + 2.07 1.76 lineto +closepath stroke + 1.91 1.82 moveto + 1.97 1.72 lineto +closepath stroke + 1.96 1.96 moveto + 1.97 2.11 lineto +closepath stroke + 1.96 1.96 moveto + 2.02 2.01 lineto +closepath stroke + 1.97 1.72 moveto + 2.01 1.60 lineto +closepath stroke + 1.97 1.72 moveto + 2.07 1.76 lineto +closepath stroke + 2.01 1.60 moveto + 2.20 1.54 lineto +closepath stroke + 2.01 1.60 moveto + 2.08 1.49 lineto +closepath stroke + 2.07 1.76 moveto + 2.10 1.93 lineto +closepath stroke + 2.07 1.76 moveto + 2.16 1.82 lineto +closepath stroke + 2.08 1.49 moveto + 2.12 1.36 lineto +closepath stroke + 2.08 1.49 moveto + 2.20 1.54 lineto +closepath stroke + 2.12 1.36 moveto + 2.34 1.30 lineto +closepath stroke + 2.12 1.36 moveto + 2.19 1.23 lineto +closepath stroke + 2.20 1.54 moveto + 2.24 1.73 lineto +closepath stroke + 2.20 1.54 moveto + 2.30 1.62 lineto +closepath stroke + 2.19 1.23 moveto + 2.24 1.10 lineto +closepath stroke + 2.19 1.23 moveto + 2.34 1.30 lineto +closepath stroke + 2.24 1.10 moveto + 2.49 1.03 lineto +closepath stroke + 2.24 1.10 moveto + 2.32 0.96 lineto +closepath stroke + 2.34 1.30 moveto + 2.39 1.52 lineto +closepath stroke + 2.34 1.30 moveto + 2.47 1.39 lineto +closepath stroke + 2.32 0.96 moveto + 2.37 0.80 lineto +closepath stroke + 2.32 0.96 moveto + 2.49 1.03 lineto +closepath stroke + 2.37 0.80 moveto + 2.66 0.74 lineto +closepath stroke + 2.37 0.80 moveto + 2.46 0.65 lineto +closepath stroke + 2.49 1.03 moveto + 2.56 1.28 lineto +closepath stroke + 2.49 1.03 moveto + 2.65 1.15 lineto +closepath stroke + 2.46 0.65 moveto + 2.51 0.48 lineto +closepath stroke + 2.46 0.65 moveto + 2.66 0.74 lineto +closepath stroke + 2.51 0.48 moveto + 2.85 0.29 lineto +closepath stroke + 2.51 0.48 moveto + 2.61 0.19 lineto +closepath stroke + 2.66 0.74 moveto + 2.75 1.03 lineto +closepath stroke + 2.66 0.74 moveto + 2.84 0.87 lineto +closepath stroke + 2.61 0.19 moveto + 2.61 0.00 lineto +closepath stroke + 2.61 0.19 moveto + 2.85 0.29 lineto +closepath stroke + 2.85 0.29 moveto + 3.09 0.60 lineto +closepath stroke + 2.85 0.29 moveto + 3.19 0.30 lineto +closepath stroke + 6.04 2.30 moveto + 5.76 2.30 lineto +closepath stroke + 5.46 1.91 moveto + 5.34 1.53 lineto +closepath stroke + 5.46 1.91 moveto + 5.08 1.59 lineto +closepath stroke + 5.46 1.91 moveto + 5.50 2.30 lineto +closepath stroke + 5.46 1.91 moveto + 5.25 2.36 lineto +closepath stroke + 5.34 1.53 moveto + 5.08 1.59 lineto +closepath stroke + 5.34 1.53 moveto + 5.20 1.10 lineto +closepath stroke + 5.08 1.59 moveto + 4.74 1.31 lineto +closepath stroke + 5.08 1.59 moveto + 4.87 1.68 lineto +closepath stroke + 5.20 1.10 moveto + 5.00 0.76 lineto +closepath stroke + 5.20 1.10 moveto + 4.76 0.87 lineto +closepath stroke + 5.76 2.30 moveto + 5.50 2.30 lineto +closepath stroke + 5.50 2.30 moveto + 5.25 2.36 lineto +closepath stroke + 1.92 2.19 moveto + 1.97 2.11 lineto +closepath stroke + 1.92 2.19 moveto + 1.85 2.27 lineto +closepath stroke + 1.92 2.19 moveto + 1.97 2.23 lineto +closepath stroke + 1.97 2.11 moveto + 2.02 2.01 lineto +closepath stroke + 1.85 2.27 moveto + 1.97 2.23 lineto +closepath stroke + 1.97 2.23 moveto + 1.94 2.35 lineto +closepath stroke + 1.97 2.23 moveto + 2.01 2.28 lineto +closepath stroke + 2.02 2.01 moveto + 2.11 2.07 lineto +closepath stroke + 2.02 2.01 moveto + 2.10 1.93 lineto +closepath stroke + 2.10 1.93 moveto + 2.16 1.82 lineto +closepath stroke + 2.10 1.93 moveto + 2.11 2.07 lineto +closepath stroke + 2.16 1.82 moveto + 2.26 1.90 lineto +closepath stroke + 2.16 1.82 moveto + 2.24 1.73 lineto +closepath stroke + 2.11 2.07 moveto + 2.09 2.22 lineto +closepath stroke + 2.11 2.07 moveto + 2.16 2.14 lineto +closepath stroke + 2.24 1.73 moveto + 2.30 1.62 lineto +closepath stroke + 2.24 1.73 moveto + 2.26 1.90 lineto +closepath stroke + 2.30 1.62 moveto + 2.43 1.71 lineto +closepath stroke + 2.30 1.62 moveto + 2.39 1.52 lineto +closepath stroke + 2.26 1.90 moveto + 2.35 2.00 lineto +closepath stroke + 2.26 1.90 moveto + 2.43 1.91 lineto +closepath stroke + 2.39 1.52 moveto + 2.47 1.39 lineto +closepath stroke + 2.39 1.52 moveto + 2.43 1.71 lineto +closepath stroke + 2.47 1.39 moveto + 2.62 1.51 lineto +closepath stroke + 2.47 1.39 moveto + 2.56 1.28 lineto +closepath stroke + 2.43 1.71 moveto + 2.43 1.91 lineto +closepath stroke + 2.43 1.71 moveto + 2.52 1.81 lineto +closepath stroke + 2.56 1.28 moveto + 2.65 1.15 lineto +closepath stroke + 2.56 1.28 moveto + 2.62 1.51 lineto +closepath stroke + 2.65 1.15 moveto + 2.83 1.28 lineto +closepath stroke + 2.65 1.15 moveto + 2.75 1.03 lineto +closepath stroke + 2.62 1.51 moveto + 2.63 1.73 lineto +closepath stroke + 2.62 1.51 moveto + 2.73 1.62 lineto +closepath stroke + 2.75 1.03 moveto + 2.84 0.87 lineto +closepath stroke + 2.75 1.03 moveto + 2.83 1.28 lineto +closepath stroke + 2.84 0.87 moveto + 3.05 1.03 lineto +closepath stroke + 2.84 0.87 moveto + 2.96 0.74 lineto +closepath stroke + 2.83 1.28 moveto + 2.85 1.54 lineto +closepath stroke + 2.83 1.28 moveto + 2.95 1.42 lineto +closepath stroke + 3.05 1.03 moveto + 2.96 0.74 lineto +closepath stroke + 3.05 1.03 moveto + 3.08 1.32 lineto +closepath stroke + 3.05 1.03 moveto + 3.20 1.19 lineto +closepath stroke + 2.96 0.74 moveto + 3.30 0.75 lineto +closepath stroke + 2.96 0.74 moveto + 3.09 0.60 lineto +closepath stroke + 3.09 0.60 moveto + 3.19 0.30 lineto +closepath stroke + 3.09 0.60 moveto + 3.30 0.75 lineto +closepath stroke + 3.19 0.30 moveto + 3.58 0.30 lineto +closepath stroke + 3.19 0.30 moveto + 3.33 0.00 lineto +closepath stroke + 3.30 0.75 moveto + 3.35 1.09 lineto +closepath stroke + 3.30 0.75 moveto + 3.48 0.94 lineto +closepath stroke + 3.58 0.30 moveto + 3.33 0.00 lineto +closepath stroke + 3.58 0.30 moveto + 3.95 0.40 lineto +closepath stroke + 3.58 0.30 moveto + 3.81 0.70 lineto +closepath stroke + 1.94 2.35 moveto + 2.01 2.28 lineto +closepath stroke + 2.01 2.28 moveto + 2.07 2.34 lineto +closepath stroke + 2.01 2.28 moveto + 2.09 2.22 lineto +closepath stroke + 2.09 2.22 moveto + 2.16 2.14 lineto +closepath stroke + 2.09 2.22 moveto + 2.07 2.34 lineto +closepath stroke + 2.16 2.14 moveto + 2.24 2.22 lineto +closepath stroke + 2.16 2.14 moveto + 2.25 2.07 lineto +closepath stroke + 2.07 2.34 moveto + 2.02 2.45 lineto +closepath stroke + 2.07 2.34 moveto + 2.10 2.39 lineto +closepath stroke + 2.24 2.22 moveto + 2.25 2.07 lineto +closepath stroke + 2.24 2.22 moveto + 2.19 2.35 lineto +closepath stroke + 2.24 2.22 moveto + 2.28 2.29 lineto +closepath stroke + 2.25 2.07 moveto + 2.42 2.08 lineto +closepath stroke + 2.25 2.07 moveto + 2.35 2.00 lineto +closepath stroke + 2.43 1.91 moveto + 2.52 1.81 lineto +closepath stroke + 2.43 1.91 moveto + 2.35 2.00 lineto +closepath stroke + 2.52 1.81 moveto + 2.63 1.93 lineto +closepath stroke + 2.52 1.81 moveto + 2.63 1.73 lineto +closepath stroke + 2.35 2.00 moveto + 2.42 2.08 lineto +closepath stroke + 2.42 2.08 moveto + 2.38 2.24 lineto +closepath stroke + 2.42 2.08 moveto + 2.48 2.17 lineto +closepath stroke + 2.63 1.73 moveto + 2.73 1.62 lineto +closepath stroke + 2.63 1.73 moveto + 2.63 1.93 lineto +closepath stroke + 2.73 1.62 moveto + 2.85 1.77 lineto +closepath stroke + 2.73 1.62 moveto + 2.85 1.54 lineto +closepath stroke + 2.63 1.93 moveto + 2.71 2.07 lineto +closepath stroke + 2.63 1.93 moveto + 2.82 1.99 lineto +closepath stroke + 2.85 1.54 moveto + 2.95 1.42 lineto +closepath stroke + 2.85 1.54 moveto + 2.85 1.77 lineto +closepath stroke + 2.95 1.42 moveto + 3.10 1.58 lineto +closepath stroke + 2.95 1.42 moveto + 3.08 1.32 lineto +closepath stroke + 2.85 1.77 moveto + 2.95 1.93 lineto +closepath stroke + 2.85 1.77 moveto + 3.07 1.84 lineto +closepath stroke + 3.08 1.32 moveto + 3.20 1.19 lineto +closepath stroke + 3.08 1.32 moveto + 3.10 1.58 lineto +closepath stroke + 3.20 1.19 moveto + 3.38 1.39 lineto +closepath stroke + 3.20 1.19 moveto + 3.35 1.09 lineto +closepath stroke + 3.10 1.58 moveto + 3.22 1.78 lineto +closepath stroke + 3.10 1.58 moveto + 3.35 1.68 lineto +closepath stroke + 3.35 1.09 moveto + 3.48 0.94 lineto +closepath stroke + 3.35 1.09 moveto + 3.38 1.39 lineto +closepath stroke + 3.48 0.94 moveto + 3.68 1.17 lineto +closepath stroke + 3.48 0.94 moveto + 3.63 0.83 lineto +closepath stroke + 3.38 1.39 moveto + 3.51 1.61 lineto +closepath stroke + 3.38 1.39 moveto + 3.65 1.51 lineto +closepath stroke + 3.68 1.17 moveto + 3.63 0.83 lineto +closepath stroke + 3.68 1.17 moveto + 3.83 1.43 lineto +closepath stroke + 3.68 1.17 moveto + 3.99 1.31 lineto +closepath stroke + 3.63 0.83 moveto + 4.01 0.93 lineto +closepath stroke + 3.63 0.83 moveto + 3.81 0.70 lineto +closepath stroke + 3.95 0.40 moveto + 3.81 0.70 lineto +closepath stroke + 3.95 0.40 moveto + 4.37 0.66 lineto +closepath stroke + 3.95 0.40 moveto + 4.14 0.26 lineto +closepath stroke + 3.81 0.70 moveto + 4.01 0.93 lineto +closepath stroke + 4.01 0.93 moveto + 4.18 1.23 lineto +closepath stroke + 4.01 0.93 moveto + 4.36 1.10 lineto +closepath stroke + 4.37 0.66 moveto + 4.14 0.26 lineto +closepath stroke + 4.37 0.66 moveto + 4.76 0.87 lineto +closepath stroke + 4.37 0.66 moveto + 4.57 1.01 lineto +closepath stroke + 4.14 0.26 moveto + 4.77 0.26 lineto +closepath stroke + 4.14 0.26 moveto + 4.35 0.00 lineto +closepath stroke + 4.77 0.26 moveto + 4.35 0.00 lineto +closepath stroke + 4.77 0.26 moveto + 5.21 0.50 lineto +closepath stroke + 4.77 0.26 moveto + 5.00 0.76 lineto +closepath stroke + 5.25 2.36 moveto + 5.01 2.36 lineto +closepath stroke + 4.97 2.01 moveto + 4.87 1.68 lineto +closepath stroke + 4.97 2.01 moveto + 4.64 1.73 lineto +closepath stroke + 4.97 2.01 moveto + 4.78 2.41 lineto +closepath stroke + 4.97 2.01 moveto + 5.01 2.36 lineto +closepath stroke + 4.87 1.68 moveto + 4.64 1.73 lineto +closepath stroke + 4.87 1.68 moveto + 4.74 1.31 lineto +closepath stroke + 4.64 1.73 moveto + 4.44 1.82 lineto +closepath stroke + 4.64 1.73 moveto + 4.33 1.49 lineto +closepath stroke + 2.02 2.45 moveto + 2.10 2.39 lineto +closepath stroke + 2.10 2.39 moveto + 2.14 2.47 lineto +closepath stroke + 2.10 2.39 moveto + 2.19 2.35 lineto +closepath stroke + 2.19 2.35 moveto + 2.28 2.29 lineto +closepath stroke + 2.19 2.35 moveto + 2.14 2.47 lineto +closepath stroke + 2.28 2.29 moveto + 2.33 2.38 lineto +closepath stroke + 2.28 2.29 moveto + 2.38 2.24 lineto +closepath stroke + 2.14 2.47 moveto + 2.07 2.57 lineto +closepath stroke + 2.14 2.47 moveto + 2.16 2.52 lineto +closepath stroke + 2.38 2.24 moveto + 2.48 2.17 lineto +closepath stroke + 2.38 2.24 moveto + 2.33 2.38 lineto +closepath stroke + 2.48 2.17 moveto + 2.54 2.29 lineto +closepath stroke + 2.48 2.17 moveto + 2.59 2.12 lineto +closepath stroke + 2.33 2.38 moveto + 2.26 2.50 lineto +closepath stroke + 2.33 2.38 moveto + 2.36 2.46 lineto +closepath stroke + 2.54 2.29 moveto + 2.59 2.12 lineto +closepath stroke + 2.54 2.29 moveto + 2.46 2.44 lineto +closepath stroke + 2.54 2.29 moveto + 2.58 2.39 lineto +closepath stroke + 2.59 2.12 moveto + 2.77 2.18 lineto +closepath stroke + 2.59 2.12 moveto + 2.71 2.07 lineto +closepath stroke + 2.71 2.07 moveto + 2.82 1.99 lineto +closepath stroke + 2.71 2.07 moveto + 2.77 2.18 lineto +closepath stroke + 2.82 1.99 moveto + 3.03 2.07 lineto +closepath stroke + 2.82 1.99 moveto + 2.95 1.93 lineto +closepath stroke + 2.77 2.18 moveto + 2.82 2.33 lineto +closepath stroke + 2.77 2.18 moveto + 2.95 2.28 lineto +closepath stroke + 2.95 1.93 moveto + 3.07 1.84 lineto +closepath stroke + 2.95 1.93 moveto + 3.03 2.07 lineto +closepath stroke + 3.07 1.84 moveto + 3.31 1.94 lineto +closepath stroke + 3.07 1.84 moveto + 3.22 1.78 lineto +closepath stroke + 3.03 2.07 moveto + 2.95 2.28 lineto +closepath stroke + 3.03 2.07 moveto + 3.08 2.22 lineto +closepath stroke + 3.22 1.78 moveto + 3.35 1.68 lineto +closepath stroke + 3.22 1.78 moveto + 3.31 1.94 lineto +closepath stroke + 3.35 1.68 moveto + 3.62 1.81 lineto +closepath stroke + 3.35 1.68 moveto + 3.51 1.61 lineto +closepath stroke + 3.31 1.94 moveto + 3.22 2.19 lineto +closepath stroke + 3.31 1.94 moveto + 3.37 2.12 lineto +closepath stroke + 3.51 1.61 moveto + 3.65 1.51 lineto +closepath stroke + 3.51 1.61 moveto + 3.62 1.81 lineto +closepath stroke + 3.65 1.51 moveto + 3.96 1.65 lineto +closepath stroke + 3.65 1.51 moveto + 3.83 1.43 lineto +closepath stroke + 3.62 1.81 moveto + 3.70 2.05 lineto +closepath stroke + 3.62 1.81 moveto + 3.86 1.98 lineto +closepath stroke + 3.83 1.43 moveto + 3.99 1.31 lineto +closepath stroke + 3.83 1.43 moveto + 3.96 1.65 lineto +closepath stroke + 3.99 1.31 moveto + 4.33 1.49 lineto +closepath stroke + 3.99 1.31 moveto + 4.18 1.23 lineto +closepath stroke + 3.96 1.65 moveto + 4.05 1.94 lineto +closepath stroke + 3.96 1.65 moveto + 4.23 1.86 lineto +closepath stroke + 4.18 1.23 moveto + 4.36 1.10 lineto +closepath stroke + 4.18 1.23 moveto + 4.33 1.49 lineto +closepath stroke + 4.36 1.10 moveto + 4.74 1.31 lineto +closepath stroke + 4.36 1.10 moveto + 4.57 1.01 lineto +closepath stroke + 4.33 1.49 moveto + 4.44 1.82 lineto +closepath stroke + 4.76 0.87 moveto + 4.57 1.01 lineto +closepath stroke + 4.76 0.87 moveto + 5.00 0.76 lineto +closepath stroke + 4.57 1.01 moveto + 4.74 1.31 lineto +closepath stroke + 5.21 0.50 moveto + 5.00 0.76 lineto +closepath stroke + 5.21 0.50 moveto + 5.47 0.38 lineto +closepath stroke + 5.47 0.38 moveto + 5.76 0.26 lineto +closepath stroke + 5.76 0.26 moveto + 6.07 0.00 lineto +closepath stroke + 2.07 2.57 moveto + 2.16 2.52 lineto +closepath stroke + 2.16 2.52 moveto + 2.18 2.60 lineto +closepath stroke + 2.16 2.52 moveto + 2.26 2.50 lineto +closepath stroke + 2.26 2.50 moveto + 2.36 2.46 lineto +closepath stroke + 2.26 2.50 moveto + 2.18 2.60 lineto +closepath stroke + 2.36 2.46 moveto + 2.39 2.56 lineto +closepath stroke + 2.36 2.46 moveto + 2.46 2.44 lineto +closepath stroke + 2.19 2.67 moveto + 2.29 2.67 lineto +closepath stroke + 2.19 2.67 moveto + 2.09 2.69 lineto +closepath stroke + 2.19 2.67 moveto + 2.18 2.60 lineto +closepath stroke + 2.29 2.67 moveto + 2.40 2.64 lineto +closepath stroke + 2.29 2.67 moveto + 2.39 2.56 lineto +closepath stroke + 2.09 2.69 moveto + 2.18 2.60 lineto +closepath stroke + 2.46 2.44 moveto + 2.58 2.39 lineto +closepath stroke + 2.46 2.44 moveto + 2.39 2.56 lineto +closepath stroke + 2.58 2.39 moveto + 2.62 2.51 lineto +closepath stroke + 2.58 2.39 moveto + 2.69 2.36 lineto +closepath stroke + 2.40 2.64 moveto + 2.51 2.64 lineto +closepath stroke + 2.40 2.64 moveto + 2.39 2.56 lineto +closepath stroke + 2.51 2.64 moveto + 2.63 2.62 lineto +closepath stroke + 2.51 2.64 moveto + 2.62 2.51 lineto +closepath stroke + 2.63 2.62 moveto + 2.75 2.62 lineto +closepath stroke + 2.63 2.62 moveto + 2.62 2.51 lineto +closepath stroke + 2.75 2.62 moveto + 2.88 2.59 lineto +closepath stroke + 2.75 2.62 moveto + 2.86 2.46 lineto +closepath stroke + 2.62 2.51 moveto + 2.69 2.36 lineto +closepath stroke + 2.69 2.36 moveto + 2.86 2.46 lineto +closepath stroke + 2.69 2.36 moveto + 2.82 2.33 lineto +closepath stroke + 2.95 2.28 moveto + 3.08 2.22 lineto +closepath stroke + 2.95 2.28 moveto + 2.82 2.33 lineto +closepath stroke + 3.08 2.22 moveto + 3.14 2.40 lineto +closepath stroke + 3.08 2.22 moveto + 3.22 2.19 lineto +closepath stroke + 2.88 2.59 moveto + 3.01 2.59 lineto +closepath stroke + 2.88 2.59 moveto + 2.86 2.46 lineto +closepath stroke + 3.01 2.59 moveto + 3.15 2.56 lineto +closepath stroke + 3.01 2.59 moveto + 3.14 2.40 lineto +closepath stroke + 2.86 2.46 moveto + 2.82 2.33 lineto +closepath stroke + 3.22 2.19 moveto + 3.37 2.12 lineto +closepath stroke + 3.22 2.19 moveto + 3.14 2.40 lineto +closepath stroke + 3.37 2.12 moveto + 3.44 2.34 lineto +closepath stroke + 3.37 2.12 moveto + 3.53 2.09 lineto +closepath stroke + 3.15 2.56 moveto + 3.30 2.56 lineto +closepath stroke + 3.15 2.56 moveto + 3.14 2.40 lineto +closepath stroke + 3.30 2.56 moveto + 3.46 2.53 lineto +closepath stroke + 3.30 2.56 moveto + 3.44 2.34 lineto +closepath stroke + 3.46 2.53 moveto + 3.62 2.53 lineto +closepath stroke + 3.46 2.53 moveto + 3.44 2.34 lineto +closepath stroke + 3.62 2.53 moveto + 3.79 2.49 lineto +closepath stroke + 3.62 2.53 moveto + 3.77 2.27 lineto +closepath stroke + 3.44 2.34 moveto + 3.53 2.09 lineto +closepath stroke + 3.53 2.09 moveto + 3.77 2.27 lineto +closepath stroke + 3.53 2.09 moveto + 3.70 2.05 lineto +closepath stroke + 3.79 2.49 moveto + 3.97 2.49 lineto +closepath stroke + 3.79 2.49 moveto + 3.77 2.27 lineto +closepath stroke + 3.97 2.49 moveto + 4.16 2.45 lineto +closepath stroke + 3.97 2.49 moveto + 4.13 2.19 lineto +closepath stroke + 3.77 2.27 moveto + 3.70 2.05 lineto +closepath stroke + 3.70 2.05 moveto + 3.86 1.98 lineto +closepath stroke + 3.86 1.98 moveto + 4.13 2.19 lineto +closepath stroke + 3.86 1.98 moveto + 4.05 1.94 lineto +closepath stroke + 4.16 2.45 moveto + 4.36 2.45 lineto +closepath stroke + 4.16 2.45 moveto + 4.13 2.19 lineto +closepath stroke + 4.36 2.45 moveto + 4.57 2.41 lineto +closepath stroke + 4.36 2.45 moveto + 4.53 2.11 lineto +closepath stroke + 4.13 2.19 moveto + 4.05 1.94 lineto +closepath stroke + 4.05 1.94 moveto + 4.23 1.86 lineto +closepath stroke + 4.23 1.86 moveto + 4.53 2.11 lineto +closepath stroke + 4.23 1.86 moveto + 4.44 1.82 lineto +closepath stroke + 4.57 2.41 moveto + 4.78 2.41 lineto +closepath stroke + 4.57 2.41 moveto + 4.53 2.11 lineto +closepath stroke + 4.78 2.41 moveto + 5.01 2.36 lineto +closepath stroke + 4.53 2.11 moveto + 4.44 1.82 lineto +closepath stroke +showpage diff --git a/DOC/paper.pdf b/DOC/paper.pdf new file mode 100644 index 0000000..787c0cc Binary files /dev/null and b/DOC/paper.pdf differ diff --git a/DOC/paper.ps b/DOC/paper.ps new file mode 100644 index 0000000..422ad97 --- /dev/null +++ b/DOC/paper.ps @@ -0,0 +1,46661 @@ +%!PS-Adobe-2.0 +%%Creator: dvips 5.495 Copyright 1986, 1992 Radical Eye Software +%%Pages: 36 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%EndComments +%DVIPSCommandLine: dvips +%DVIPSSource: TeX output 1994.06.05:2110 +%%BeginProcSet: tex.pro +%! +/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N} +B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 0 0 0] +concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution hsize +-72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix +currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put +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 +/IE 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 IE N end dup{/foo setfont}2 array copy cvx N load 0 nn +put /ctr 0 N[}B /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 dup definefont setfont}B /ch-width{ch-data +dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 +ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 +sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type +/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N +/cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get +S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height +sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 +-1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup +type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 +ne{dup dup length 1 sub dup 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 dup 1 get dup mul exch 0 get dup mul add +.99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict +/eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook} +if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255 +{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 +div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N +/ruley 0 N /v{/ruley X /rulex X V}B /V{}B /RV statusdict begin /product where{ +pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 +getinterval(NeXT)eq or}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 +TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 +-.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{ +gsave transform round exch round exch itransform moveto rulex 0 rlineto 0 +ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N +/tail{dup /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: special.pro +%! +TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs +792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen false N +/rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B /@scaleunit 100 N +/@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit div /vsc X}B /@hsize{/hs +X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{/CLIP 2 N}B /@hoffset{/ho X}B +/@voffset{/vo X}B /@angle{/ang X}B /@rwi{10 div /rwi X /rwiSeen true N}B /@rhi +{10 div /rhi X /rhiSeen true N}B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B +/@ury{/ury X}B /magscale true def end /@MacSetUp{userdict /md known{userdict +/md get type /dicttype eq{userdict begin md length 10 add md maxlength ge{/md +md dup length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{ +}N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath +mark{transform{itransform moveto}}{transform{itransform lineto}}{6 -2 roll +transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll +itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall +newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 +F/|______Courier fnt invertflag{PaintBlack}if}N /txpose{pxs pys scale ppr +aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S +neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 +get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 +get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get +neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop +pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get +neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get +neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 +get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 +1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp{pop pop +showpage pm restore}N end}if}if}N /normalscale{Resolution 72 div VResolution +72 div neg scale magscale{DVImag dup scale}if 0 setgray}N /psfts{S 65781.76 +div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin +/magscale false def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts +/psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X +/psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury +psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy +psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N /p 3 def +@MacSetUp}N /doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll +newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath +clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{ +SDict begin /SpecialSave save N gsave normalscale currentpoint TR +@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial{CLIP +1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath +clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{ +rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR}{rhiSeen{rhi ury lly +sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly +moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if +/showpage{}N /erasepage{}N /copypage{}N newpath}N /@endspecial{count ocount +sub{pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave +restore end}N /@defspecial{SDict begin}N /@fedspecial{end}B /li{lineto}B /rl{ +rlineto}B /rc{rcurveto}B /np{/SaveX currentpoint /SaveY X N 1 setlinecap +newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY moveto}N +/ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix +currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix +setmatrix}N end +%%EndProcSet +TeXDict begin 40258431 52099146 1000 300 300 () @start /Fa +70 123 df<1800C03C01E07E01E07E03E0E703C0E703C0E707C0E70780E70F80E70F00E70F007E +1F007E1E003C1E00183E00003C00007C0000780000780000F80000F00000F00001F00001E00003 +E00003C00003C0C007C3F00783F00787380F87380F07381F07381E07381E07383E07383C03F03C +03F01800C015277EA21A>37 D<0038007800F001E003C007800F000E001C001C00380038007000 +70007000E000E000E000E000E000E000E000E000E000E000700070007000380038001C001C000E +000F00078003C001E000F8007800380D2878A21A>40 D<6000F00078003C001E000F0007800380 +01C001C000E000E000700070007000380038003800380038003800380038003800380070007000 +7000E000E001C001C0038007800F001E003C007800F00060000D287CA21A>I<00E00000E00000 +E00000E00040E040F0E1E0F8E3E07EEFC01FFF0007FC0003F80007FC001FFF007EEFC0F8E3E0F0 +E1E040E04000E00000E00000E00000E00013157D991A>I<003000007800007800007800007800 +0078000078000078000078007FFFF0FFFFF8FFFFF87FFFF0007800007800007800007800007800 +00780000780000780000300015167E991A>I<183E7E7F3F1F070E0E1CFCF8E0080D77851A>I<7F +FFC0FFFFE0FFFFE07FFFC013047D901A>I<3078FCFC7830060676851A>I<0000C00001E00001E0 +0003E00003C00007C0000780000F80000F00000F00001F00001E00003E00003C00007C00007800 +00780000F80000F00001F00001E00003E00003C00003C00007C0000780000F80000F00001F0000 +1E00001E00003E00003C00007C0000780000F80000F00000F0000060000013277DA21A>I<01F0 +0007FC000FFE001F1F001C07003803803803807001C07001C07001C0E000E0E000E0E000E0E000 +E0E000E0E000E0E000E0E000E0E000E0F001E07001C07001C07803C03803803C07801C07001F1F +000FFE0007FC0001F000131E7D9D1A>I<00C001C001C003C007C00FC07FC0FDC071C001C001C0 +01C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C07FFF7FFF7FFF10 +1E7B9D1A>I<03F0000FFC001FFF003C0F807803C07001C0E000E0F000E0F000E06000E00000E0 +0000E00001C00001C0000380000780000F00000E00003C00007C0000F00001E00003C000078000 +0F00001E00E03C00E07FFFE0FFFFE07FFFE0131E7D9D1A>I<01FC0007FF001FFF801E03C03C01 +C03C00E03C00E00000E00000E00001C00003C000078001FF0001FF0001FFC00003E00000F00000 +70000078000038000038600038F00038F00078E000707000F07E03E03FFFC00FFF0001FC00151E +7E9D1A>I<000F80001F80003B80003B8000738000F38000E38001C38003C3800383800783800F +03800E03801E03803C0380380380780380F00380FFFFFEFFFFFEFFFFFE00038000038000038000 +0380000380000380003FF8007FFC003FF8171E7F9D1A>I<3FFFC07FFFC07FFFC0700000700000 +70000070000070000070000070000070000071F8007FFE007FFF007E07807803C03001C00001C0 +0000E00000E00000E06000E0F000E0F001C0E001C07003807C0F803FFF000FFC0003F000131E7D +9D1A>I<007E0001FF8003FFC00781E00F01E01E01E03C00C0380000700000700000700000E1F8 +00E7FE00FFFF00FE0780F803C0F001C0F000E0F000E0E000E0F000E07000E07000E07001C03801 +C03C03801E0F800FFF0007FC0001F000131E7D9D1A>II<01FC0007FF001FFFC01F07C03C01E07800F07000707000707000707800F03800E0 +1E03C00FFF8003FE0007FF001F8FC03C01E07800F0700070E00038E00038E00038E00038F00078 +7000707800F03E03E01FFFC007FF0001FC00151E7E9D1A>I<01F00007FC001FFE003E0F003807 +807003807001C0E001C0E001C0E001E0E000E0E000E0E001E07001E07803E03C0FE01FFFE00FFC +E003F0E00001C00001C00001C0000380600380F00700F00F00F03E007FFC003FF0000FC000131E +7D9D1A>I<3078FCFC78300000000000000000003078FCFC7830061576941A>I<0000C00003E000 +07E0000FC0003F80007E0000FC0003F80007E0000FC0003F80007E0000FC0000FC00007E00003F +80000FC00007E00003F80000FC00007E00003F80000FC00007E00003E00000C0131A7D9B1A>60 +D<7FFFF0FFFFF8FFFFF87FFFF00000000000000000000000007FFFF0FFFFF8FFFFF87FFFF0150C +7E941A>I<600000F80000FC00007E00003F80000FC00007E00003F80000FC00007E00003F8000 +0FC00007E00007E0000FC0003F80007E0000FC0003F80007E0000FC0003F80007E0000FC0000F8 +0000600000131A7D9B1A>I<003800007C00007C00006C0000EE0000EE0000EE0000C60000C600 +01C70001C70001C70001C7000383800383800383800383800701C00701C007FFC007FFC00FFFE0 +0E00E00E00E00E00E00E00E01C00707F01FCFF83FE7F01FC171E7F9D1A>65 +DI<007C3801FF3807FFF80F83F81E00F81C007838 +0078380038700038700038700000E00000E00000E00000E00000E00000E00000E00000E0000070 +00007000387000383800383800381C00701E00F00F83E007FFC001FF80007C00151E7E9D1A>I< +7FFE00FFFF007FFF801C07C01C01E01C00F01C00701C00781C00381C00381C003C1C001C1C001C +1C001C1C001C1C001C1C001C1C001C1C001C1C003C1C00381C00381C00781C00701C00F01C01E0 +1C07C07FFFC0FFFF007FFE00161E7F9D1A>II<7F +FFFCFFFFFC7FFFFC0E001C0E001C0E001C0E001C0E00000E00000E00000E03800E03800E03800F +FF800FFF800FFF800E03800E03800E03800E00000E00000E00000E00000E00000E00000E00000E +00007FE000FFE0007FE000161E7F9D1A>I72 +DI<01FFC003FFC001FFC0000E00000E00000E0000 +0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000 +0E00000E00000E00000E00600E00F00E00F01E00F03C007FF8003FF0000FC000121E7C9D1A>I< +7F03F8FF87FC7F03F81C01E01C03C01C03801C07001C0F001C1E001C1C001C38001C78001CF000 +1CF8001DF8001FDC001F9C001F0E001E0F001E07001C07801C03801C01C01C01C01C00E01C00E0 +1C00707F00FCFF81FE7F00FC171E7F9D1A>I<7FE000FFF0007FE0000E00000E00000E00000E00 +000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00 +000E00000E00000E001C0E001C0E001C0E001C0E001C7FFFFCFFFFFC7FFFFC161E7F9D1A>I<7E +003F00FF007F807F007F001D80DC001D80DC001D80DC001DC1DC001DC1DC001CC19C001CC19C00 +1CE39C001CE39C001C631C001C771C001C771C001C361C001C361C001C3E1C001C1C1C001C1C1C +001C001C001C001C001C001C001C001C001C001C001C001C001C001C007F007F00FF80FF807F00 +7F00191E809D1A>II<0FFE003FFF807FFFC07C07 +C07001C0F001E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000 +E0E000E0E000E0E000E0E000E0E000E0E000E0F001E0F001E07001C07C07C07FFFC03FFF800FFE +00131E7D9D1A>II82 D<03F1C00FFDC03FFFC07C0FC07003C0E003C0E001C0E001C0E001C0E0000070 +00007800003F00001FF00007FE0000FF00000F800003C00001C00000E00000E06000E0E000E0E0 +00E0E001C0F001C0FC0780FFFF80EFFE00E3F800131E7D9D1A>I<7FFFFEFFFFFEFFFFFEE0380E +E0380EE0380EE0380E003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380003FF8003FF8003FF80 +171E7F9D1A>II87 D<7F87F87F87F87F87F80F01C007038007838003870003C70001CE0001EE0000FC +0000FC00007800007800007800007C00007C0000FE0000EE0001CF0001C7000387800383800703 +C00701C00E00E00E00E07F01FCFF83FE7F01FC171E7F9D1A>II<1FF0003FFC007FFE00780F00300700000380000380007F8007FF801FFF803F8380 +780380700380E00380E00380E00380700780780F803FFFFC1FFDFC07F0FC16157D941A>97 +DI<00FF8003FFC00FFFE01F01E03C00C078000070 +0000700000E00000E00000E00000E00000E000007000007000007800703C00701F01F00FFFE003 +FFC000FE0014157D941A>I<001FC0001FC0001FC00001C00001C00001C00001C00001C00001C0 +01F1C007FDC00FFFC01E0FC03C07C07803C07001C0E001C0E001C0E001C0E001C0E001C0E001C0 +E001C07003C07003C03807C03E0FC01FFFFC07FDFC01F1FC161E7E9D1A>I<01F80007FF000FFF +801E07C03C01C07800E07000E0E00070E00070FFFFF0FFFFF0FFFFF0E000007000007000007800 +703C00701F01F00FFFE003FFC000FE0014157D941A>I<0007E0001FF0003FF800787800F03000 +E00000E00000E00000E0007FFFF0FFFFF0FFFFF000E00000E00000E00000E00000E00000E00000 +E00000E00000E00000E00000E00000E00000E00000E00000E0003FFF807FFFC03FFF80151E7F9D +1A>I<01F87C07FFFE0FFFFE1E078C1C03803801C03801C03801C03801C03801C01C03801E0780 +1FFF001FFE0039F8003800003800001C00001FFF801FFFE03FFFF878007C70001CE0000EE0000E +E0000EE0000E70001C78003C3E00F81FFFF007FFC001FF0017217F941A>II<00C00001E00001E00000C00000000000000000000000000000000000 +00007FE0007FE0007FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000 +E00000E00000E00000E00000E00000E0007FFF80FFFFC07FFF80121F7C9E1A>I<000C001E001E +000C0000000000000000000000000FFE0FFE0FFE000E000E000E000E000E000E000E000E000E00 +0E000E000E000E000E000E000E000E000E000E000E000E000E000E001C601CF038FFF87FF01FC0 +0F2A7E9E1A>III<7CE0E000FFFBF8007FFFF8001F1F1C001E1E1C001E1E1C001C1C1C001C1C1C001C +1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C00 +7F1F1F00FF9F9F807F1F1F00191580941A>II<01F00007FC001FFF003E0F803C07807803C07001C0E000E0E000E0E0 +00E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF0007FC0001F00013157D94 +1A>II<7F83F0FF8FF87FBFFC03FC +3C03F01803E00003C00003C0000380000380000380000380000380000380000380000380000380 +000380007FFF00FFFF007FFF0016157E941A>114 D<07FB801FFF807FFF80780780E00380E003 +80E003807800007FC0003FFC0007FE00003F800007806001C0E001C0E001C0F003C0FC0780FFFF +00EFFE00E3F80012157C941A>I<00C00001C00001C00001C00001C00001C00001C0007FFFE0FF +FFE0FFFFE001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C07001 +C07001C07001C07000E0E000FFE0007FC0001F00141C7F9B1A>II<7F83FCFFC7FE7F83FC0E00E00E00E00E00E00701 +C00701C00701C003838003838003838001C70001C70001C70000EE0000EE0000EE00007C00007C +0000380017157F941A>II<7FC7F87FCFFC7FC7F80703C003838003C70001EF0000FE00007C00007800003800007C00 +00EE0001EE0001C7000383800783C00F01C07FC7FCFFC7FE7FC7FC17157F941A>I<7FC3FCFFC7 +FE7FC3FC0E00E00E00E00700E00701C00781C00381C003838003C38001C38001C70000E70000E7 +0000E600006600006E00003C00003C00003C0000380000380000380000700000700030700078E0 +0071E0007FC0003F80001E000017207F941A>I<7FFFF0FFFFF0FFFFF0E001E0E003C0E0078000 +0F00001E00003C0000780000F00001E00003C0000780000F00381E00383C0038780038FFFFF8FF +FFF8FFFFF815157E941A>I E /Fb 2 50 df<060F0F0E1E1E1C3C383830707060E0C04008117F +910A>48 D<0F8007C019E01C202070301040184008C00C80048007800480070004800380048007 +80048004C00C400860082030381010E01E600F8007C01E0E7E8D23>I E +/Fc 2 51 df<0C001C00EC000C000C000C000C000C000C000C000C000C000C000C000C000C000C +000C00FFC00A137D9211>49 D<1F0060C06060F070F030603000700070006000C001C001800200 +04000810101020207FE0FFE00C137E9211>I E /Fd 5 51 df<0102040C1818303070606060E0 +E0E0E0E0E0E0E0E0E060606070303018180C04020108227D980E>40 D<8040203018180C0C0E06 +0606070707070707070707070606060E0C0C18183020408008227E980E>I<0030000030000030 +00003000003000003000003000003000003000003000003000FFFFFCFFFFFC0030000030000030 +0000300000300000300000300000300000300000300000300016187E931B>43 +D<03000700FF000700070007000700070007000700070007000700070007000700070007000700 +07007FF00C157E9412>49 D<0F8030E040708030C038E0384038003800700070006000C0018003 +0006000C08080810183FF07FF0FFF00D157E9412>I E /Fe 2 51 df<0C003C00CC000C000C00 +0C000C000C000C000C000C000C000C000C000C00FF8009107E8F0F>49 D<1F00618040C08060C0 +600060006000C00180030006000C00102020207FC0FFC00B107F8F0F>I +E /Ff 8 112 df<60F0F070101020204040040A7D830A>59 D<1FFFFE381C0E201C04601C0440 +1C0440380480380400380000380000700000700000700000700000E00000E00000E00000E00001 +C00001C00001C00001C00003C0007FFC0017177F9615>84 D<000E001300370036006000600060 +0060006007FC00C000C000C000C000C001800180018001800180018003000300030003006600E6 +00CC007800101D7E9611>102 D<0300038003000000000000000000000000001C002400460046 +008C000C0018001800180031003100320032001C0009177F960C>105 D<001800380010000000 +00000000000000000001C0022004300430086000600060006000C000C000C000C0018001800180 +01806300E300C60078000D1D80960E>I<1F0006000600060006000C000C000C000C00181C1866 +188E190C32003C003F00318060C060C460C460C8C0C8C0700F177E9612>I<383C0044C6004702 +004602008E06000C06000C06000C0C00180C00180C40181840181880300880300F00120E7F8D15 +>110 D<07C00C20101020186018C018C018C01880308030C060C0C061803E000D0E7E8D11>I +E /Fg 9 115 df0 D<800002C0000660000C3000181800300C +00600600C003018001830000C600006C00003800003800006C0000C6000183000301800600C00C +006018003030001860000CC000068000021718789727>2 D<00C00000C00000C00000C00000C0 +00C0C0C0F0C3C038C7000EDC0003F00000C00003F0000EDC0038C700F0C3C0C0C0C000C00000C0 +0000C00000C00000C00012157D9619>I<00008000000180000001800000018000000180000001 +800000018000000180000001800000018000000180000001800000018000000180000001800000 +018000FFFFFFFFFFFFFFFF00018000000180000001800000018000000180000001800000018000 +00018000000180000001800000018000000180000001800000018000FFFFFFFFFFFFFFFF20227D +A027>6 D<000FF00000700E000180018002000040040000200800001010000008100000082000 +000420000004400000024000000240000002800000018003C0018007E0018007E0018007E00180 +07E0018003C0018000000140000002400000024000000220000004200000041000000810000008 +0800001004000020020000400180018000700E00000FF00020227D9C27>12 +D<03F0000FFC001FFE003FFF007FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFF +C0FFFFC07FFF807FFF803FFF001FFE000FFC0003F00012147D9519>15 D<000003000003000006 +00000600000C00000C0000180000180000300000300000600000600000C00000C00000C0000180 +000180000300000300000600000600000C00000C00001800001800003000003000006000006000 +00C00000C0000180000180000300000300000300000600000600000C00000C0000180000180000 +300000300000600000600000C00000400000183079A300>54 D<8010C030C030C030C030C030C0 +30C030C030C030C030C030C030C030C030C030C030C030C030C030C030C030C030C030C030C030 +C030C030C030C030C030C030C030C030C030C030C030C030C030C030C030C030C030C030C030C0 +30C030C030C03080100C327AA419>107 D114 D E /Fh 65 122 df<00180030006000C001C00380070007000E001E001C003C00 +3C003C007800780078007800F800F000F000F000F000F000F000F000F000F000F000F000F80078 +007800780078003C003C003C001C001E000E0007000700038001C000C00060003000180D317BA4 +16>40 DI<387CFEFFFF7F3B03 +030706060C1C18702008117C8610>44 DI<387CFEFEFE7C38 +07077C8610>I<00FE0007FFC00F83E01F01F03E00F83E00F87C007C7C007C7C007CFC007CFC00 +7EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007E7C00 +7C7C007C7C007C3E00F83E00F81F01F00F83E007FFC000FE0017207E9F1C>48 +D<00180000780001F800FFF800FFF80001F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F8007FFFE07FFFE013207C9F1C>I<03FC000FFF003C1FC07007E07C +07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003F80003F00003F00007E00007C0000F8000 +1F00003E0000380000700000E01801C0180380180700180E00380FFFF01FFFF03FFFF07FFFF0FF +FFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E01E03F03F03F03F81F83F81F83F81F81F03F8 +1F03F00003F00003E00007C0001F8001FE0001FF000007C00001F00001F80000FC0000FC3C00FE +7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F81E07F00FFFC001FE0017207E9F1C>I<0000 +E00001E00003E00003E00007E0000FE0001FE0001FE00037E00077E000E7E001C7E00187E00307 +E00707E00E07E00C07E01807E03807E07007E0E007E0FFFFFEFFFFFE0007E00007E00007E00007 +E00007E00007E00007E000FFFE00FFFE17207E9F1C>I<1000201E01E01FFFC01FFF801FFF001F +FE001FF8001BC00018000018000018000018000019FC001FFF001E0FC01807E01803E00003F000 +03F00003F80003F83803F87C03F8FE03F8FE03F8FC03F0FC03F07007E03007C01C1F800FFF0003 +F80015207D9F1C>I<001F8000FFE003F07007C0F00F01F81F01F83E01F83E01F87E00F07C0000 +7C0000FC0800FC7FC0FCFFE0FD80F0FF00F8FE007CFE007CFC007EFC007EFC007EFC007E7C007E +7C007E7C007E3C007C3E007C1E00F80F00F00783E003FFC000FF0017207E9F1C>I<6000007800 +007FFFFE7FFFFE7FFFFC7FFFF87FFFF87FFFF0E00060E000C0C00180C00300C00300000600000C +00001C0000180000380000780000780000F00000F00000F00001F00001F00001F00003F00003F0 +0003F00003F00003F00003F00003F00001E00017227DA11C>I<00FE0003FFC00703E00E00F01C +00F01C00783C00783E00783F00783F80783FE0F01FF9E01FFFC00FFF8007FFC003FFE007FFF01E +7FF83C1FFC7807FC7801FEF000FEF0003EF0001EF0001EF0001CF8001C7800383C00381F01F00F +FFC001FF0017207E9F1C>I<01FE0007FF800F83E01E01F03E00F07C00F87C0078FC007CFC007C +FC007CFC007EFC007EFC007EFC007E7C00FE7C00FE3E01FE1E037E0FFE7E07FC7E00207E00007C +00007C1E007C3F00F83F00F83F00F03F01E01E03C01C0F800FFE0003F80017207E9F1C>I<387C +FEFEFE7C380000000000000000387CFEFEFE7C3807167C9510>I<000070000000007000000000 +F800000000F800000000F800000001FC00000001FC00000003FE00000003FE00000003FE000000 +06FF000000067F0000000E7F8000000C3F8000000C3F800000183FC00000181FC00000381FE000 +00300FE00000300FE00000600FF000006007F00000E007F80000FFFFF80000FFFFF800018001FC +00018001FC00038001FE00030000FE00030000FE000600007F000600007F00FFE00FFFF8FFE00F +FFF825227EA12A>65 DI<0003FE0080001FFF +818000FF01E38001F8003F8003E0001F8007C0000F800F800007801F800007803F000003803F00 +0003807F000001807E000001807E00000180FE00000000FE00000000FE00000000FE00000000FE +00000000FE00000000FE00000000FE000000007E000000007E000001807F000001803F00000180 +3F000003801F800003000F8000030007C000060003F0000C0001F800380000FF00F000001FFFC0 +000003FE000021227DA128>IIII<0003FE0040001FFFC0C0007F00F1C001F8003FC003F0000FC007C00007C00F +C00003C01F800003C03F000001C03F000001C07F000000C07E000000C07E000000C0FE00000000 +FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000FFFFC7E000FFF +FC7F00001FC07F00001FC03F00001FC03F00001FC01F80001FC00FC0001FC007E0001FC003F000 +1FC001FC003FC0007F80E7C0001FFFC3C00003FF00C026227DA12C>III<03FFFF03FFFF0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 +0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F01807F0 +7E07F0FF07F0FF07F0FF07F0FF07E07E0FE07C1FC01FFF0007F80018227FA11D>IIII +I<0007FC0000003FFF800000FC07E00003F001F80007E000FC000FC0007E001F80003F001F8000 +3F003F00001F803F00001F807F00001FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00 +000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000FC07F +00001FC07F00001FC03F00001F803F80003F801F80003F000FC0007E0007E000FC0003F001F800 +00FC07E000003FFF80000007FC000023227DA12A>II<0007FC0000003FFF800000FC07E00003F001F80007E000FC000FC0007E00 +1F80003F001F80003F003F00001F803F00001F807F00001FC07E00000FC07E00000FC0FE00000F +E0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE0000 +0FE07E00000FC07F00001FC07F00001FC03F00001F803F81F03F801F83F83F000FC70C7E0007E6 +06FC0003F607F80000FF07E000003FFF80000007FF80200000038020000001C020000001E0E000 +0001FFE0000001FFC0000000FFC0000000FFC00000007F800000007F000000001E00232C7DA12A +>II<01FC0407FF8C1F03FC3C007C7C003C78 +001C78001CF8000CF8000CFC000CFC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03 +FFFE003FFE0003FF00007F00003F00003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF +00F8C7FFE080FF8018227DA11F>I<7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803 +806003F80180E003F801C0E003F801C0C003F800C0C003F800C0C003F800C0C003F800C00003F8 +00000003F800000003F800000003F800000003F800000003F800000003F800000003F800000003 +F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8000000 +03F800000003F800000003F800000003F8000003FFFFF80003FFFFF80022227EA127>III< +FFFF0FFFF01FFEFFFF0FFFF01FFE0FF000FF0000E007F0007F0000C007F0007F0000C003F8007F +80018003F8003F80018003FC003F80038001FC003FC0030001FC003FC0030000FE007FE0060000 +FE006FE0060000FF006FE00600007F00C7F00C00007F00C7F00C00007F80C7F81C00003F8183F8 +1800003F8183F81800001FC383FC3000001FC301FC3000001FE301FC3000000FE600FE6000000F +E600FE6000000FF600FFE0000007FC007FC0000007FC007FC0000003FC007F80000003F8003F80 +000003F8003F80000001F0001F00000001F0001F00000000F0001E00000000E0000E00000000E0 +000E000037227FA13A>I<7FFFC1FFF07FFFC1FFF003FC000C0001FE00180000FE00380000FF00 +7000007F806000003F80C000003FC1C000001FE38000000FE30000000FF700000007FE00000003 +FC00000003FC00000001FE00000000FE00000000FF00000000FF80000001FFC0000001BFC00000 +031FE00000070FF000000E0FF000000C07F800001803FC00003803FC00003001FE00006000FF00 +00E000FF0001C0007F800180003FC0FFFC03FFFEFFFC03FFFE27227FA12A>II<3FFFFFE03FFFFFE03F801FC03E003FC03C003F8038007F0070 +00FF007000FE007001FE006003FC006003F8006007F8000007F000000FE000001FE000001FC000 +003FC000007F8000007F000000FF000000FE006001FC006003FC006003F8006007F800E00FF000 +E00FE000E01FE001C01FC001C03F8003C07F8007C07F003FC0FFFFFFC0FFFFFFC01B227DA122> +I<07FC001FFF803F07C03F03E03F01E03F01F01E01F00001F00001F0003FF003FDF01FC1F03F01 +F07E01F0FC01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F18167E951B>97 +DI<00FF8007FFE00F83 +F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC0000FC0000FC0000FC00007C00007E00 +007E00003E00301F00600FC0E007FF8000FE0014167E9519>I<0001FE000001FE0000003E0000 +003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E00 +01FC3E0007FFBE000F81FE001F007E003E003E007E003E007C003E00FC003E00FC003E00FC003E +00FC003E00FC003E00FC003E00FC003E00FC003E007C003E007C003E003E007E001E00FE000F83 +BE0007FF3FC001FC3FC01A237EA21F>I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC +00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00003E00181F00300FC07003 +FFC000FF0015167E951A>I<003F8000FFC001E3E003C7E007C7E00F87E00F83C00F80000F8000 +0F80000F80000F80000F8000FFFC00FFFC000F80000F80000F80000F80000F80000F80000F8000 +0F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80007FF8007FF800 +13237FA211>I<03FC1E0FFF7F1F0F8F3E07CF3C03C07C03E07C03E07C03E07C03E07C03E03C03 +C03E07C01F0F801FFF0013FC003000003000003800003FFF801FFFF00FFFF81FFFFC3800FC7000 +3EF0001EF0001EF0001EF0001E78003C7C007C3F01F80FFFE001FF0018217E951C>II<1C003F007F007F007F003F001C +000000000000000000000000000000FF00FF001F001F001F001F001F001F001F001F001F001F00 +1F001F001F001F001F001F001F001F00FFE0FFE00B247EA310>I107 DIII<00FE0007FFC00F83E01E00F03E00F87C007C7C00 +7C7C007CFC007EFC007EFC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00F81F01F00F83 +E007FFC000FE0017167E951C>II<00FE030007FF87 +000FC1C7001F006F003F003F007E003F007E001F007C001F00FC001F00FC001F00FC001F00FC00 +1F00FC001F00FC001F00FC001F007E001F007E001F003E003F001F007F000FC1DF0007FF9F0001 +FC1F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F000000FFE0 +0000FFE01B207E951E>II<0FF3003FFF00781F00600700E00300E00300F00300FC00007FE0007FF8003FFE00 +0FFF0001FF00000F80C00780C00380E00380E00380F00700FC0E00EFFC00C7F00011167E9516> +I<0180000180000180000180000380000380000780000780000F80003F8000FFFF00FFFF000F80 +000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F81800F81800F81 +800F81800F81800F830007C30003FE0000F80011207F9F16>IIII +121 D E /Fi 49 121 df<0001FF81FE00001FFFEFFF80007F80FF87C000FC00FE0FE001F801FE +0FE003F801FC0FE007F001FC0FE007F001FC07C007F001FC000007F001FC000007F001FC000007 +F001FC000007F001FC000007F001FC000007F001FC0000FFFFFFFFF800FFFFFFFFF800FFFFFFFF +F80007F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007 +F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC +000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007 +F001FC000007F001FC00007FFF1FFFE0007FFF1FFFE0007FFF1FFFE0002B2A7FA928>11 +D<1C003E007F00FF80FF80FF807F003E001C0009097B8813>46 D<003F800001FFF00007E0FC00 +0FC07E001F803F001F803F003F001F803F001F807F001FC07F001FC07F001FC07F001FC0FF001F +E0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF00 +1FE0FF001FE0FF001FE0FF001FE0FF001FE07F001FC07F001FC07F001FC07F001FC03F001F803F +001F801F803F001F803F000FC07E0007E0FC0001FFF000003F80001B277DA622>48 +D<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE007FFFFE7FFFFE7FFF +FE17277BA622>I<00FF800003FFF0000FFFFC001F03FE003800FF007C007F80FE003FC0FF003F +C0FF003FE0FF001FE0FF001FE07E001FE03C003FE000003FE000003FC000003FC000007F800000 +7F000000FE000000FC000001F8000003F0000003E00000078000000F0000001E0000003C00E000 +7000E000E000E001C001C0038001C0070001C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80 +FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007FFFC000F81FE001F00FF003F80FF00 +3F807F803F807F803F807F801F807F800F007F800000FF000000FF000000FE000001FC000001F8 +000007F00000FFC00000FFF0000001FC0000007E0000007F0000007F8000003FC000003FC00000 +3FE000003FE03C003FE07E003FE0FF003FE0FF003FE0FF003FC0FF007FC07E007F807C007F003F +01FE001FFFFC0007FFF00000FF80001B277DA622>I<00000E0000001E0000003E0000007E0000 +00FE000000FE000001FE000003FE0000077E00000E7E00000E7E00001C7E0000387E0000707E00 +00E07E0000E07E0001C07E0003807E0007007E000E007E000E007E001C007E0038007E0070007E +00E0007E00FFFFFFF8FFFFFFF8FFFFFFF80000FE000000FE000000FE000000FE000000FE000000 +FE000000FE000000FE00007FFFF8007FFFF8007FFFF81D277EA622>I<0C0003000F803F000FFF +FE000FFFFC000FFFF8000FFFF0000FFFE0000FFFC0000FFE00000E0000000E0000000E0000000E +0000000E0000000E0000000E7FC0000FFFF8000F80FC000E003E000C003F0000001F8000001FC0 +00001FC000001FE000001FE018001FE07C001FE0FE001FE0FE001FE0FE001FE0FE001FC0FC001F +C078003F8078003F803C007F001F01FE000FFFF80003FFF00000FF80001B277DA622>I<380000 +003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF0070000E007000 +0E0070001C00E0003800E0007000E000E0000000E0000001C00000038000000780000007800000 +0F0000000F0000001F0000001F0000003F0000003E0000003E0000007E0000007E0000007E0000 +007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000007C00 +00003800001C297CA822>55 D<000003800000000007C00000000007C0000000000FE000000000 +0FE0000000000FE0000000001FF0000000001FF0000000003FF8000000003FF8000000003FF800 +00000073FC0000000073FC00000000F3FE00000000E1FE00000000E1FE00000001C0FF00000001 +C0FF00000003C0FF80000003807F80000007807FC0000007003FC0000007003FC000000E003FE0 +00000E001FE000001E001FF000001C000FF000001FFFFFF000003FFFFFF800003FFFFFF8000078 +0007FC0000700003FC0000700003FC0000E00001FE0000E00001FE0001E00001FF0001C00000FF +0001C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001FFFFE2F297EA834>65 +DI<00003FF001800003FFFE0380000FFFFF878000 +3FF007DF8000FF8001FF8001FE00007F8003FC00003F8007F000001F800FF000000F801FE00000 +07801FE0000007803FC0000007803FC0000003807FC0000003807F80000003807F8000000000FF +8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000 +0000FF8000000000FF80000000007F80000000007F80000000007FC0000003803FC0000003803F +C0000003801FE0000003801FE0000007000FF00000070007F000000E0003FC00001E0001FE0000 +3C0000FF8000F800003FF007E000000FFFFFC0000003FFFF000000003FF8000029297CA832>I< +FFFFFFF80000FFFFFFFF8000FFFFFFFFE00003FC001FF80003FC0007FC0003FC0001FE0003FC00 +00FF0003FC00007F8003FC00003FC003FC00001FC003FC00001FE003FC00001FE003FC00000FF0 +03FC00000FF003FC00000FF003FC00000FF003FC00000FF803FC00000FF803FC00000FF803FC00 +000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF8 +03FC00000FF003FC00000FF003FC00000FF003FC00001FE003FC00001FE003FC00001FC003FC00 +003FC003FC00007F8003FC00007F0003FC0001FE0003FC0003FC0003FC001FF800FFFFFFFFE000 +FFFFFFFF8000FFFFFFFC00002D297DA835>III73 D75 DIII<0000FFE000000007FFFC +0000003FC07F8000007F001FC00001FC0007F00003F80003F80007F00001FC000FF00001FE001F +E00000FF001FE00000FF003FC000007F803FC000007F807FC000007FC07F8000003FC07F800000 +3FC07F8000003FC0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF +8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE07F8000003FC07FC00000 +7FC07FC000007FC03FC000007F803FC000007F801FE00000FF001FE00000FF000FF00001FE0007 +F00001FC0003F80003F80001FC0007F00000FF001FE000003FC07F8000000FFFFE00000000FFE0 +00002B297CA834>II82 D<007F806003FFF0E007FFF9E00F807FE01F001FE03E0007E07C0003E07C0001E0 +FC0001E0FC0001E0FC0000E0FE0000E0FE0000E0FF000000FFC000007FFE00007FFFE0003FFFFC +001FFFFE000FFFFF8007FFFFC003FFFFE000FFFFE00007FFF000007FF000000FF8000007F80000 +03F8600001F8E00001F8E00001F8E00001F8F00001F0F00001F0F80003F0FC0003E0FF0007C0FF +E01F80F3FFFF00E0FFFE00C01FF0001D297CA826>I<7FFFFFFFFFC07FFFFFFFFFC07FFFFFFFFF +C07F803FC03FC07E003FC007C078003FC003C078003FC003C070003FC001C0F0003FC001E0F000 +3FC001E0E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E000003FC000 +0000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000000000 +3FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000 +0000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000000000 +3FC0000000003FC00000007FFFFFE000007FFFFFE000007FFFFFE0002B287EA730>III89 D<01FF800007FFF0000F81F8001FC07E001FC07E00 +1FC03F000F803F8007003F8000003F8000003F8000003F80000FFF8000FFFF8007FC3F800FE03F +803F803F803F003F807F003F80FE003F80FE003F80FE003F80FE003F807E007F807F00DF803F83 +9FFC0FFF0FFC01FC03FC1E1B7E9A21>97 D<001FF80000FFFE0003F01F0007E03F800FC03F801F +803F803F801F007F800E007F0000007F000000FF000000FF000000FF000000FF000000FF000000 +FF000000FF0000007F0000007F0000007F8000003F8001C01F8001C00FC0038007E0070003F01E +0000FFFC00001FE0001A1B7E9A1F>99 D<00003FF80000003FF80000003FF800000003F8000000 +03F800000003F800000003F800000003F800000003F800000003F800000003F800000003F80000 +0003F800000003F800000003F800001FE3F80000FFFBF80003F03FF80007E00FF8000FC007F800 +1F8003F8003F8003F8007F0003F8007F0003F8007F0003F800FF0003F800FF0003F800FF0003F8 +00FF0003F800FF0003F800FF0003F800FF0003F8007F0003F8007F0003F8007F0003F8003F8003 +F8001F8003F8000F8007F80007C00FF80003F03BFF8000FFF3FF80003FC3FF80212A7EA926>I< +003FE00001FFF80003F07E0007C01F000F801F801F800F803F800FC07F000FC07F0007C07F0007 +E0FF0007E0FF0007E0FFFFFFE0FFFFFFE0FF000000FF000000FF0000007F0000007F0000007F00 +00003F8000E01F8000E00FC001C007E0038003F81F0000FFFE00001FF0001B1B7E9A20>I<0007 +F0003FFC00FE3E01F87F03F87F03F07F07F07F07F03E07F00007F00007F00007F00007F00007F0 +0007F000FFFFC0FFFFC0FFFFC007F00007F00007F00007F00007F00007F00007F00007F00007F0 +0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0007FFF +807FFF807FFF80182A7EA915>I<00FF81F003FFE7F80FC1FE7C1F80FC7C1F007C383F007E107F +007F007F007F007F007F007F007F007F007F007F007F003F007E001F007C001F80FC000FC1F800 +1FFFE00018FF800038000000380000003C0000003E0000003FFFF8001FFFFF001FFFFF800FFFFF +C007FFFFE01FFFFFF03E0007F07C0001F8F80000F8F80000F8F80000F8F80000F87C0001F03C00 +01E01F0007C00FC01F8003FFFE00007FF0001E287E9A22>II<07000FC01FE03FE03FE03FE01FE00FC0070000000000000000000000000000 +00FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14>I107 DIII<003FE00001FFFC0003F07E000FC01F801F800FC03F800FE03F0007E07F0007F07F00 +07F07F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F87F +0007F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001FFFC00003FE0001D1B7E9A +22>II114 D<03FE300FFFF01E03F03800F0700070F000 +70F00070F80070FC0000FFE0007FFE007FFF803FFFE01FFFF007FFF800FFF80003FC0000FC6000 +7CE0003CF0003CF00038F80038FC0070FF01E0F7FFC0C1FF00161B7E9A1B>I<00700000700000 +700000700000F00000F00000F00001F00003F00003F00007F0001FFFF0FFFFF0FFFFF007F00007 +F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F03807 +F03807F03807F03807F03807F03803F03803F87001F86000FFC0001F8015267FA51B>IIIII E /Fj 54 123 df<003F000000E180000380C020070060400E0070401C007040 +3C0070803C003880780039007800390078003A00F0003A00F0003C00F0003800F0003800700038 +00700078003000B800380338401C1C188007E00F001B157E941F>11 D<00007C00000183000002 +018000040180000801C0001001C0002001C0002001C0004001C000400380008003800080030000 +80070001000E000107FC0001083800010FDC0002000E0002000E0002000F0002000F0004000F00 +04000F0004000F0004000F0008001E0008001E0008001C0008003C0014003800140070001400E0 +001201C00021838000207C00002000000020000000400000004000000040000000400000008000 +00008000000080000000800000001A2D7EA21C>I<01F00107F8010FFC021FFC02380E04600204 +4003088001088001080000900000900000A00000A00000A00000C00000C00000C0000080000080 +000080000180000180000180000300000300000300000300000600000600000600000400000400 +18207F9419>I<007FFF8001FFFF8003FFFF800783C0000E01C0001C00E0003800E0003800E000 +7000E0007000E0007000E000E001C000E001C000E001C000E0038000E003000060070000600E00 +00301800001870000007C0000019157E941C>27 D<000020000040000040000040000040000080 +000080000080000080000100000100000100000100000200001FC000F27001821807040C0E0406 +1C0406180407380807700807700807700807E0100EE0100EE0100C60101C6020387020303020E0 +1821C00E470003F800004000004000008000008000008000008000010000010000010000010000 +182D7DA21D>30 D<70F8F8F87005057C840E>58 D<70F8FCFC7404040404080810102040060F7C +840E>I<0000001800000078000001E00000078000001E00000078000003E000000F8000003C00 +0000F0000003C000000F0000003C000000F0000000F00000003C0000000F00000003C0000000F0 +0000003C0000000F80000003E0000000780000001E0000000780000001E000000078000000181D +1C7C9926>I<000080000180000180000300000300000300000600000600000600000C00000C00 +000C0000180000180000180000300000300000300000600000600000600000C00000C00000C000 +0180000180000180000180000300000300000300000600000600000600000C00000C00000C0000 +180000180000180000300000300000300000600000600000600000C00000C00000C0000011317D +A418>I<000FC000003030000040180000800C000100060001C0070003C0070003C00300018003 +8000000380000003800000038000000380001F87800070478001C0278003801780070017800E00 +1F001E001F001C001F003C001F0038001E0078001E0078001E0078003C00F0003C00F0003800F0 +007800F00070007000E0007000E0007001C00038038000180700000C1C000003F0000019257EA3 +1A>64 D<00000080000000018000000001C000000003C000000003C000000007C00000000BC000 +00000BC000000013C000000033C000000023C000000043C000000043E000000081E000000181E0 +00000101E000000201E000000201E000000401E000000C01E000000801E000001001E000001FFF +F000002000F000006000F000004000F000008000F000008000F000010000F000030000F0000200 +00F000040000F8000C0000F8001E0000F800FF800FFF8021237EA225>I<007FFFF8000007800F +00000780078000078003C0000F0001C0000F0001C0000F0001E0000F0001E0001E0001C0001E00 +03C0001E0003C0001E000780003C000F00003C001E00003C003C00003C01F000007FFFE0000078 +0078000078003C000078001E0000F0001E0000F0000E0000F0000F0000F0000F0001E0001E0001 +E0001E0001E0001E0001E0003C0003C0003C0003C000780003C000F00003C001C00007C00F8000 +FFFFFC000023227EA125>I<00007F00800003808100000E00630000380027000070001F0000E0 +000E0001C0000E000380000E000700000E000F000004000E000004001E000004003C000004003C +00000800780000000078000000007800000000F000000000F000000000F000000000F000000000 +F000000000E000000000E000002000E000002000E000004000E000004000F00000800070000080 +007000010000380002000018000400001C0008000006003000000381C0000000FE00000021247D +A223>I<007FFFF8000007801E0000078007000007800380000F0001C0000F0001C0000F0000E0 +000F0000E0001E0000E0001E0000F0001E0000F0001E0000F0003C0000F0003C0000F0003C0000 +F0003C0000F000780001E000780001E000780001E000780001E000F00003C000F00003C000F000 +038000F000078001E000070001E0000E0001E0001E0001E0001C0003C000380003C000700003C0 +00E00003C003800007C00E0000FFFFF8000024227EA128>I<007FFFFFC000078003C000078000 +C000078000C0000F0000C0000F0000C0000F000080000F000080001E000080001E000080001E00 +8080001E008000003C010000003C010000003C030000003C070000007FFE000000780600000078 +060000007806000000F004000000F004000000F004010000F000020001E000020001E000020001 +E000040001E0000C0003C000080003C000180003C000300003C000700007C003F000FFFFFFE000 +22227EA124>I<007FFFFFC000078003C000078000C000078000C0000F0000C0000F0000C0000F +000080000F000080001E000080001E000080001E008080001E008000003C010000003C01000000 +3C030000003C070000007FFE000000780600000078060000007806000000F004000000F0040000 +00F004000000F000000001E000000001E000000001E000000001E000000003C000000003C00000 +0003C000000003C000000007C0000000FFFE00000022227EA120>I<00007F00400003C0C08000 +0E002180001C0013800070000F8000E000070001C0000700038000070007000007000F00000200 +0E000002001E000002003C000002003C00000400780000000078000000007800000000F0000000 +00F000000000F000000000F000000000F0003FFF00E00000F000E00000F000E00000F000E00001 +E000F00001E000F00001E000700001E000700003C000380003C000180007C0000C0009C0000600 +1180000380E08000007F00000022247DA226>I<00FFFC0007C0000780000780000F00000F0000 +0F00000F00001E00001E00001E00001E00003C00003C00003C00003C0000780000780000780000 +780000F00000F00000F00000F00001E00001E00001E00001E00003C00003C00003C00003C00007 +C000FFFC0016227EA116>73 D<0007FFE000001E0000001E0000001E0000003C0000003C000000 +3C0000003C00000078000000780000007800000078000000F0000000F0000000F0000000F00000 +01E0000001E0000001E0000001E0000003C0000003C0000003C0000003C0000007800000078000 +3807800078078000F80F0000F80F0000F01E0000401C00004038000030E000000F8000001B237D +A11B>I<007FFC01FF0007800078000780006000078000C0000F000180000F000200000F000400 +000F000800001E001000001E004000001E008000001E010000003C020000003C040000003C1E00 +00003C3E000000785F000000788F0000007A0F0000007C07800000F807800000F007C00000F003 +C00000F003C00001E001E00001E001E00001E001E00001E000F00003C000F00003C000F80003C0 +00780003C000780007C000FC00FFFC07FF8028227EA129>I<007FFE000007C000000780000007 +8000000F0000000F0000000F0000000F0000001E0000001E0000001E0000001E0000003C000000 +3C0000003C0000003C00000078000000780000007800000078000000F0000000F0000000F00010 +00F0001001E0002001E0002001E0004001E0004003C000C003C0008003C0018003C0078007C01F +00FFFFFF001C227EA121>I<007FC00001FF0007C00003E00007C00005E00007C00005E00009E0 +000BC00009E0000BC00009E00013C00009E00023C00011E00027800011E00047800011E0004780 +0011E00087800021E0010F000020F0010F000020F0020F000020F0040F000040F0041E000040F0 +081E000040F0081E000040F0101E000080F0203C00008078203C00008078403C00008078803C00 +01007880780001007900780001007900780001007A00780002007C00F00002007C00F000020038 +00F00006003800F0000F003001F000FFE0203FFF0030227EA12F>I<007FC003FF0007C0007800 +07C000600005E000200009E000400009E000400008F000400008F000400010F800800010780080 +001078008000103C008000203C010000203E010000201E010000201E010000400F020000400F02 +0000400F020000400782000080078400008007C400008003C400008003C400010001E800010001 +E800010001F800010000F800020000F0000200007000020000700006000070000F00002000FFE0 +00200028227EA127>I<00007F00000381C0000E0060003800380070003800E0001C01C0001E03 +80000E0700000E0F00000F0E00000F1C00000F3C00000F3C00000F7800000F7800000F7800000F +F000001EF000001EF000001EF000003CF000003CF000003CE0000078E0000078E00000F0F00000 +E0F00001E0F00003C0700007807800070038000E001C0038000E0070000783C00000FE00002024 +7DA225>I<007FFFF0000007801C000007800F000007800700000F000380000F000380000F0003 +80000F000380001E000780001E000780001E000780001E000F00003C000F00003C001E00003C00 +3C00003C007000007801E000007FFF00000078000000007800000000F000000000F000000000F0 +00000000F000000001E000000001E000000001E000000001E000000003C000000003C000000003 +C000000003C000000007C0000000FFFC00000021227EA11F>I<00007F00000381C0000E006000 +3800380070003800E0001C01C0001E0380000E0700000E0F00000F0E00000F1E00000F3C00000F +3C00000F7800000F7800000F7800000FF000001EF000001EF000001EF000001CF000003CE00000 +3CE0000078E0000078E00000F0E00000E0F00001E0F01E03C0702103807840870038408E001C40 +B8000E40F00007C1C02000FE80200000802000018040000180C00001C0800001C3800001FF0000 +00FF000000FE0000007800202D7DA227>I<007FFFE0000007803C000007800E00000780070000 +0F000780000F000380000F0003C0000F0003C0001E000780001E000780001E000780001E000F00 +003C001E00003C003C00003C007000003C01C000007FFE00000078078000007801C000007801E0 +0000F000F00000F000F00000F000F00000F000F00001E001E00001E001E00001E001E00001E001 +E00003C003C00003C003C04003C003C04003C001C08007C001C080FFFC00E3000000003C002223 +7EA125>I<0003F010000E0C2000180260002001E0004000E000C000C0008000C0018000C00180 +00C00380008003800080038000000380000003C0000001F0000001FE000000FFE000007FF00000 +1FF8000001FC0000003C0000001C0000000E0000000E0000000E0020000C0020000C0020000C00 +2000080060001800600010007000200070004000C8008000C603000081FC00001C247DA21E>I< +1FFFFFFE1E01E00E1801E0063001E0062003C0062003C0064003C0044003C00440078004800780 +048007800400078000000F0000000F0000000F0000000F0000001E0000001E0000001E0000001E +0000003C0000003C0000003C0000003C00000078000000780000007800000078000000F0000000 +F0000000F0000000F0000001F00000FFFFC0001F227EA11D>I<3FFE01FF8003C0003C0003C000 +300003C000100007800020000780002000078000200007800020000F000040000F000040000F00 +0040000F000040001E000080001E000080001E000080001E000080003C000100003C000100003C +000100003C0001000078000200007800020000780002000078000200007000040000F000040000 +F000080000700008000070001000007000200000380040000038008000001C0100000006060000 +0001F800000021237DA121>I<007FFFFE007E001E0070003C00E0007800C000F0008001E00180 +03E0010003C00100078002000F0002001E0000003C0000007C00000078000000F0000001E00000 +03C00000078000000F8000000F0000001E0000003C00200078002000F0004001F0004001E00040 +03C00080078000800F0001801E0003001E0007003C000F0078007E00FFFFFE001F227DA121>90 +D<00786001C4E00302E00601C00E01C01C01C03C01C0380380780380780380780380F00700F007 +00F00700F00708F00E10700E10701E1030262018C6200F01C015157E941A>97 +D<03C0003F80000380000380000380000700000700000700000700000E00000E00000E00000E00 +001C00001C78001D8E001E07003C0700380380380380380780700780700780700780700780E00F +00E00F00E00F00E01E00E01C00601C0060380030700030C0000F000011237DA215>I<003F0000 +E0800380C00701C00E03C01C03C03C00003C0000780000780000780000F00000F00000F00000F0 +00007000407000403001803802001C1C0007E00012157E9415>I<00001E0001FC00001C00001C +00001C0000380000380000380000380000700000700000700000700000E00078E001C4E00302E0 +0601C00E01C01C01C03C01C0380380780380780380780380F00700F00700F00700F00708F00E10 +700E10701E1030262018C6200F01C017237EA219>I<007C000382000701000E01001C01003801 +00780200700400FFF800F00000F00000E00000E00000E00000E00000E00080E000807003003004 +001838000FC00011157D9417>I<00001E00000063800000C7800001C7800001C3000001800000 +0380000003800000038000000380000007000000070000000700000007000000FFF800000E0000 +000E0000000E0000000E0000000E0000000E0000001C0000001C0000001C0000001C0000001C00 +000038000000380000003800000038000000380000007000000070000000700000007000000060 +000000E0000000E0000000E0000000C0000070C00000F1800000F1000000620000003C00000019 +2D7EA218>I<000F0C00389C00605C00C03801C0380380380780380700700F00700F00700F0070 +1E00E01E00E01E00E01E00E01E01C00E01C00E03C00605C0031B8001E380000380000380000700 +000700000700700E00F00C00F018006070003FC000161F809417>I<00F0000FE00000E00000E0 +0000E00001C00001C00001C00001C000038000038000038000038000070000071F0007218007C0 +C00F00E00F00E00E00E00E00E01C01C01C01C01C01C01C01C03803803803803807003807047007 +08700E08700E08700610E006206003C016237DA21C>I<00E000E001E000C00000000000000000 +000000000000000000001E0023004380438083808380870007000E000E000E001C001C00380038 +20384070407040308031001E000B227EA111>I<0000E00001E00001E00000C000000000000000 +0000000000000000000000000000000000000000001E0000230000438000838001038001038001 +0380000700000700000700000700000E00000E00000E00000E00001C00001C00001C00001C0000 +380000380000380000380000700000700000700070E000F0C000F180006300003E0000132C81A1 +14>I<00F0000FE00000E00000E00000E00001C00001C00001C00001C000038000038000038000 +0380000700000700F00703080704380E08780E10780E20300E40001C80001F00001FC0001C7000 +383800383800381C00381C10703820703820703820701840E00C8060070015237DA219>I<3C07 +E01F00461830618047201880C087401D00E087801E00E087801C00E087001C00E00E003801C00E +003801C00E003801C00E003801C01C007003801C007003801C007007001C007007043800E00708 +3800E00E083800E00E083800E006107001C006203000C003C026157E942B>109 +D<3C07C04618604720308740388780388700388700380E00700E00700E00700E00701C00E01C00 +E01C01C01C01C13801C23803823803823801847001883000F018157E941D>I<03C0F004631C04 +740E08780E08700708700708700F00E00F00E00F00E00F00E00F01C01E01C01E01C01E01C03C03 +803803803803C07003C0E0072180071E000700000700000E00000E00000E00000E00001C00001C +00001C0000FFC000181F819418>112 D<3C0F004630C04741C08783C08783C08701808700000E +00000E00000E00000E00001C00001C00001C00001C000038000038000038000038000070000030 +000012157E9416>114 D<007E0000810003008002018006038006030006000007000007F80003 +FE0001FF00003F00000780000380700380F00300F00300E002004004003018000FE00011157E94 +17>I<006000E000E000E000E001C001C001C001C00380FFFC0380038007000700070007000E00 +0E000E000E001C001C001C001C08381038103820182018C007000E1F7F9E12>I<1E0018230038 +4380384380708380708380708700700700E00E00E00E00E00E00E01C01C01C01C01C01C01C01C2 +1C03841C03841C07840C09880E118803E07017157E941C>I<1E00C02301E04381F04380F08380 +708380308700300700200E00200E00200E00201C00401C00401C00801C00801C01001C01001C02 +000C040006080003F00014157E9418>I<1E0018182300383C4380383E4380701E8380700E8380 +7006870070060700E0040E00E0040E00E0040E00E0041C01C0081C01C0081C01C0081C01C0101C +01C0101C01C0201C03C0400C04C0C00708E10001F03E001F157E9423>I<01E0F006310C081A1C +101A3C201C3C201C18201C0000380000380000380000380000700000700000700000700860E010 +F0E010F0E020E170404230803C1F0016157E941C>I<1E00302300704380704380E08380E08380 +E08700E00701C00E01C00E01C00E01C01C03801C03801C03801C03801C07001C07001C07001C0F +000C3E0003CE00000E00000E00001C00601C00F03800F03000E0600080C0004180003E0000141F +7E9418>I<00E01003F02007F860060FC008008008010000020000040000080000100000200000 +C0000100000200000400400800801001803F830061FE0040FC0080780014157E9417>I +E /Fk 49 122 df45 +D<000000380000007C0000007C000000FC000000F8000000F8000001F8000001F0000001F00000 +03F0000003E0000007E0000007C0000007C000000FC000000F8000000F8000001F8000001F0000 +003F0000003E0000003E0000007E0000007C0000007C000000FC000000F8000001F8000001F000 +0001F0000003F0000003E0000003E0000007E0000007C000000FC000000F8000000F8000001F80 +00001F0000001F0000003F0000003E0000003E0000007E0000007C000000FC000000F8000000F8 +000001F8000001F0000001F0000003F0000003E0000007E0000007C0000007C000000FC000000F +8000000F8000001F8000001F0000003F0000003E0000003E0000007E0000007C0000007C000000 +FC000000F8000000F8000000700000001E487BB529>47 D<000FFC0000007FFF800001FFFFE000 +03FC0FF00007F003F8000FE001FC000FE001FC001FC000FE003FC000FF003FC000FF003F80007F +007F80007F807F80007F807F80007F807F80007F80FF80007FC0FF80007FC0FF80007FC0FF8000 +7FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80 +007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC07F80007F807F80007F807F80007F807F +80007F803F80007F003FC000FF003FC000FF001FC000FE001FE001FE000FE001FC0007F807F800 +03FC0FF00001FFFFE000007FFF8000000FFC0000222E7DAD29>I<0001E0000003E000000FE000 +007FE0001FFFE000FFFFE000FFBFE000E03FE000003FE000003FE000003FE000003FE000003FE0 +00003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003F +E000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE00000 +3FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000 +003FE0007FFFFFF07FFFFFF07FFFFFF01C2E7AAD29>I<003FF00001FFFE0007FFFF800FC07FE0 +1E001FF03C000FF87F0007FC7F8007FEFFC007FEFFC003FEFFC003FFFFC003FF7F8003FF7F8003 +FF3F0003FF000003FF000003FE000003FE000007FC000007FC00000FF800000FF000001FE00000 +1FC000003F8000007F000000FE000001F8000001F0000003E00000078007000F0007001E000700 +3C000F0078000E00F0000E01C0001E03FFFFFE07FFFFFE0FFFFFFE1FFFFFFE3FFFFFFE7FFFFFFC +FFFFFFFCFFFFFFFCFFFFFFFC202E7CAD29>I<000FFC0000007FFF800001F01FE00003C00FF000 +070007F8000FE007FC000FF007FC001FF007FE001FF807FE001FF807FE001FF807FE001FF807FE +000FF007FC0007E007FC00018007FC0000000FF80000000FF00000001FE00000001FC00000007F +8000001FFE0000001FFC0000001FFF800000001FF000000007F800000003FC00000003FE000000 +03FF00000001FF80000001FF800E0001FFC03F8001FFC07FC001FFC07FC001FFC0FFE001FFC0FF +E001FFC0FFE001FF80FFE001FF80FFC003FF007F8003FF003F0003FE001F0007FC000FE01FF800 +07FFFFE00001FFFF8000001FFC0000222E7DAD29>I<0000007800000000F800000001F8000000 +03F800000007F800000007F80000000FF80000001FF80000003FF80000007FF800000077F80000 +00F7F8000001E7F8000003C7F800000787F800000707F800000F07F800001E07F800003C07F800 +007807F800007007F80000F007F80001E007F80003C007F800078007F8000F0007F8000F0007F8 +001E0007F8003C0007F800780007F800F00007F800FFFFFFFFF0FFFFFFFFF0FFFFFFFFF000000F +F80000000FF80000000FF80000000FF80000000FF80000000FF80000000FF80000000FF8000000 +0FF800000FFFFFF0000FFFFFF0000FFFFFF0242E7EAD29>I<0C0000380FC003F80FFFFFF80FFF +FFF00FFFFFE00FFFFFC00FFFFF800FFFFE000FFFFC000FFFF0000FFF00000F0000000F0000000F +0000000F0000000F0000000F0000000F0000000F0FF8000F7FFF000FFFFFC00FF01FE00F800FF0 +0F0007F80E0007FC000003FC000003FE000003FE000003FF000003FF1E0003FF3F0003FF7F8003 +FFFF8003FFFFC003FFFFC003FEFF8003FEFF8003FE7F0007FC7C0007F83C000FF01E001FE00FC0 +7FC007FFFF8001FFFE00003FE000202E7CAD29>I<00007F80000007FFF000001FC07800007F00 +1C0000FC001E0001F8007E0003F800FF0007F001FF000FF001FF000FE001FF001FE001FF003FE0 +00FE003FE0007C003FC00000007FC00000007FC00000007FC0000000FFC3FF8000FFC7FFE000FF +CFBFF000FFDC03F800FFF801FC00FFF001FE00FFF000FF00FFE000FF80FFE000FF80FFE000FF80 +FFC000FFC0FFC000FFC0FFC000FFC07FC000FFC07FC000FFC07FC000FFC07FC000FFC03FC000FF +C03FC000FF803FC000FF801FE000FF801FE000FF000FE001FE0007F001FC0003F803F80001FC0F +F00000FFFFE000003FFF80000007FC0000222E7DAD29>I<38000000003E000000003FFFFFFFC0 +3FFFFFFFC03FFFFFFFC03FFFFFFF807FFFFFFF007FFFFFFE007FFFFFFC007FFFFFF8007FFFFFF0 +00780001F000700003E000700007C000F0000F8000E0000F0000E0001E0000E0003E000000007C +00000000F800000000F800000001F000000001F000000003F000000003E000000007E000000007 +E00000000FE00000000FE00000001FC00000001FC00000001FC00000003FC00000003FC0000000 +3FC00000003FC00000003FC00000007FC00000007FC00000007FC00000007FC00000007FC00000 +007FC00000007FC00000007FC00000003F800000003F800000000E00000022307BAF29>I<0007 +FC0000003FFF800000F80FE00001E003F00003C001F800078000FC000F8000FC000F80007E000F +80007E001F80007E001FC0007E001FC0007E001FE0007E001FF800FC001FFE00FC000FFF81F800 +0FFFE1F0000FFFF7E00007FFFFC00003FFFF800001FFFFC00000FFFFE000007FFFF80001FFFFFC +0003F7FFFE000FE1FFFF001F807FFF003F003FFF803F000FFF807E0003FFC07E0000FFC0FC0000 +7FC0FC00001FC0FC00001FC0FC00000FC0FC00000FC0FC00000F807E00000F807E00000F007F00 +001F003F00001E001FC0007C000FF803F80003FFFFE00000FFFF8000001FFC0000222E7DAD29> +I<000FFC0000007FFF000001FC0FC00003F003E00007E003F0000FE001F8001FE001FC003FC001 +FE007FC000FE007FC000FF00FFC000FF00FFC000FF80FFC000FF80FFC000FF80FFC000FF80FFC0 +00FFC0FFC000FFC0FFC000FFC0FFC000FFC07FC001FFC07FC001FFC03FC001FFC03FC003FFC01F +E003FFC00FE007FFC007F00EFFC003FF7CFFC001FFF8FFC0007FF0FF80000000FF80000000FF80 +000000FF80000000FF000F8001FF001FC001FF003FE001FE003FE001FC003FE003FC003FE003F8 +003FC007F0001F800FE0001E001FC0000F807F800007FFFE000001FFF80000007FC00000222E7D +AD29>I66 D<000003FF80018000003FFFF003800001FFFFFC0F800007FF007F1F80001FF8000FBF80 +003FE00003FF8000FF800000FF8001FF0000007F8003FE0000003F8007FC0000003F8007FC0000 +001F800FF80000001F801FF80000000F801FF00000000F803FF000000007803FF000000007807F +F000000007807FE000000007807FE000000000007FE00000000000FFE00000000000FFE0000000 +0000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE0 +0000000000FFE000000000007FE000000000007FE000000000007FE000000000007FF000000003 +803FF000000003803FF000000003801FF000000003801FF800000007800FF8000000070007FC00 +0000070007FC0000000E0003FE0000001E0001FF0000003C0000FF8000007800003FE00000F000 +001FF80003E0000007FF003F80000001FFFFFE000000003FFFF80000000003FF80000031317BB0 +3C>II +II<000003FF80018000003F +FFF003800001FFFFFC0F800007FF007F1F80001FF8000FBF80003FE00003FF8000FF800000FF80 +01FF0000007F8003FE0000003F8007FC0000003F8007FC0000001F800FF80000001F801FF80000 +000F801FF00000000F803FF000000007803FF000000007807FF000000007807FE000000007807F +E000000000007FE00000000000FFE00000000000FFE00000000000FFE00000000000FFE0000000 +0000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00007FFFFFE7FE0 +0007FFFFFE7FE00007FFFFFE7FE0000001FF807FF0000001FF803FF0000001FF803FF0000001FF +801FF0000001FF801FF8000001FF800FF8000001FF8007FC000001FF8007FC000001FF8003FE00 +0001FF8001FF000001FF8000FF800001FF80003FE00003FF80001FF80007FF800007FF803F3F80 +0001FFFFFE1F8000003FFFF80780000003FFC0018037317BB041>I73 +D76 DII<00000FFE0000000000FF +FFE000000007FFFFFC0000001FFC07FF0000003FE000FF800000FF80003FE00001FF00001FF000 +03FE00000FF80007FC000007FC0007FC000007FC000FF8000003FE001FF8000003FF001FF00000 +01FF003FF0000001FF803FF0000001FF803FF0000001FF807FE0000000FFC07FE0000000FFC07F +E0000000FFC0FFE0000000FFE0FFE0000000FFE0FFE0000000FFE0FFE0000000FFE0FFE0000000 +FFE0FFE0000000FFE0FFE0000000FFE0FFE0000000FFE0FFE0000000FFE0FFE0000000FFE0FFE0 +000000FFE07FE0000000FFC07FE0000000FFC07FF0000001FFC07FF0000001FFC03FF0000001FF +803FF0000001FF801FF8000003FF001FF8000003FF000FFC000007FE000FFC000007FE0007FE00 +000FFC0003FF00001FF80001FF80003FF00000FFC0007FE000003FE000FF8000001FFC07FF0000 +0007FFFFFC00000000FFFFE0000000000FFE00000033317BB03E>II82 D<001FF0018000FFFF038003FF +FFC78007F00FFF800F8001FF801F00007F803F00001F803E00000F807E00000F807E00000780FE +00000780FE00000780FE00000380FF00000380FF00000380FF80000000FFE00000007FFC000000 +7FFFE000007FFFFE00003FFFFFC0001FFFFFF0001FFFFFF8000FFFFFFC0003FFFFFE0001FFFFFF +00007FFFFF80001FFFFF800000FFFFC0000007FFC0000000FFE00000003FE00000003FE0000000 +1FE06000001FE0E000000FE0E000000FE0E000000FE0E000000FC0F000000FC0F000000FC0F800 +001F80FC00001F80FF00003F00FFC0007E00FFFC01FC00F1FFFFF800E03FFFE000C007FF000023 +317BB02E>I<3FFFFFFFFFFF003FFFFFFFFFFF003FFFFFFFFFFF003FE00FFC01FF007F000FFC00 +3F807E000FFC001F807C000FFC000F8078000FFC00078078000FFC00078070000FFC0003807000 +0FFC00038070000FFC00038070000FFC000380E0000FFC0001C0E0000FFC0001C0E0000FFC0001 +C0E0000FFC0001C000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000F +FC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC000000 +00000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC +00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000 +000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00 +000000000FFC000000007FFFFFFF8000007FFFFFFF8000007FFFFFFF800032307DAF39>II<007FF8000003FFFF000007FFFFC0000FE01FE0001FF007F0001FF003F8001FF0 +03FC001FF001FE000FE001FE0007C001FE00010001FE00000001FE00000001FE000001FFFE0000 +3FFFFE0001FFF1FE0007FE01FE000FF001FE001FC001FE003F8001FE007F8001FE00FF0001FE00 +FF0001FE00FF0001FE00FF0001FE00FF0003FE007F8003FE007FC00EFE003FF03CFF000FFFF87F +F807FFF03FF800FF800FF825207E9F28>97 D<01F8000000FFF8000000FFF8000000FFF8000000 +0FF800000007F800000007F800000007F800000007F800000007F800000007F800000007F80000 +0007F800000007F800000007F800000007F800000007F800000007F800000007F80FF00007F87F +FE0007F9FFFF8007FFE03FC007FF000FE007FE0007F007F80003F807F80003FC07F80003FC07F8 +0001FE07F80001FE07F80001FE07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07 +F80001FF07F80001FF07F80001FF07F80001FE07F80001FE07F80001FE07F80003FC07F80003FC +07FC0007F807FE0007F007F7001FE007E3E07FC007C1FFFF0007807FFE0007001FE00028327EB1 +2E>I<0007FF00007FFFE000FFFFF003FC03F807F007FC0FE007FC1FE007FC3FC007FC3FC003F8 +7FC001F07F8000407F800000FF800000FF800000FF800000FF800000FF800000FF800000FF8000 +00FF8000007F8000007FC000007FC000003FC0000E3FE0000E1FE0001C0FF0001C07F8007803FF +01F000FFFFE0007FFF800007FC001F207D9F25>I<00000007E0000003FFE0000003FFE0000003 +FFE00000003FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000 +001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE0000FF81FE000 +7FFF1FE001FFFFDFE003FE03FFE007F800FFE00FE0003FE01FE0001FE03FC0001FE03FC0001FE0 +7F80001FE07F80001FE07F80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001F +E0FF80001FE0FF80001FE0FF80001FE07F80001FE07F80001FE07F80001FE03FC0001FE03FC000 +1FE01FC0003FE00FE0007FE007F001FFE003FC07DFF001FFFF9FFF007FFE1FFF000FF01FFF2832 +7DB12E>I<0007FC0000003FFF800000FFFFE00003FC07F00007F801F8000FE000FC001FE0007E +003FC0007E003FC0003F007FC0003F007F80003F007F80003F80FF80003F80FF80003F80FFFFFF +FF80FFFFFFFF80FFFFFFFF80FF80000000FF80000000FF800000007F800000007F800000003FC0 +0000003FC00003801FC00003801FE00007800FF0000F0007F8001E0003FE00FC0000FFFFF80000 +3FFFE0000003FF000021207E9F26>I<0000FF000007FFC0001FFFE0003FC7F0007F0FF800FE0F +F801FE0FF801FC0FF803FC07F003FC03E003FC01C003FC000003FC000003FC000003FC000003FC +000003FC000003FC0000FFFFF800FFFFF800FFFFF80003FC000003FC000003FC000003FC000003 +FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0000 +03FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00 +0003FC000003FC00007FFFF0007FFFF0007FFFF0001D327EB119>I<001FF007E000FFFE3FF001 +FFFF7FF807F83FF1F80FE00FE1F80FE00FE0F01FC007F0601FC007F0003FC007F8003FC007F800 +3FC007F8003FC007F8003FC007F8001FC007F0001FC007F0000FE00FE0000FE00FE00007F83FC0 +0007FFFF000006FFFE00000E1FF000000E000000001E000000001E000000001F000000001F8000 +00001FFFFFC0000FFFFFF8000FFFFFFE0007FFFFFF0003FFFFFF8007FFFFFFC01FFFFFFFE03F00 +007FE07E00000FF0FC000007F0FC000003F0FC000003F0FC000003F0FC000003F07E000007E03F +00000FC01FC0003F800FF801FF0007FFFFFE0000FFFFF000001FFF8000252F7E9F29>I<01F800 +000000FFF800000000FFF800000000FFF8000000000FF80000000007F80000000007F800000000 +07F80000000007F80000000007F80000000007F80000000007F80000000007F80000000007F800 +00000007F80000000007F80000000007F80000000007F80000000007F807F8000007F83FFF0000 +07F87FFF800007F8F03FC00007F9C01FE00007FB000FE00007FE000FF00007FE000FF00007FC00 +0FF00007FC000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF000 +07F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F800 +0FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF000 +07F8000FF000FFFFC1FFFF80FFFFC1FFFF80FFFFC1FFFF8029327DB12E>I<03C0000FF0000FF0 +001FF8001FF8001FFC001FF8001FF8000FF0000FF00003C0000000000000000000000000000000 +0000000000000000000001F800FFF800FFF800FFF8000FF80007F80007F80007F80007F80007F8 +0007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F8 +0007F80007F80007F80007F80007F80007F800FFFF80FFFF80FFFF8011337DB217>I<01F800FF +F800FFF800FFF8000FF80007F80007F80007F80007F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F80007F800FFFFC0FFFFC0FFFFC012327DB117>108 +D<03F007F8000FF000FFF03FFF007FFE00FFF07FFF80FFFF00FFF0F03FC1E07F800FF1C01FE380 +3FC007F3000FE6001FC007F6000FFC001FE007FE000FFC001FE007FC000FF8001FE007FC000FF8 +001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000F +F0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F800 +0FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8 +000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE0FF +FFC1FFFF83FFFFFFFFC1FFFF83FFFFFFFFC1FFFF83FFFF40207D9F45>I<03F007F80000FFF03F +FF0000FFF07FFF8000FFF0F03FC0000FF1C01FE00007F3000FE00007F6000FF00007FE000FF000 +07FC000FF00007FC000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F800 +0FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF000 +07F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F800 +0FF00007F8000FF000FFFFC1FFFF80FFFFC1FFFF80FFFFC1FFFF8029207D9F2E>I<0007FE0000 +003FFFC00000FFFFF00003FC03FC0007F000FE000FE0007F001FC0003F803FC0003FC03FC0003F +C07F80001FE07F80001FE07F80001FE0FF80001FF0FF80001FF0FF80001FF0FF80001FF0FF8000 +1FF0FF80001FF0FF80001FF0FF80001FF07F80001FE07F80001FE07F80001FE03FC0003FC03FC0 +003FC01FE0007F800FE0007F0007F801FE0003FE07FC0001FFFFF800003FFFC0000007FE000024 +207E9F29>I<01F80FF000FFF87FFE00FFF9FFFF80FFFFE07FC00FFF001FE007FE000FF007F800 +07F807F80007FC07F80003FC07F80003FE07F80003FE07F80001FE07F80001FF07F80001FF07F8 +0001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FE07F80003FE07 +F80003FE07F80003FC07F80007FC07FC0007F807FE000FF007FF001FE007FBE07FC007F9FFFF00 +07F87FFE0007F81FE00007F800000007F800000007F800000007F800000007F800000007F80000 +0007F800000007F800000007F800000007F800000007F8000000FFFFC00000FFFFC00000FFFFC0 +0000282E7E9F2E>I<03F03F00FFF07FC0FFF1FFE0FFF3C7F00FF38FF807F70FF807F60FF807FE +0FF807FC07F007FC03E007FC008007F8000007F8000007F8000007F8000007F8000007F8000007 +F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F80000 +07F8000007F80000FFFFE000FFFFE000FFFFE0001D207E9F22>114 D<00FF870007FFEF001FFF +FF003F007F003C001F0078000F00F8000700F8000700F8000700FC000700FF000000FFF800007F +FFC0003FFFF0003FFFFC000FFFFE0007FFFF0001FFFF80001FFF800000FFC000001FC060000FC0 +E00007C0E00007C0F00007C0F8000780F8000F80FE000F00FF803E00FFFFFC00F3FFF800C07FC0 +001A207D9F21>I<00380000380000380000380000380000780000780000780000F80000F80001 +F80003F80007F8001FF800FFFFFEFFFFFEFFFFFE07F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80707F80707F80707 +F80707F80707F80707F80703F80E03FC0E01FE1C00FFF8007FF0000FE0182E7EAD20>I<01F800 +03F000FFF801FFF000FFF801FFF000FFF801FFF0000FF8001FF00007F8000FF00007F8000FF000 +07F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F800 +0FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF000 +07F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8001FF00007F8001FF00003F800 +3FF00003F8006FF00001FE03CFF80000FFFF8FFF80007FFF0FFF80000FFC0FFF8029207D9F2E> +II120 DI E /Fl +85 124 df<001F83E000706E3000C07C780180F8780380F0780700700007007000070070000700 +70000700700007007000070070000700700007007000FFFFFFC007007000070070000700700007 +007000070070000700700007007000070070000700700007007000070070000700700007007000 +0700700007007000070070000700700007007000070078007FE3FF801D2380A21C>11 +D<001FC0000070200000C010000180380003807800070078000700300007000000070000000700 +000007000000070000000700000007000000FFFFF8000700780007003800070038000700380007 +003800070038000700380007003800070038000700380007003800070038000700380007003800 +07003800070038000700380007003800070038007FE1FF80192380A21B>I<001FD80000703800 +00C078000180780003807800070038000700380007003800070038000700380007003800070038 +000700380007003800FFFFF8000700380007003800070038000700380007003800070038000700 +380007003800070038000700380007003800070038000700380007003800070038000700380007 +00380007003800070038007FF3FF80192380A21B>I<000FC07F00007031C08000E00B00400180 +1E00E003803E01E007003C01E007001C00C007001C000007001C000007001C000007001C000007 +001C000007001C000007001C0000FFFFFFFFE007001C01E007001C00E007001C00E007001C00E0 +07001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00 +E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E07FF1FF +CFFE272380A229>I<7038F87CFC7EFC7E743A0402040204020402080408041008100820104020 +0F0F7EA218>34 D<70F8FCFC7404040404080810102040060F7CA20E>39 +D<00200040008001000300060004000C000C00180018003000300030007000600060006000E000 +E000E000E000E000E000E000E000E000E000E000E000E000E00060006000600070003000300030 +00180018000C000C0004000600030001000080004000200B327CA413>I<800040002000100018 +000C000400060006000300030001800180018001C000C000C000C000E000E000E000E000E000E0 +00E000E000E000E000E000E000E000E000C000C000C001C0018001800180030003000600060004 +000C00180010002000400080000B327DA413>I<00018000000180000001800000018000000180 +000001800000018000000180000001800000018000000180000001800000018000000180000001 +800000018000FFFFFFFEFFFFFFFE00018000000180000001800000018000000180000001800000 +018000000180000001800000018000000180000001800000018000000180000001800000018000 +1F227D9C26>43 D<70F8FCFC7404040404080810102040060F7C840E>I +I<70F8F8F87005057C840E>I<0000800001800001800003000003000003000006000006000006 +00000C00000C00000C0000180000180000180000300000300000300000600000600000600000C0 +0000C00000C0000180000180000180000180000300000300000300000600000600000600000C00 +000C00000C0000180000180000180000300000300000300000600000600000600000C00000C000 +00C0000011317DA418>I<01F000071C000C06001803003803803803807001C07001C07001C070 +01C0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F0 +01E0F001E07001C07001C07001C07803C03803803803801C07000C0600071C0001F00013227EA0 +18>I<008003800F80F38003800380038003800380038003800380038003800380038003800380 +038003800380038003800380038003800380038003800380038007C0FFFE0F217CA018>I<03F0 +000C1C001007002007804003C04003C08003E0F003E0F801E0F801E0F801E02003E00003E00003 +C00003C0000780000700000E00001C0000180000300000600000C0000180000100000200200400 +200800201800603000403FFFC07FFFC0FFFFC013217EA018>I<03F8000C1E0010070020078040 +07C07807C07803C07807C03807C0000780000780000700000F00000E0000380003F000001C0000 +0F000007800007800003C00003C00003E02003E07003E0F803E0F803E0F003C04003C040078020 +0780100F000C1C0003F00013227EA018>I<000200000600000E00000E00001E00001E00002E00 +004E00004E00008E00008E00010E00020E00020E00040E00040E00080E00100E00100E00200E00 +200E00400E00800E00FFFFF8000E00000E00000E00000E00000E00000E00000E00001F0001FFF0 +15217FA018>I<1000801E07001FFF001FFE001FF80013E0001000001000001000001000001000 +0010000010F800130E001407001803801003800001C00001C00001E00001E00001E00001E07001 +E0F001E0F001E0E001C08001C04003C04003802007001006000C1C0003F00013227EA018>I<00 +7E0001C1000300800601C00E03C01C03C0180180380000380000780000700000700000F0F800F3 +0C00F40600F40300F80380F801C0F001C0F001E0F001E0F001E0F001E0F001E07001E07001E070 +01E03801C03801C01803801C03000C0600070C0001F00013227EA018>I<4000006000007FFFE0 +7FFFC07FFFC0400080C00100800100800200800200000400000800000800001000003000002000 +00600000600000600000E00000C00000C00001C00001C00001C00001C00003C00003C00003C000 +03C00003C00003C00003C00003C00001800013237DA118>I<01F800060E000803001001802001 +802000C06000C06000C06000C07000C07801803E01003F02001FC4000FF80003F80003FC00067F +00083F80100F803007C06001C06000E0C000E0C00060C00060C00060C000606000406000C03000 +801803000E0E0003F00013227EA018>I<01F000060C000C0600180700380380700380700380F0 +01C0F001C0F001C0F001E0F001E0F001E0F001E0F001E07001E07003E03803E01805E00C05E006 +19E003E1E00001C00001C00001C0000380000380300300780700780600700C002018001030000F +C00013227EA018>I<70F8F8F870000000000000000000000070F8F8F87005157C940E>I<70F8F8 +F870000000000000000000000070F8F8F87808080808101010204040051F7C940E>I61 D<07E01838201C400E800FF00FF00FF00F000F000E001C00380030 +006000C000C000800080018001000100010001000100010000000000000000000000038007C007 +C007C0038010237DA217>63 D<000FE00000701C00008002000300018004000040080000200800 +00201007C01020183008203008084060040440C0078441C0038481C00382838003828380038283 +8003828380038283800382838003828380038281C0038241C0038240C007824060078420300B84 +201831881007C0F00800000008000000040000000300000E00800078007007C0000FFC001F237D +A226>I<0001800000018000000180000003C0000003C0000003C0000005E0000005E000000DF0 +000008F0000008F0000010F800001078000010780000203C0000203C0000203C0000401E000040 +1E0000401E0000800F0000800F0000FFFF000100078001000780030007C0020003C0020003C004 +0003E0040001E0040001E00C0000F00C0000F03E0001F8FF800FFF20237EA225>II<0007E0100038183000E0063001C001700380 +00F0070000F00E0000701E0000701C0000303C0000303C0000307C0000107800001078000010F8 +000000F8000000F8000000F8000000F8000000F8000000F8000000F80000007800000078000010 +7C0000103C0000103C0000101C0000201E0000200E000040070000400380008001C0010000E002 +0000381C000007E0001C247DA223>IIII<0007F008003C0C1800E0021801C001B8038000F8070000 +780F0000381E0000381E0000183C0000183C0000187C0000087800000878000008F8000000F800 +0000F8000000F8000000F8000000F8000000F8000000F8001FFF780000F8780000787C0000783C +0000783C0000781E0000781E0000780F00007807000078038000B801C000B800E00318003C0C08 +0007F00020247DA226>III<03FFF0001F +00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F +00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00700F00F80F +00F80F00F80E00F01E00401C0020380018700007C00014237EA119>IIIII<000FE00000783C0000E00E0003C00780078003C00F0001E00E0000E01E0000F03C +0000783C0000787C00007C7C00007C7800003C7800003CF800003EF800003EF800003EF800003E +F800003EF800003EF800003EF800003EF800003E7800003C7C00007C7C00007C3C0000783E0000 +F81E0000F00F0001E00F0001E0078003C003C0078000E00E0000783C00000FE0001F247DA226> +II<000FE00000783C0000E00E00 +03C00780078003C00F0001E00E0000E01E0000F03E0000F83C0000787C00007C7C00007C780000 +3C7800003CF800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003EF800 +003E7800003C7C00007C7C00007C3C0000783C0000781E0380F00E0420E00F0801E0078813C003 +C8178000E80E00007C3C02000FEC0200000C0200000C0200000E0600000F0E000007FC000007FC +000007F8000003F8000001E01F2D7DA226>II<03F0200C0C601802603001E07000E0600060E00060E00060E00020E00020E00020 +F00000F000007800007F00003FF0001FFE000FFF0003FF80003FC00007E00001E00000F00000F0 +000070800070800070800070800070C00060C00060E000C0F000C0C80180C6070081FC0014247D +A21B>I<7FFFFFF87807807860078018400780084007800840078008C007800C80078004800780 +048007800480078004000780000007800000078000000780000007800000078000000780000007 +800000078000000780000007800000078000000780000007800000078000000780000007800000 +078000000780000007800000078000000FC00003FFFF001E227EA123>IIII<7FF807FF0007E001F8 +0003C000E00003E000C00001E000800000F001000000F80300000078020000007C040000003E0C +0000001E080000001F100000000FB000000007A000000007C000000003E000000001E000000001 +F000000003F80000000278000000047C0000000C3E000000081E000000101F000000300F800000 +20078000004007C00000C003E000008001E000010001F000030000F000070000F8001F8001FC00 +FFE007FFC022227FA125>II<7FFFFE7E003E +78003C7000786000784000F0C000F0C001E08003C08003C0800780000780000F00001F00001E00 +003C00003C0000780000780000F00001F00001E00103C00103C0010780010780030F00031E0002 +1E00023C00063C000E78001EF8007EFFFFFE18227DA11E>II<0804100820102010402040208040804080408040B85CFC7EFC7E7C3E381C0F0F7AA218>I< +FEFE06060606060606060606060606060606060606060606060606060606060606060606060606 +0606060606060606FEFE07317FA40E>I<08102020404080808080B8FCFC7C38060F7DA20E>96 +D<0FE0001838003C0C003C0E0018070000070000070000070000FF0007C7001E07003C07007807 +00700700F00708F00708F00708F00F087817083C23900FC1E015157E9418>I<0E0000FE00001E +00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E1F000E +61C00E80600F00300E00380E003C0E001C0E001E0E001E0E001E0E001E0E001E0E001E0E001E0E +001C0E003C0E00380F00700C80600C41C0083F0017237FA21B>I<01FE000703000C07801C0780 +380300780000700000F00000F00000F00000F00000F00000F00000F00000700000780040380040 +1C00800C010007060001F80012157E9416>I<0000E0000FE00001E00000E00000E00000E00000 +E00000E00000E00000E00000E00000E00000E00000E001F8E00704E00C02E01C01E03800E07800 +E07000E0F000E0F000E0F000E0F000E0F000E0F000E0F000E07000E07800E03800E01801E00C02 +E0070CF001F0FE17237EA21B>I<01FC000707000C03801C01C03801C07801E07000E0F000E0FF +FFE0F00000F00000F00000F00000F000007000007800203800201C00400E008007030000FC0013 +157F9416>I<003C00C6018F038F030F070007000700070007000700070007000700FFF8070007 +00070007000700070007000700070007000700070007000700070007000700070007807FF81023 +80A20F>I<00007001F198071E180E0E181C07001C07003C07803C07803C07803C07801C07001C +07000E0E000F1C0019F0001000001000001800001800001FFE000FFFC00FFFE03800F060003040 +0018C00018C00018C000186000306000303800E00E038003FE0015217F9518>I<0E0000FE0000 +1E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E1F80 +0E60C00E80E00F00700F00700E00700E00700E00700E00700E00700E00700E00700E00700E0070 +0E00700E00700E00700E00700E00700E0070FFE7FF18237FA21B>I<1C001E003E001E001C0000 +0000000000000000000000000000000E00FE001E000E000E000E000E000E000E000E000E000E00 +0E000E000E000E000E000E000E000E00FFC00A227FA10E>I<01C003E003E003E001C000000000 +00000000000000000000000001E00FE001E000E000E000E000E000E000E000E000E000E000E000 +E000E000E000E000E000E000E000E000E000E000E000E000E060E0F0C0F18061803E000B2C82A1 +0F>I<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000 +0E00000E00000E03FC0E01F00E01C00E01800E02000E04000E08000E10000E38000EF8000F1C00 +0E1E000E0E000E07000E07800E03C00E01C00E01E00E00F00E00F8FFE3FE17237FA21A>I<0E00 +FE001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E +000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00B237FA20E>I<0E1FC0 +7F00FE60E183801E807201C00F003C00E00F003C00E00E003800E00E003800E00E003800E00E00 +3800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E +003800E00E003800E00E003800E00E003800E0FFE3FF8FFE27157F942A>I<0E1F80FE60C01E80 +E00F00700F00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00 +700E00700E00700E00700E0070FFE7FF18157F941B>I<01FC000707000C01801800C03800E070 +0070700070F00078F00078F00078F00078F00078F00078F000787000707800F03800E01C01C00E +038007070001FC0015157F9418>I<0E1F00FE61C00E80600F00700E00380E003C0E001C0E001E +0E001E0E001E0E001E0E001E0E001E0E001E0E003C0E003C0E00380F00700E80E00E41C00E3F00 +0E00000E00000E00000E00000E00000E00000E00000E00000E0000FFE000171F7F941B>I<01F8 +200704600E02601C01603801E07800E07800E0F000E0F000E0F000E0F000E0F000E0F000E0F000 +E07000E07800E03801E01C01E00C02E0070CE001F0E00000E00000E00000E00000E00000E00000 +E00000E00000E00000E0000FFE171F7E941A>I<0E3CFE461E8F0F0F0F060F000E000E000E000E +000E000E000E000E000E000E000E000E000E000F00FFF010157F9413>I<0F8830786018C018C0 +08C008E008F0007F803FE00FF001F8003C801C800C800CC00CC008E018D0308FC00E157E9413> +I<02000200020002000600060006000E001E003E00FFF80E000E000E000E000E000E000E000E00 +0E000E000E000E040E040E040E040E040E040708030801F00E1F7F9E13>I<0E0070FE07F01E00 +F00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00 +700E00F00E00F006017003827800FC7F18157F941B>IIIII<3FFFC0380380300780200700600E00401C00403C0040380000700000E00001E00001C000 +0380400700400F00400E00C01C0080380080780180700780FFFF8012157F9416>II E /Fm 7 85 df<0000040000000006000000000E000000001E000000001E00000000 +3E000000003F000000004F000000004F000000008F000000008F000000010F0000000107800000 +02078000000207800000040780000004078000000807C000000803C000001003C000001003C000 +002003C000003FFFE000004001E000004001E000008001E000008001E000010001E000010000F0 +00020000F000060000F000040000F0000C0000F0003E0001F800FF800FFF8021237EA225>65 +D<03FFF0003E00003C00003C00003C00003C00003C000078000078000078000078000078000078 +0000F00000F00000F00000F00000F00000F00001E00001E00001E00001E00001E00001E00003C0 +0003C00003C00003C00003C00003C00007800007C000FFFC0014227EA112>73 +D<03FFE00FF8003E0007E0003C000380003C000200003C000400003C000800003C001000007800 +20000078008000007801000000780200000078040000007808000000F018000000F038000000F0 +7C000000F13C000000F23E000000F41E000001E81F000001F00F000001E00F000001E007800001 +E007800001E003C00003C003C00003C001E00003C001E00003C000F00003C000F00003C000F800 +078000F80007C000FC00FFFC07FF8025227EA126>75 D<03FFFFC0003E00F0003C0078003C003C +003C003E003C001E003C003E0078003E0078003E0078003E0078003E0078003C0078007C00F000 +7800F000F000F001E000F0078000FFFE0000F0000001E0000001E0000001E0000001E0000001E0 +000001E0000003C0000003C0000003C0000003C0000003C0000003C000000780000007C00000FF +FC00001F227EA121>80 D<03FFFF0000003E01E000003C007800003C003C00003C003C00003C00 +3E00003C003E000078003E000078003E000078003E000078003E000078007C00007800780000F0 +00F00000F001E00000F007800000FFFC000000F00C000000F007000001E007000001E003800001 +E003800001E003C00001E003C00001E003C00003C007C00003C007C00003C007C00003C007C000 +03C007C04003C007C080078007C08007C003E100FFFC01E3000000007C0022237EA124>82 +D<000FC0800030318000C00B0001800700038007000300030007000300070003000E0002000E00 +02000F0002000F0000000F0000000F80000007E0000007FE000003FFC00001FFE000007FF00000 +0FF8000000F8000000780000003C0000003C0000003C0020003C00400038004000380040003800 +600030006000700060006000F000C000E8018000C607000081FC000019247DA21B>I<1FFFFFFE +3C03E03E3803C00C3003C0042003C0046003C0044003C00440078004C007800480078004800780 +040007800000078000000F0000000F0000000F0000000F0000000F0000000F0000001E0000001E +0000001E0000001E0000001E0000001E0000003C0000003C0000003C0000003C0000003C000000 +3C0000007C000000FC00003FFFF0001F227AA123>I E /Fn 1 4 df<040004000400C460E4E03F +800E003F80E4E0C4600400040004000B0D7E8D11>3 D E /Fo 56 122 df<007E0001C1800301 +800703C00E03C00E01800E00000E00000E00000E00000E0000FFFFC00E01C00E01C00E01C00E01 +C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07F87 +F8151D809C17>12 D<004000800100020006000C000C0018001800300030007000600060006000 +E000E000E000E000E000E000E000E000E000E000E000E000600060006000700030003000180018 +000C000C00060002000100008000400A2A7D9E10>40 D<800040002000100018000C000C000600 +060003000300038001800180018001C001C001C001C001C001C001C001C001C001C001C001C001 +8001800180038003000300060006000C000C00180010002000400080000A2A7E9E10>I<60F0F0 +701010101020204080040C7C830C>44 DI<60F0F06004047C830C>I<00 +010003000600060006000C000C000C0018001800180030003000300060006000C000C000C00180 +01800180030003000300060006000C000C000C00180018001800300030003000600060006000C0 +00C00010297E9E15>I<03C00C301818300C300C700E60066006E007E007E007E007E007E007E0 +07E007E007E007E007E007E00760066006700E300C300C18180C3007E0101D7E9B15>I<030007 +003F00C70007000700070007000700070007000700070007000700070007000700070007000700 +070007000700070007000F80FFF80D1C7C9B15>I<07C01830201C400C400EF00FF80FF807F807 +7007000F000E000E001C001C00380070006000C00180030006010C01180110023FFE7FFEFFFE10 +1C7E9B15>I<07E01830201C201C781E780E781E381E001C001C00180030006007E00030001C00 +1C000E000F000F700FF80FF80FF80FF00E401C201C183007E0101D7E9B15>I<000C00000C0000 +1C00003C00003C00005C0000DC00009C00011C00031C00021C00041C000C1C00081C00101C0030 +1C00201C00401C00C01C00FFFFC0001C00001C00001C00001C00001C00001C00001C0001FFC012 +1C7F9B15>I<300C3FF83FF03FC020002000200020002000200023E024302818301C200E000E00 +0F000F000F600FF00FF00FF00F800E401E401C2038187007C0101D7E9B15>I<4000007FFF807F +FF007FFF0040020080040080040080080000100000100000200000600000400000C00000C00001 +C00001800001800003800003800003800003800007800007800007800007800007800007800003 +0000111D7E9B15>55 D<03E00C301008200C20066006600660067006780C3E083FB01FE007F007 +F818FC307E601E600FC007C003C003C003C00360026004300C1C1007E0101D7E9B15>I<60F0F0 +600000000000000000000060F0F06004127C910C>58 D<000600000006000000060000000F0000 +000F0000000F00000017800000178000001780000023C0000023C0000023C0000041E0000041E0 +000041E0000080F0000080F0000180F8000100780001FFF80003007C0002003C0002003C000600 +3E0004001E0004001E000C001F001E001F00FF80FFF01C1D7F9C1F>65 DI<001F808000E0618001801980070007800E0003801C0003801C00018038000180780000 +807800008070000080F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000 +0000700000807800008078000080380000801C0001001C0001000E000200070004000180080000 +E03000001FC000191E7E9C1E>IIII<001F808000E0618001801980070007800E0003801C0003801C0001803800018078000080 +7800008070000080F0000000F0000000F0000000F0000000F0000000F0000000F000FFF0F0000F +80700007807800078078000780380007801C0007801C0007800E00078007000B800180118000E0 +6080001F80001C1E7E9C21>III< +FF8000FF800F8000F8000F8000F8000BC00178000BC00178000BC001780009E002780009E00278 +0008F004780008F004780008F0047800087808780008780878000878087800083C107800083C10 +7800083C107800081E207800081E207800081E207800080F407800080F40780008078078000807 +807800080780780008030078001C03007800FF8307FF80211C7E9B26>77 +DI<003F800000E0E0000380380007001C000E000E001C0007003C00078038000380780003C0 +780003C0700001C0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001 +E0700001C0780003C0780003C0380003803C0007801C0007000E000E0007001C000380380000E0 +E000003F80001B1E7E9C20>I82 D<07E0801C1980300580700380600180E00180E0 +0080E00080E00080F00000F800007C00007FC0003FF8001FFE0007FF0000FF80000F800007C000 +03C00001C08001C08001C08001C0C00180C00180E00300D00200CC0C0083F800121E7E9C17>I< +7FFFFFC0700F01C0600F00C0400F0040400F0040C00F0020800F0020800F0020800F0020000F00 +00000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F +0000000F0000000F0000000F0000000F0000000F0000000F0000001F800003FFFC001B1C7F9B1E +>II87 D<1FC000307000783800781C00301C00001C00001C0001FC000F1C00381C00701C0060 +1C00E01C40E01C40E01C40603C40304E801F870012127E9115>97 DI<07E00C301878307870306000E000E000E000E000E000E00060007004300418080C30 +07C00E127E9112>I<003F00000700000700000700000700000700000700000700000700000700 +00070003E7000C1700180F00300700700700600700E00700E00700E00700E00700E00700E00700 +600700700700300700180F000C370007C7E0131D7E9C17>I<03E00C301818300C700E6006E006 +FFFEE000E000E000E00060007002300218040C1803E00F127F9112>I<00F8018C071E061E0E0C +0E000E000E000E000E000E00FFE00E000E000E000E000E000E000E000E000E000E000E000E000E +000E000E000E007FE00F1D809C0D>I<00038003C4C00C38C01C3880181800381C00381C00381C +00381C001818001C38000C300013C0001000003000001800001FF8001FFF001FFF803003806001 +C0C000C0C000C0C000C06001803003001C0E0007F800121C7F9215>II<18003C003C0018000000000000000000000000000000FC001C001C001C001C001C +001C001C001C001C001C001C001C001C001C001C001C00FF80091D7F9C0C>I107 DIII< +03F0000E1C00180600300300700380600180E001C0E001C0E001C0E001C0E001C0E001C0600180 +7003803003001806000E1C0003F00012127F9115>II114 +D<1F9030704030C010C010E010F8007F803FE00FF000F880388018C018C018E010D0608FC00D12 +7F9110>I<04000400040004000C000C001C003C00FFE01C001C001C001C001C001C001C001C00 +1C001C101C101C101C101C100C100E2003C00C1A7F9910>IIII<7F8FF00F03800F03 +0007020003840001C80001D80000F00000700000780000F800009C00010E00020E000607000403 +801E07C0FF0FF81512809116>II E /Fp 8 117 df<78FCFCFCFC7806067D850D +>46 D<00038000000380000007C0000007C0000007C000000FE000000FE000001FF000001BF000 +001BF0000031F8000031F8000061FC000060FC0000E0FE0000C07E0000C07E0001803F0001FFFF +0003FFFF8003001F8003001F8006000FC006000FC00E000FE00C0007E0FFC07FFEFFC07FFE1F1C +7E9B24>65 D<0FF8001C1E003E0F803E07803E07C01C07C00007C0007FC007E7C01F07C03C07C0 +7C07C0F807C0F807C0F807C0780BC03E13F80FE1F815127F9117>97 DI<03FC000E0E001C1F003C1F00781F00780E00F80000F80000F80000F80000F80000 +F800007800007801803C01801C03000E0E0003F80011127E9115>I114 D<1FD830786018E018E018F000FF807FE07FF01FF807FC007CC01C +C01CE01CE018F830CFC00E127E9113>I<0300030003000300070007000F000F003FFCFFFC1F00 +1F001F001F001F001F001F001F001F001F0C1F0C1F0C1F0C0F08079803F00E1A7F9913>I +E /Fq 38 122 df<0E1E1E1E1E02020404080810204080070F7D840F>44 +D<70F8F8F0E005057A840F>46 D<0001000300030006001E002E03CE001C001C001C001C003800 +3800380038007000700070007000E000E000E000E001C001C001C001C003800380038003800780 +FFFC10217AA019>49 D<0000180000380000380000700000700000700000E00000E00000E00000 +C00001C0000180000380000300000300000600000600000C00000C000018000010000031800061 +C00043800083800183800303800207000407000807003FC700403E00800FF0000E00000E00001C +00001C00001C00001C00003800003800003800003000152B7EA019>52 D<00400400703800FFF0 +00FFE000BF80008000010000010000010000010000020000020000023E0002C3000501800601C0 +0401C00001E00001E00001E00001E00001E00001E07003C0F003C0F003C0E00780800700800F00 +800E00401C0040380030E0000F800016227BA019>I<0003E0000C1000380800603800C07801C0 +780380300700000700000E00001E00001E00001C7C003C86003D03007A03807C03807801C07803 +C0F803C0F003C0F003C0F003C0E00780E00780E00780E00700E00F00E00E00E01C006018006030 +0030E0000F800015227AA019>I<000FC000386000703000E03001C0380380380780380700380F +00380F00380F00381E00781E00781E00781E00F81E00F01C00F00E01F00E02F00605E00309E001 +F1E00003C00003C0000380000700000700600E00F00C00F01800E0300080600041C0003F000015 +227BA019>57 D<0000030000000300000007000000070000000F0000000F0000001F0000002F00 +00002F0000004F0000004F80000087800000878000010780000207800002078000040780000407 +800008078000080780001007800030078000200780007FFF80004007C0008007C0008003C00100 +03C0030003C0020003C0040003C0040003C00C0003C03C0007C0FF003FFC1E237DA224>65 +D<00007F00800003808100000E00630000380027000070001F0000E0000E0001C0000E00038000 +0E000700000E000F000004000E000004001E000004003C000004003C0000080078000000007800 +0000007800000000F000000000F000000000F000000000F000000000F000000000E000000000E0 +00002000E000002000E000004000E000004000F000008000700000800070000100003800020000 +18000400001C0008000006003000000381C0000000FE000000212479A223>67 +D<00FFFFF000000F003C00000F000E00000F000700001E000380001E000380001E0001C0001E00 +01C0003C0001C0003C0001E0003C0001E0003C0001E000780001E000780001E000780001E00078 +0001E000F00003C000F00003C000F00003C000F00003C001E000078001E000078001E000070001 +E0000F0003C0000E0003C0001C0003C0003C0003C00038000780007000078000E000078001C000 +07800700000F801C0000FFFFF0000023227DA125>I<00FFFFFF80000F000780000F000180000F +000180001E000180001E000180001E000100001E000100003C000100003C000100003C01010000 +3C01000000780200000078020000007806000000780E000000FFFC000000F00C000000F00C0000 +00F00C000001E008000001E008000001E008040001E000080003C000080003C000080003C00010 +0003C000100007800020000780006000078000C000078001C0000F8007C000FFFFFF800021227D +A121>I<00FFF8000F00000F00000F00001E00001E00001E00001E00003C00003C00003C00003C +0000780000780000780000780000F00000F00000F00000F00001E00001E00001E00001E00003C0 +0003C00003C00003C0000780000780000780000780000F8000FFF80015227DA113>73 +D<0007FFC000003C0000003C0000003C00000078000000780000007800000078000000F0000000 +F0000000F0000000F0000001E0000001E0000001E0000001E0000003C0000003C0000003C00000 +03C00000078000000780000007800000078000000F0000000F0000380F0000780F0000F81E0000 +F81E0000F03C0000403800004070000021E000001F8000001A237CA11A>I<00FFF807FC000F00 +01E0000F0001C0000F000100001E000200001E000400001E001000001E002000003C004000003C +008000003C010000003C04000000780800000078180000007838000000787C000000F0BC000000 +F23C000000F41E000000F81E000001F01F000001E00F000001E00F000001E00F800003C0078000 +03C007800003C003C00003C003C000078003C000078001E000078001E000078001E0000F8001F0 +00FFF80FFE0026227DA125>I<00FF800007FC000F80000F80000F80001780000F800017800017 +80002F000013C0002F000013C0004F000013C0008F000023C0009E000023C0011E000023C0011E +000023C0021E000043C0043C000043C0043C000043C0083C000041E0083C000081E01078000081 +E02078000081E02078000081E04078000101E040F0000101E080F0000101E100F0000101E100F0 +000200F201E0000200F201E0000200F401E0000200F801E0000400F803C0000400F003C0000400 +F003C0000C00E003C0001E00C007C000FFC0C07FFC002E227DA12C>77 D<00FFFFE0000F003800 +0F001E000F000E001E0007001E0007001E0007001E0007003C000F003C000F003C000F003C001E +0078001E0078003C00780078007800E000F003C000FFFE0000F0000000F0000001E0000001E000 +0001E0000001E0000003C0000003C0000003C0000003C000000780000007800000078000000780 +00000F800000FFF8000020227DA121>80 D<00FFFFC0000F0070000F003C000F001C001E000E00 +1E000E001E000F001E000F003C001E003C001E003C001E003C003C0078003800780070007801E0 +0078078000FFFC0000F00E0000F0070000F0038001E003C001E003C001E003C001E003C003C007 +8003C0078003C0078003C0078007800F0007800F0107800F01078007020F800702FFF8038C0000 +00F020237DA124>82 D<0001F020000E0C40001802C0003001C0006001C000E0018000C0018001 +C0018001C0018003C0010003C0010003C0000003C0000003E0000001F8000001FF000000FFE000 +007FF000001FF8000003FC0000007C0000003C0000001E0000001E0000001E0020001C0020001C +0020001C00200018006000380060003000700060007000C000C8018000C607000081FC00001B24 +7DA21B>I<1FFFFFF81E03C0381803C0183003C01820078018200780184007801040078010400F +0010800F0010800F0010000F0000001E0000001E0000001E0000001E0000003C0000003C000000 +3C0000003C00000078000000780000007800000078000000F0000000F0000000F0000000F00000 +01E0000001E0000001E0000001E0000003E00000FFFF00001D2277A123>I86 D<00F8C00185C00705C00E03800E03801C +03803C0380380700780700780700780700F00E00F00E00F00E00F00E10F01C20701C20703C2030 +5C40308C400F078014157B9419>97 D<007E0001C1000301800703800E07801C07803C00003800 +00780000780000780000F00000F00000F00000F00000F00100700100700200300C001830000FC0 +0011157B9416>99 D<00003C0003F80000380000380000380000700000700000700000700000E0 +0000E00000E00000E00001C000F9C00185C00705C00E03800E03801C03803C0380380700780700 +780700780700F00E00F00E00F00E00F00E10F01C20701C20703C20305C40308C400F078016237B +A219>I<00F803840E021C023C0238027804F018FFE0F000F000E000E000E000E000E002E00260 +04701830600F800F157A9416>I<00003E0000470000CF00018F00018600038000038000038000 +0700000700000700000700000700000E0000FFF0000E00000E00000E00001C00001C00001C0000 +1C00001C0000380000380000380000380000380000700000700000700000700000700000E00000 +E00000E00000E00000C00001C00001C000718000F18000F300006200003C0000182D82A20F>I< +001F180030B800E0B801C07001C0700380700780700700E00F00E00F00E00F00E01E01C01E01C0 +1E01C01E01C01E03800E03800E0780060B8006170001E700000700000700000E00000E00000E00 +701C00F01800F0300060E0003F8000151F7E9416>I<00F0000FE00000E00000E00000E00001C0 +0001C00001C00001C000038000038000038000038000070000071F0007218007C0C00F00E00F00 +E00E00E00E00E01C01C01C01C01C01C01C01C0380380380380380380380704700708700E08700E +10700610E006206003C016237DA219>I<00C001E001C001C00000000000000000000000000000 +00001C002300430043008700870087000E000E001C001C001C0038003800384070807080708071 +0032001C000B217BA00F>I<01E01FC001C001C001C0038003800380038007000700070007000E +000E000E000E001C001C001C001C0038003800380038007000700070007100E200E200E200E200 +640038000B237CA20C>108 D<1C0F80F8002610C10C0047606606008780780700878078070087 +0070070087007007000E00E00E000E00E00E000E00E00E000E00E00E001C01C01C001C01C01C00 +1C01C01C001C01C03820380380384038038070403803807080380380308070070031003003001E +0023157B9428>I<1C0F002631C04740C08780E08780E08700E08700E00E01C00E01C00E01C00E +01C01C03801C03801C03801C0704380708380E08380E103806107006203003C016157B941B>I< +007E0001C3000381800701C00E01C01C01E03C01E03801E07801E07801E07801E0F003C0F003C0 +F00380F00780700700700E00700C0030180018700007C00013157B9419>I<01C1F00262180474 +1C08780C08700E08700E08701E00E01E00E01E00E01E00E01E01C03C01C03C01C03C01C0780380 +7003807003C0E003C1C0072380071E000700000700000E00000E00000E00000E00001C00001C00 +001C0000FFC000171F7F9419>I<1C1F002620804741C08783C08703C08701808700000E00000E +00000E00000E00001C00001C00001C00001C000038000038000038000038000070000030000012 +157B9415>114 D<00FC000183000200800401800C03800C03000C00000F00000FF00007FC0003 +FE00003E00000F00000700700700F00600F00600E004004008002030001FC00011157D9414>I< +00C001C001C001C001C003800380038003800700FFF8070007000E000E000E000E001C001C001C +001C003800380038003810702070207040708031001E000D1F7C9E10>I<1E00602300E04380E0 +4381C08381C08701C08701C00703800E03800E03800E03801C07001C07001C07001C07081C0E10 +180E101C0E101C1E200C262007C3C015157B941A>I<1E00302300704380704380E08380E08700 +E08700E00701C00E01C00E01C00E01C01C03801C03801C03801C03801C07001C07001C07001C0F +000C3E0003CE00000E00000E00001C00601C00F03800F03000E0600080C0004380003E0000141F +7B9418>121 D E /Fr 1 4 df<01800180018001804182F18F399C0FF003C003C00FF0399CF18F +4182018001800180018010127E9215>3 D E /Fs 16 118 df<00FE0007FF800E07E01803F020 +01F82000F840007C40007CF8007EFC007EFC003EFC003EFC003E78007E00007E00007C00007C00 +00F80000F80001F00001E00003C0000780000700000E00001C0000380000700000600000C00001 +80020300020600040C000418000410000C3FFFFC7FFFF8FFFFF8FFFFF817287DA71E>50 +D69 D73 +D78 D<0001FF0000000F01E000003C0078000078003C00 +00E0000E0001E0000F0003C000078007800003C00F800003E01F000001F01F000001F03E000000 +F83E000000F87E000000FC7E000000FC7C0000007C7C0000007CFC0000007EFC0000007EFC0000 +007EFC0000007EFC0000007EFC0000007EFC0000007EFC0000007EFC0000007E7C0000007C7E00 +0000FC7E000000FC7E000000FC3E000000F83F000001F81F000001F01F000001F00F800003E007 +800003C007C00007C003E0000F8000F0001E000078003C00003C007800000F01E0000001FF0000 +272B7DA92E>I82 +D<00FE010003FF83000F81E3001E0037003C001F0038000F007800070070000700F0000300F000 +0300F0000300F0000100F8000100F8000100FC0000007C0000007F0000003FE000001FFF00000F +FFE00007FFF80003FFFC00007FFE000007FF0000007F0000001F8000000F80000007C0000007C0 +800003C0800003C0800003C0800003C0C00003C0C0000380C0000380E0000780F0000700F8000E +00EE001C00C3C07800C1FFF000803FC0001A2B7DA921>I86 D89 +D<01FC00000E0780001001C0003C00E0003E00F0003E0078001C00780008007800000078000000 +780000007800007FF80003E078000F8078001F0078003E0078007C00780078007820F8007820F8 +007820F8007820F800F8207C00F8203C013C401F063FC007F80F001B1A7E991E>97 +D<007F8001C0700780080F003C1E007C3C007C3C00387C0010780000F80000F80000F80000F800 +00F80000F80000F80000F800007800007C00003C00043C00041E00080F001007802001C0C0007F +00161A7E991B>99 D<00000F000001FF000001FF0000001F0000000F0000000F0000000F000000 +0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F00003F0F0001 +C0CF0003802F000F001F001E001F001C000F003C000F007C000F0078000F0078000F00F8000F00 +F8000F00F8000F00F8000F00F8000F00F8000F00F8000F0078000F0078000F003C000F003C000F +001E001F000E002F0007004F8001C18FF8007E0FF81D2A7EA921>I<007E0003C3800700E00E00 +F01C00703C00783C003878003C78003CF8003CF8003CFFFFFCF80000F80000F80000F80000F800 +007800007C00003C00043C00041E00080E001007002001C0C0007F00161A7E991B>I<001F0000 +70C000E1E001C3E003C3E00381C007808007800007800007800007800007800007800007800007 +8000078000FFFE00FFFE0007800007800007800007800007800007800007800007800007800007 +800007800007800007800007800007800007800007800007800007800007800007800007C000FF +FE00FFFE00132A7FA912>I<007F000001C1C000070070000E0038001C001C003C001E003C001E +0078000F0078000F00F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F800 +0F8078000F0078000F003C001E003C001E001E003C000E0038000700700001C1C000007F000019 +1A7E991E>111 D<07800780FF80FF80FF80FF800F800F80078007800780078007800780078007 +800780078007800780078007800780078007800780078007800780078007800780078007800780 +0780078007800780078007800F8007800F800380178001C027C000E047FC003F87FC1E1A7F9921 +>117 D E /Ft 25 121 df<1C003E007F00FF80FF80FF807F003E001C00000000000000000000 +00000000000000000000000000000000000000000000000000000000001C003E007F00FF80FF80 +FF807F003E001C00092579A418>58 D<0000000C000000000000001E000000000000001E000000 +000000001E000000000000003F000000000000003F000000000000003F000000000000007F8000 +00000000007F800000000000007F80000000000000FFC0000000000000FFC0000000000000FFC0 +0000000000019FE00000000000019FE00000000000039FF00000000000030FF00000000000030F +F00000000000070FF800000000000607F800000000000607F800000000000C07FC00000000000C +03FC00000000000C03FC00000000001803FE00000000001801FE00000000001801FE0000000000 +3000FF00000000003000FF00000000003000FF000000000060007F800000000060007F80000000 +00E0007F8000000000C0003FC000000000C0003FC000000001C0003FE00000000180001FE00000 +000180001FE00000000380001FF000000003FFFFFFF000000003FFFFFFF000000007FFFFFFF800 +000006000007F800000006000007F80000000C000007FC0000000C000003FC0000000C000003FC +00000018000001FE00000018000001FE00000018000001FE00000030000000FF00000030000000 +FF00000070000000FF800000600000007F800000600000007F800000F00000007FC00003F80000 +007FC0000FFC000001FFE000FFFFC0003FFFFFC0FFFFC0003FFFFFC0FFFFC0003FFFFFC03A3D7D +BC41>65 D73 D75 D80 D82 +D<000FF80060003FFF006000FFFFC0E001F807E1E007E000F1E00F80003BE00F00001FE01F0000 +0FE03E000007E03E000003E07C000001E07C000001E0FC000001E0FC000000E0FC000000E0FC00 +0000E0FC00000060FE00000060FE00000060FF000000607F000000007F800000007FE00000003F +F80000003FFF8000001FFFF800000FFFFF800007FFFFE00003FFFFF80001FFFFFC0000FFFFFE00 +003FFFFF000007FFFF8000007FFFC0000007FFE00000007FE00000001FF00000000FF000000007 +F000000007F800000003F840000003F8C0000003F8C0000001F8C0000001F8C0000001F8E00000 +01F8E0000001F8E0000001F0F0000001F0F0000003F0F8000003E0F8000003E0FC000007C0FF00 +000F80FB80000F00F1F0003E00F0FE00FC00E03FFFF800C00FFFE000C001FF8000253D7BBB30> +I<3FFFFFFFFFFFF83FFFFFFFFFFFF83FFFFFFFFFFFF83FE001FF8007F83F0000FF0001F87C0000 +FF00007C780000FF00003C780000FF00003C700000FF00001C700000FF00001C600000FF00000C +600000FF00000C600000FF00000C600000FF00000C600000FF00000CE00000FF00000EC00000FF +000006C00000FF000006C00000FF000006C00000FF000006000000FF000000000000FF00000000 +0000FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF00 +0000000000FF000000000000FF000000000000FF000000000000FF000000000000FF0000000000 +00FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF0000 +00000000FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000 +FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF000000 +000000FF000000000000FF000000000000FF000000000000FF000000000000FF000000000003FF +C00000001FFFFFFFF800001FFFFFFFF800001FFFFFFFF800373B7DBA3E>I<003FC0000001FFF8 +000007C07E00000E001F00001E000F80001F8007C0003FC003E0003FC003F0003FC003F0003FC0 +01F0001F8001F8000F0001F800000001F800000001F800000001F800000001F80000001FF80000 +07FFF800003FF9F80000FF01F80003F801F80007F001F8000FC001F8001F8001F8003F8001F800 +7F0001F8007F0001F8007E0001F80CFE0001F80CFE0001F80CFE0001F80CFE0003F80CFE0003F8 +0C7E0006F80C7F0006F80C3F000C7C181F80187E380FE0703FF003FFE01FE0007F800F8026287C +A62B>97 D<01F800000000FFF800000000FFF800000000FFF80000000007F80000000001F80000 +000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000 +000001F80000000001F80000000001F80000000001F80FF0000001F83FFE000001F8F01F000001 +F9C007C00001FB0003E00001FE0001F00001FC0000F80001FC00007C0001F800007E0001F80000 +3E0001F800003F0001F800003F0001F800003F8001F800001F8001F800001F8001F800001FC001 +F800001FC001F800001FC001F800001FC001F800001FC001F800001FC001F800001FC001F80000 +1FC001F800001FC001F800001F8001F800001F8001F800003F8001F800003F0001F800003F0001 +F800007E0001F800007C0001FC0000FC0001FC0000F80001F60001F00001E30003E00001E1C00F +C00001C0F03F000001803FFC000000000FE000002A3D7EBB30>I<0003FE00001FFFC0003E01F0 +00F8003801F0003C03E000FC07C001FE0FC001FE0F8001FE1F8001FE3F0000FC3F0000787F0000 +007F0000007E0000007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 +0000FE000000FE0000007E0000007F0000007F0000003F0000033F0000031F8000031F8000060F +C0000607C0000C03E0001801F0003000F800E0007E03C0001FFF000003FC0020287DA626>I<00 +03FC0000001FFF0000007E07C00000F801E00001E000F00003E000780007C0007C000F80003E00 +1F80003E001F00003F003F00001F003F00001F007F00001F007E00001F807E00001F80FE00001F +80FE00001F80FFFFFFFF80FFFFFFFF80FE00000000FE00000000FE00000000FE00000000FE0000 +00007E000000007E000000007F000000007F000000003F000001803F000001801F800001800F80 +0003000FC000030007C000060003E0000C0001F00018000078007000003F01E000000FFF800000 +01FE000021287EA626>101 D<00003F000001FFC00003E0E0000781F0000F83F8001F07F8003E +07F8007E07F8007E03F0007C01E000FC000000FC000000FC000000FC000000FC000000FC000000 +FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0000FFFFFC00FFFFFC00 +FFFFFC0000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00 +0000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC +000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000 +FC000000FC000001FE00007FFFFC007FFFFC007FFFFC001D3D7FBC1A>I<01C00003F00007F800 +0FF8000FF8000FF80007F80003F00001C000000000000000000000000000000000000000000000 +00000000000000000000000001F8007FF8007FF8007FF80007F80001F80001F80001F80001F800 +01F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F800 +01F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80003FC00 +FFFFE0FFFFE0FFFFE0133A7FB917>105 D<01F800000000FFF800000000FFF800000000FFF800 +00000007F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 +01F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001F800 +00000001F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 +01F800FFFE0001F800FFFE0001F800FFFE0001F8007FE00001F8003F800001F8003E000001F800 +38000001F80030000001F800E0000001F801C0000001F80300000001F80600000001F80C000000 +01F81800000001F83C00000001F87E00000001F8FF00000001FB9F00000001FF1F80000001FC0F +C0000001F807C0000001F807E0000001F803F0000001F801F0000001F801F8000001F800FC0000 +01F8007C000001F8007E000001F8003F000001F8001F800001F8001F800001F8000FC00001F800 +0FE00003FC001FF800FFFFF07FFF80FFFFF07FFF80FFFFF07FFF80293C7EBB2D>107 +D<01F800FFF800FFF800FFF80007F80001F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F80003FC00FFFFF0FFFFF0FFFFF0143C7FBB17>I<01F803F80003F8 +0000FFF81FFF001FFF0000FFF83C0F803C0F8000FFF8E007C0E007C00007F9C003E1C003E00001 +FB0003F30003F00001FB0001F30001F00001FE0001FE0001F80001FE0001FE0001F80001FC0001 +FC0001F80001FC0001FC0001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80003FC0003FC0003FC00FFFFF0FF +FFF0FFFFF0FFFFF0FFFFF0FFFFF0FFFFF0FFFFF0FFFFF044267EA549>I<01F807F80000FFF81F +FE0000FFF8781F0000FFF8E00F800007F98007C00001FB0007E00001FB0003E00001FE0003F000 +01FC0003F00001FC0003F00001FC0003F00001F80003F00001F80003F00001F80003F00001F800 +03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F000 +01F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 +03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F000 +03FC0007F800FFFFF1FFFFE0FFFFF1FFFFE0FFFFF1FFFFE02B267EA530>I<0001FE0000000FFF +C000003F03F00000F8007C0001F0003E0003E0001F0007C0000F800F800007C00F800007C01F00 +0003E03F000003F03F000003F03F000003F07E000001F87E000001F87E000001F8FE000001FCFE +000001FCFE000001FCFE000001FCFE000001FCFE000001FCFE000001FCFE000001FCFE000001FC +7E000001F87E000001F87F000003F83F000003F03F000003F01F000003E01F800007E00F800007 +C007C0000F8003E0001F0001F0003E0000F8007C00003F03F000000FFFC0000001FE000026287E +A62B>I<01F80FF00000FFF83FFE0000FFF8F01F0000FFF9C007C00003FB0003E00001FE0001F0 +0001FC0000F80001FC0000FC0001F800007E0001F800007E0001F800007F0001F800003F0001F8 +00003F8001F800003F8001F800001F8001F800001FC001F800001FC001F800001FC001F800001F +C001F800001FC001F800001FC001F800001FC001F800001FC001F800001FC001F800001F8001F8 +00003F8001F800003F8001F800003F0001F800007F0001F800007E0001F80000FC0001FC0000FC +0001FC0001F80001FE0003F00001FB0007E00001F9C00FC00001F8F03F000001F83FFC000001F8 +0FE0000001F80000000001F80000000001F80000000001F80000000001F80000000001F8000000 +0001F80000000001F80000000001F80000000001F80000000001F80000000001F80000000003FC +00000000FFFFF0000000FFFFF0000000FFFFF00000002A377EA530>I<03F00F80FFF03FE0FFF0 +70F0FFF0C1F807F183F801F303F801F603F801F601F001F6004001FC000001FC000001FC000001 +FC000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000 +01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800 +0001F8000001F8000003FC0000FFFFF800FFFFF800FFFFF8001D267EA522>114 +D<007F818003FFE3800F807F801E001F8038000780380007807000038070000380F0000180F000 +0180F0000180F8000180F8000180FE0000007F8000007FFC00003FFFC0001FFFF0000FFFFC0003 +FFFE0001FFFF00001FFF800000FF8000001FC040000FC0C00007E0C00003E0E00001E0E00001E0 +E00001E0E00001E0F00001E0F00001C0F80003C0FC000380FC000700F7000E00E3C03C00C0FFF8 +00C03FC0001B287DA622>I<001800000018000000180000001800000018000000380000003800 +000038000000380000007800000078000000F8000000F8000001F8000003F8000007F800001FFF +FF00FFFFFF00FFFFFF0001F8000001F8000001F8000001F8000001F8000001F8000001F8000001 +F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000 +01F8000001F8018001F8018001F8018001F8018001F8018001F8018001F8018001F8018001F801 +8000F8018000F8030000FC0300007C0300003E0600001F0C00000FF8000003F00019367EB421> +I<01F80003F000FFF801FFF000FFF801FFF000FFF801FFF00007F8000FF00001F80003F00001F8 +0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F0 +0001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F8 +0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F0 +0001F80003F00001F80003F00001F80007F00001F80007F00001F80007F00000F8000FF00000F8 +000FF00000FC001BF000007C001BFC00003E0073FFE0001F81E3FFE0000FFF83FFE00001FE03F0 +002B277EA530>I120 D E end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300dpi +TeXDict begin + +%%EndSetup +%%Page: 1 1 +1 0 bop 390 293 a Ft(SP)-7 b(ARSKIT:)31 b(a)h(basic)h(to)r(ol)g(kit)h(for)390 +397 y(sparse)28 b(matrix)i(computations)390 557 y Fs(VERSION)20 +b(2)390 632 y(Y)-5 b(oucef)19 b(Saad)710 610 y Fr(\003)844 +1247 y Fq(June)f(6,)f(1994)120 1447 y Fp(Abstract.)24 b Fo(This)15 +b(pap)q(er)g(presen)o(ts)i(the)f(main)d(features)j(of)e(a)h(to)q(ol)f(pac)o +(k)n(age)h(for)f(manipulating)e(and)j(w)o(orking)60 1497 y(with)h(sparse)h +(matrices.)25 b(One)16 b(of)g(the)h(goals)e(of)h(the)g(pac)o(k)n(age)g(is)g +(to)g(pro)o(vide)g(basic)g(to)q(ols)g(to)g(facilitate)f(exc)o(hange)60 +1547 y(of)j(soft)o(w)o(are)g(and)g(data)g(b)q(et)o(w)o(een)i(researc)o(hers)h +(in)d(sparse)i(matrix)c(computations.)30 b(Our)19 b(starting)f(p)q(oin)o(t)g +(is)g(the)60 1597 y(Harw)o(ell/Bo)q(eing)f(collection)g(of)g(matrices)g(for)g +(whic)o(h)h(w)o(e)g(pro)o(vide)f(a)g(n)o(um)o(b)q(er)g(of)g(to)q(ols.)29 +b(Among)16 b(other)i(things)60 1647 y(the)f(pac)o(k)n(age)f(pro)o(vides)h +(programs)e(for)i(con)o(v)o(erting)f(data)g(structures,)k(prin)o(ting)15 +b(simple)g(statistics)j(on)e(a)g(matrix,)60 1696 y(plotting)d(a)g(matrix)f +(pro\014le,)i(p)q(erforming)e(basic)i(linear)g(algebra)f(op)q(erations)h +(with)g(sparse)h(matrices)e(and)h(so)g(on.)p 60 2455 744 2 +v 116 2486 a Fn(\003)135 2501 y Fo(W)m(ork)j(done)i(partly)f(at)h(CSRD,)e +(univ)o(ersit)o(y)i(of)f(Illinois)e(and)j(partly)f(at)g(RIA)o(CS)h(\(NASA)g +(Ames)f(Researc)o(h)60 2550 y(Cen)o(ter\).)i(Curren)o(t)15 +b(address:)k(Computer)13 b(Science)j(Dept.,)d(Univ)o(ersit)o(y)h(of)f +(Minnesota,)h(Minneap)q(olis,)f(MN)h(55455.)60 2600 y(This)e(w)o(ork)g(w)o +(as)g(supp)q(orted)h(in)f(part)h(b)o(y)e(the)i(NAS)g(Systems)f(Division,)e +(via)h(Co)q(op)q(erativ)o(e)i(Agreemen)o(t)f(NCC)g(2-387)60 +2650 y(b)q(et)o(w)o(een)h(NASA)g(and)f(the)h(Univ)o(ersit)o(y)f(Space)h +(Researc)o(h)g(Asso)q(ciation)f(\(USRA\))g(and)g(in)g(part)g(b)o(y)g(the)h +(Departmen)o(t)60 2700 y(of)g(Energy)i(under)g(gran)o(t)e(DE-F)o +(G02-85ER25001.)p eop +%%Page: 2 2 +2 1 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1589 w Fl(2)60 +140 y Fk(1)83 b(In)n(tro)r(duction)60 249 y Fl(Researc)o(h)12 +b(on)h(sparse)g(matrix)e(tec)o(hniques)g(has)i(b)q(ecome)e(increasingly)h +(complex,)e(and)j(this)g(trend)f(is)60 310 y(lik)o(ely)g(to)k(accen)o(tuate)e +(if)h(only)f(b)q(ecause)i(of)f(the)g(gro)o(wing)g(need)g(to)g(design)g +(e\016cien)o(t)e(sparse)j(matrix)60 370 y(algorithms)e(for)g(mo)q(dern)g(sup) +q(ercomputers.)19 b(While)14 b(there)f(are)i(a)g(n)o(um)o(b)q(er)d(of)j(pac)o +(k)m(ages)g(and)f(`user)60 430 y(friendly')k(to)q(ols,)j(for)f(p)q(erforming) +f(computations)g(with)h(small)e(dense)h(matrices)f(there)h(is)h(a)g(lac)o(k) +60 490 y(of)g(an)o(y)g(similar)e(to)q(ol)j(or)g(in)e(fact)h(of)h(an)o(y)f +(general-purp)q(ose)h(libraries)e(for)h(w)o(orking)g(with)g(sparse)60 +550 y(matrices.)36 b(Y)l(et)21 b(a)h(collection)f(of)h(a)g(few)g(basic)g +(programs)g(to)g(p)q(erform)f(some)g(elemen)n(tary)e(and)60 +610 y(common)e(tasks)j(ma)o(y)d(b)q(e)i(v)o(ery)f(useful)h(in)f(reducing)h +(the)g(t)o(ypical)f(time)e(to)k(implem)o(en)n(t)c(and)k(test)60 +671 y(sparse)14 b(matrix)d(algorithms.)19 b(That)14 b(a)f(common)e(set)i(of)h +(routines)f(shared)g(among)g(researc)o(hers)f(do)q(es)60 731 +y(not)g(y)o(et)f(exist)g(for)g(sparse)i(matrix)d(computation)g(is)i(rather)g +(surprising.)19 b(Consider)12 b(the)g(con)o(trasting)60 791 +y(situation)18 b(in)f(dense)g(matrix)f(computations.)24 b(The)18 +b(Linpac)o(k)f(and)h(Eispac)o(k)f(pac)o(k)m(ages)h(dev)o(elop)q(ed)60 +851 y(in)f(the)g(70's)h(ha)o(v)o(e)f(b)q(een)g(of)h(tremendous)e(help)h(in)g +(v)m(arious)h(areas)g(of)g(scien)o(ti\014c)e(computing.)23 +b(One)60 911 y(migh)o(t)13 b(sp)q(eculate)h(on)h(the)f(n)o(um)o(b)q(er)f(of)i +(hours)g(of)g(programming)e(e\013orts)j(sa)o(v)o(ed)d(w)o(orldwide)h(thanks) +60 972 y(to)20 b(the)f(widespread)h(a)o(v)m(ailabilit)o(y)d(of)j(these)f(pac) +o(k)m(ages.)32 b(In)19 b(con)o(trast,)i(it)e(is)g(often)h(the)f(case)h(that) +60 1032 y(researc)o(hers)d(in)g(sparse)i(matrix)d(computation)h(co)q(de)h +(their)f(o)o(wn)h(subroutine)g(for)g(suc)o(h)f(things)h(as)60 +1092 y(con)o(v)o(erting)12 b(the)h(storage)h(mo)q(de)e(of)h(a)h(matrix)d(or)j +(for)f(reordering)g(a)g(matrix)f(according)h(to)g(a)h(certain)60 +1152 y(p)q(erm)o(utation.)19 b(One)14 b(of)h(the)e(reasons)i(for)g(this)f +(situation)g(migh)o(t)e(b)q(e)j(the)e(absence)h(of)h(an)o(y)f(standard)60 +1212 y(for)19 b(sparse)h(matrix)d(computations.)28 b(F)l(or)19 +b(instance,)g(the)f(n)o(um)o(b)q(er)f(of)i(di\013eren)o(t)f(data)i +(structures)60 1273 y(used)e(to)h(store)g(sparse)g(matrices)d(in)i(v)m +(arious)h(applications)g(is)f(staggering.)28 b(F)l(or)19 b(the)f(same)f +(basic)60 1333 y(data)j(structure)e(there)g(often)h(exist)e(a)i(large)g(n)o +(um)o(b)q(er)e(of)i(v)m(ariations)g(in)g(use.)28 b(As)18 b(sparse)i(matrix)60 +1393 y(computation)14 b(tec)o(hnology)h(is)f(maturing)g(there)h(is)f(a)i +(desp)q(erate)f(need)f(for)h(some)f(standard)i(for)f(the)60 +1453 y(basic)21 b(storage)h(sc)o(hemes)d(and)i(p)q(ossibly)l(,)h(although)g +(this)f(is)g(more)f(con)o(tro)o(v)o(ersial,)g(for)h(the)g(basic)60 +1513 y(linear)15 b(algebra)i(op)q(erations.)120 1574 y(An)22 +b(imp)q(ortan)o(t)f(example)f(where)i(a)h(pac)o(k)m(age)g(suc)o(h)f(as)h(SP)l +(ARSKIT)e(can)i(b)q(e)f(helpful)g(is)g(for)60 1634 y(exc)o(hanging)e +(matrices)d(for)k(researc)o(h)e(or)h(other)g(purp)q(oses.)33 +b(In)19 b(this)h(situation,)h(one)f(m)o(ust)e(often)60 1694 +y(translate)j(the)f(matrix)f(from)h(some)f(initial)h(data)h(structure)f(in)h +(whic)o(h)f(it)g(is)g(generated,)h(in)o(to)g(a)60 1754 y(di\013eren)o(t)13 +b(desired)h(data)h(structure.)20 b(One)14 b(w)o(a)o(y)g(around)h(this)g +(di\016cult)o(y)d(is)i(to)g(restrict)g(the)g(n)o(um)o(b)q(er)60 +1814 y(of)24 b(sc)o(hemes)d(that)j(can)g(b)q(e)f(used)h(and)g(set)g(some)e +(standards.)45 b(Ho)o(w)o(ev)o(er,)23 b(this)g(is)g(not)h(enough)60 +1874 y(b)q(ecause)16 b(often)f(the)h(data)g(structures)g(are)g(c)o(hosen)f +(for)h(their)f(e\016ciency)e(and)j(con)o(v)o(enience,)d(and)j(it)60 +1935 y(is)h(not)g(reasonable)h(to)f(ask)h(practitioners)e(to)i(abandon)g +(their)f(fa)o(v)o(orite)f(storage)i(sc)o(hemes.)j(What)60 1995 +y(is)16 b(needed)f(is)h(a)g(large)g(set)g(of)g(programs)g(to)h(translate)f +(one)g(data)h(structure)e(in)o(to)h(another.)22 b(In)15 b(the)60 +2055 y(same)k(v)o(ein,)g(subroutines)h(that)h(generate)f(test)f(matrices)f(w) +o(ould)i(b)q(e)g(extremely)d(v)m(aluable)j(since)60 2115 y(they)14 +b(w)o(ould)h(allo)o(w)g(users)g(to)h(ha)o(v)o(e)e(access)h(to)g(a)g(large)g +(n)o(um)o(b)q(er)f(of)h(matrices)e(without)i(the)g(burden)60 +2175 y(of)i(actually)e(passing)i(large)g(sets)f(of)h(data.)120 +2236 y(A)e(useful)g(collection)f(of)h(sparse)h(matrices)e(kno)o(wn)i(as)g +(the)f(Harw)o(ell/Bo)q(eing)f(collection,)g(whic)o(h)60 2296 +y(is)e(publically)e(a)o(v)m(ailable)h([4],)h(has)h(b)q(een)f(widely)f(used)h +(in)f(recen)o(t)g(y)o(ears)h(for)g(testing)g(and)h(comparison)60 +2356 y(purp)q(oses.)22 b(Because)15 b(of)i(the)e(imp)q(ortance)g(of)h(this)g +(collection)e(man)o(y)g(of)j(the)e(to)q(ols)i(in)e(SP)l(ARSKIT)60 +2416 y(can)k(b)q(e)g(considered)g(as)g(companion)f(to)q(ols)i(to)g(it.)28 +b(F)l(or)19 b(example,)e(SP)l(ARSKIT)i(supplies)f(simple)60 +2476 y(routines)h(to)g(create)g(a)g(Harw)o(ell/Bo)q(eing)f(\(H/B\))g(\014le)h +(from)e(a)j(matrix)d(in)i(an)o(y)f(format,)h(to)q(ols)h(for)60 +2537 y(creating)14 b(pic)g(\014les)g(in)g(order)g(to)h(plot)f(a)h(H/B)e +(matrix,)g(a)i(few)f(routines)g(that)h(will)e(deliv)o(er)f(statistics)60 +2597 y(for)20 b(an)o(y)f(H/B)h(matrix,)e(etc..)30 b(Ho)o(w)o(ev)o(er,)18 +b(SP)l(ARSKIT)i(is)f(not)h(limited)d(to)j(b)q(eing)g(a)g(set)f(of)h(to)q(ols) +60 2657 y(to)e(w)o(ork)f(with)g(H/B)g(matrices.)22 b(Since)17 +b(one)g(of)h(our)g(main)e(motiv)m(ations)g(is)h(researc)o(h)g(on)h(iterativ)o +(e)p eop +%%Page: 3 3 +3 2 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1589 w Fl(3)60 +132 y(metho)q(ds,)21 b(w)o(e)f(pro)o(vide)g(n)o(umerous)g(subroutines)h(that) +h(ma)o(y)d(help)h(researc)o(hers)g(in)h(this)g(sp)q(eci\014c)60 +192 y(area.)g(SP)l(ARSKIT)16 b(will)e(hop)q(efully)h(b)q(e)h(an)g(ev)o +(olving)f(pac)o(k)m(age)g(that)i(will)d(b)q(ene\014t)i(from)e(con)o(tribu-)60 +252 y(tions)i(from)e(other)h(researc)o(hers.)20 b(This)c(rep)q(ort)g(is)f(a)h +(succinct)e(description)h(of)g(the)g(pac)o(k)m(age)h(in)f(this)60 +312 y(release.)60 1045 y @beginspecial 75 @vscale 75 @hscale +0 @hoffset -30 @voffset @setspecial +%%BeginDocument: dir.eps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /tmp/xfig-fig024490 +%%Creator: fig2dev +%%CreationDate: Thu Aug 19 20:24:55 1993 +%%For: dsu@unity (Dongli Su,2-209 EECS,626-7512,378-3764) +%%BoundingBox: 0 0 567 259 +%%Pages: 0 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/l {lineto} bind def +/m {moveto} bind def +/s {stroke} bind def +/n {newpath} bind def +/gs {gsave} bind def +/gr {grestore} bind def +/clp {closepath} bind def +/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul +4 -2 roll mul setrgbcolor} bind def +/col-1 {} def +/col0 {0 0 0 setrgbcolor} bind def +/col1 {0 0 1 setrgbcolor} bind def +/col2 {0 1 0 setrgbcolor} bind def +/col3 {0 1 1 setrgbcolor} bind def +/col4 {1 0 0 setrgbcolor} bind def +/col5 {1 0 1 setrgbcolor} bind def +/col6 {1 1 0 setrgbcolor} bind def +/col7 {1 1 1 setrgbcolor} bind def + end +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +0 setlinecap 0 setlinejoin +-18.0 328.0 translate 0.900 -0.900 scale +0.500 setlinewidth +% Polyline +n 49 244 m 319 99 l gs col-1 s gr +% Polyline +n 319 99 m 134 244 l gs col-1 s gr +% Polyline +n 319 99 m 204 244 l gs col-1 s gr +% Polyline +n 319 99 m 264 244 l gs col-1 s gr +% Polyline +n 319 99 m 324 244 l gs col-1 s gr +% Polyline +n 319 99 m 394 244 l gs col-1 s gr +% Polyline +n 319 99 m 484 244 l gs col-1 s gr +% Polyline +n 319 99 m 569 244 l gs col-1 s gr +% Polyline +n 544 304 m 564 264 l gs col-1 s gr +% Polyline +n 564 264 m 614 304 l gs col-1 s gr +% Polyline +n 344 304 m 389 264 l gs col-1 s gr +% Polyline +n 389 264 m 399 304 l gs col-1 s gr +% Polyline +n 389 264 m 454 304 l gs col-1 s gr +% Polyline +n 319 99 m 319 99 l 634 244 l 634 244 l gs col-1 s gr +/Times-Roman findfont 14.00 scalefont setfont +19 259 m +gs 1 -1 scale (BLASSM) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +99 259 m +gs 1 -1 scale (FORMATS) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +189 259 m +gs 1 -1 scale (INFO) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 259 m +gs 1 -1 scale (INOUT) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +304 259 m +gs 1 -1 scale (ITSOL) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +359 259 m +gs 1 -1 scale (MATGEN) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +439 259 m +gs 1 -1 scale (ORDERINGS) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +539 259 m +gs 1 -1 scale (UNSUPP) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +519 319 m +gs 1 -1 scale (MATEXP) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +329 319 m +gs 1 -1 scale (FDIF) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +384 319 m +gs 1 -1 scale (FEM) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +439 319 m +gs 1 -1 scale (MISC) col-1 show gr +/Times-Roman findfont 18.00 scalefont setfont +279 89 m +gs 1 -1 scale (SPARSKIT) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +599 319 m +gs 1 -1 scale (PLOTS) col-1 show gr +%%/Times-Roman findfont 20.00 scalefont setfont +%%199 364 m +%%gs 1 -1 scale (General organization of SPARSKIT) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +619 259 m +gs 1 -1 scale (DOC) col-1 show gr +$F2psEnd +%%EndDocument + @endspecial 495 1121 a(Figure)h(1:)21 b(General)16 b(organization)h(of)g(SP) +l(ARSKIT.)60 1399 y Fk(2)83 b(Data)25 b(structures)d(for)j(sparse)e(matrices) +h(and)g(the)g(con-)184 1490 y(v)n(ersion)i(routines)60 1599 +y Fl(One)16 b(of)h(the)g(di\016culties)d(in)i(sparse)i(matrix)c(computations) +j(is)f(the)g(v)m(ariet)o(y)g(of)h(t)o(yp)q(es)f(of)h(matrices)60 +1660 y(that)g(are)g(encoun)o(tered)e(in)i(practical)e(applications.)23 +b(The)16 b(purp)q(ose)i(of)f(eac)o(h)f(of)g(these)h(sc)o(hemes)d(is)60 +1720 y(to)k(gain)g(e\016ciency)d(b)q(oth)j(in)f(terms)f(of)h(memory)e +(utilization)h(and)i(arithmetic)d(op)q(erations.)25 b(As)18 +b(a)60 1780 y(result)11 b(man)o(y)f(di\013eren)o(t)h(w)o(a)o(ys)h(of)g +(storing)g(sparse)h(matrices)c(ha)o(v)o(e)i(b)q(een)h(devised)f(to)h(tak)o(e) +f(adv)m(an)o(tage)60 1840 y(of)17 b(the)f(structure)g(of)g(the)g(matrices)f +(or)i(the)f(sp)q(eci\014cit)o(y)e(of)j(the)f(problem)f(from)g(whic)o(h)h +(they)g(arise.)60 1900 y(F)l(or)21 b(example)d(if)i(it)g(is)g(kno)o(wn)g +(that)h(a)g(matrix)e(consists)i(of)f(a)h(few)f(diagonals)i(one)e(ma)o(y)f +(simply)60 1961 y(store)j(these)g(diagonals)i(as)e(v)o(ectors)g(and)h(the)f +(o\013sets)h(of)f(eac)o(h)g(diagonal)h(with)f(resp)q(ect)g(to)g(the)60 +2021 y(main)15 b(diagonal.)23 b(If)16 b(the)g(matrix)f(is)h(not)h(regularly)f +(structured,)g(then)h(one)f(of)h(the)f(most)g(common)60 2081 +y(storage)d(sc)o(hemes)d(in)i(use)g(to)q(da)o(y)h(is)f(what)h(w)o(e)f(refer)f +(to)i(in)f(SP)l(ARSKIT)f(as)i(the)f(Compressed)g(Sparse)60 +2141 y(Ro)o(w)18 b(\(CSR\))h(sc)o(heme.)24 b(In)18 b(this)g(sc)o(heme)e(all)i +(the)g(nonzero)g(en)o(tries)f(are)i(stored)f(ro)o(w)h(b)o(y)e(ro)o(w)i(in)f +(a)60 2201 y(one-dimensional)13 b(real)h(arra)o(y)g Fj(A)g +Fl(together)g(with)g(an)h(arra)o(y)f Fj(J)5 b(A)14 b Fl(con)o(taining)g +(their)f(column)g(indices)60 2261 y(and)k(a)f(p)q(oin)o(ter)g(arra)o(y)g +(whic)o(h)g(con)o(tains)g(the)g(addresses)h(in)f Fj(A)f Fl(and)i +Fj(J)5 b(A)15 b Fl(of)i(the)f(b)q(eginning)g(of)h(eac)o(h)60 +2322 y(ro)o(w.)29 b(The)19 b(order)g(of)g(the)f(elemen)o(ts)e(within)i(eac)o +(h)h(ro)o(w)g(do)q(es)g(not)g(matter.)28 b(Also)18 b(of)h(imp)q(ortance)60 +2382 y(b)q(ecause)f(of)h(its)e(simplicit)o(y)e(is)j(the)f(co)q(ordinate)i +(storage)g(sc)o(heme)d(in)i(whic)o(h)f(the)h(nonzero)g(en)o(tries)60 +2442 y(of)g Fj(A)g Fl(are)g(stored)g(in)f(an)o(y)h(order)g(together)g(with)g +(their)f(ro)o(w)h(and)g(column)f(indices.)25 b(Man)o(y)17 b(of)h(the)60 +2502 y(other)c(existing)f(sc)o(hemes)e(are)j(sp)q(ecialized)e(to)i(some)f +(exten)o(t.)19 b(The)14 b(reader)f(is)h(referred)e(to)i(the)g(b)q(o)q(ok)60 +2562 y(b)o(y)i(Du\013)h(et)f(al.)21 b([3])16 b(for)g(more)f(details.)p +eop +%%Page: 4 4 +4 3 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1589 w Fl(4)60 +132 y Fi(2.1)70 b(Storage)23 b(F)-6 b(ormats)60 224 y Fl(Curren)o(tly)l(,)18 +b(the)g(con)o(v)o(ersion)g(routines)h(of)g(SP)l(ARSKIT)g(can)g(handle)f +(thirteen)g(di\013eren)o(t)g(storage)60 284 y(formats.)28 b(These)19 +b(include)f(some)g(of)h(the)f(most)g(commonly)e(used)j(sc)o(hemes)e(but)i +(they)f(are)h(b)o(y)g(no)60 344 y(means)14 b(exhaustiv)o(e.)20 +b(W)l(e)14 b(found)i(it)e(particularly)g(useful)g(to)i(ha)o(v)o(e)e(all)g +(these)h(storage)h(mo)q(des)e(when)60 404 y(trying)k(to)h(extract)f(a)h +(matrix)d(from)i(someone)f(else's)g(application)i(co)q(de)f(in)g(order,)h +(for)g(example,)60 465 y(to)e(analyze)g(it)f(with)h(the)g(to)q(ols)h(describ) +q(ed)e(in)h(the)g(next)f(sections)h(or,)g(more)f(commonly)l(,)e(to)j(try)g(a) +60 525 y(giv)o(en)f(solution)h(metho)q(d)f(whic)o(h)h(requires)f(a)h +(di\013eren)o(t)f(data)i(structure)e(than)i(the)f(one)g(originally)60 +585 y(used)h(in)g(the)g(application.)27 b(Often)18 b(the)g(matrix)e(is)i +(stored)h(in)e(one)i(of)f(these)g(mo)q(des)g(or)g(a)h(v)m(arian)o(t)60 +645 y(that)e(is)g(v)o(ery)f(close)g(to)i(it.)23 b(W)l(e)16 +b(hop)q(e)i(to)f(add)h(man)o(y)d(more)h(con)o(v)o(ersion)g(routines)h(as)g +(SP)l(ARSKIT)60 705 y(ev)o(olv)o(es.)120 766 y(In)23 b(this)f(section)h(w)o +(e)g(describ)q(e)f(in)g(detail)h(the)f(storage)i(sc)o(hemes)d(that)j(are)f +(handled)g(in)f(the)60 826 y(F)o(ORMA)l(TS)12 b(mo)q(dule.)18 +b(F)l(or)13 b(con)o(v)o(enience)e(w)o(e)h(ha)o(v)o(e)g(decided)g(to)h(lab)q +(el)f(b)o(y)h(a)g(three)f(c)o(haracter)g(name)60 886 y(eac)o(h)18 +b(format)f(used.)27 b(W)l(e)18 b(start)h(b)o(y)e(listing)h(the)g(formats)f +(and)i(then)f(describ)q(e)g(them)e(in)i(detail)f(in)60 946 +y(separate)g(subsections)f(\(except)f(for)h(the)g(dense)g(format)g(whic)o(h)f +(needs)h(no)h(detailed)e(description\).)84 1050 y Fh(DNS)i +Fl(Dense)f(format)84 1149 y Fh(BND)g Fl(Linpac)o(k)g(Banded)g(format)84 +1248 y Fh(CSR)h Fl(Compressed)f(Sparse)g(Ro)o(w)h(format)84 +1347 y Fh(CSC)h Fl(Compressed)d(Sparse)i(Column)e(format)84 +1446 y Fh(COO)i Fl(Co)q(ordinate)h(format)84 1545 y Fh(ELL)e +Fl(Ellpac)o(k-Itpac)o(k)e(generalized)h(diagonal)i(format)84 +1644 y Fh(DIA)g Fl(Diagonal)g(format)84 1743 y Fh(BSR)f Fl(Blo)q(c)o(k)g +(Sparse)g(Ro)o(w)h(format)84 1843 y Fh(MSR)g Fl(Mo)q(di\014ed)f(Compressed)f +(Sparse)i(Ro)o(w)g(format)84 1942 y Fh(SSK)g Fl(Symmetri)o(c)c(Skyline)i +(format)84 2041 y Fh(NSK)h Fl(Nonsymmetric)d(Skyline)i(format)84 +2140 y Fh(LNK)h Fl(Link)o(ed)g(list)f(storage)i(format)84 2239 +y Fh(JAD)g Fl(The)f(Jagged)h(Diagonal)h(format)84 2338 y Fh(SSS)f +Fl(The)f(Symmetric)d(Sparse)j(Skyline)f(format)84 2437 y Fh(USS)i +Fl(The)f(Unsymmetri)o(c)d(Sparse)k(Skyline)e(format)84 2536 +y Fh(VBR)i Fl(V)l(ariable)e(Blo)q(c)o(k)g(Ro)o(w)i(format)120 +2640 y(In)h(the)g(follo)o(wing)h(sections)f(w)o(e)g(denote)g(b)o(y)g +Fj(A)h Fl(the)f(matrix)f(under)h(consideration)h(and)g(b)o(y)f +Fj(N)60 2700 y Fl(its)e(ro)o(w)g(dimension)f(and)i Fj(N)5 b(N)g(Z)21 +b Fl(the)16 b(n)o(um)o(b)q(er)e(of)j(its)f(nonzero)g(elemen)o(ts.)p +eop +%%Page: 5 5 +5 4 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1589 w Fl(5)60 +132 y Fh(2.1.1)55 b(Compressed)18 b(Sparse)g(Ro)n(w)i(and)f(related)e +(formats)h(\(CSR,)g(CSC)i(and)f(MSR\))60 224 y Fl(The)g(Compressed)g(Sparse)h +(Ro)o(w)f(format)g(is)g(the)g(basic)g(format)f(used)i(in)f(SP)l(ARSKIT.)f +(Its)h(data)60 284 y(structure)d(consists)h(of)f(three)g(arra)o(ys.)133 +398 y Fg(\017)24 b Fl(A)15 b(real)h(arra)o(y)g Fj(A)g Fl(con)o(taining)f(the) +h(real)g(v)m(alues)g Fj(a)1095 405 y Ff(ij)1141 398 y Fl(stored)g(ro)o(w)g(b) +o(y)g(ro)o(w,)f(from)g(ro)o(w)h(1)h(to)f Fj(N)5 b Fl(.)182 +458 y(The)16 b(length)g(of)h Fj(A)f Fl(is)g(NNZ.)133 560 y +Fg(\017)24 b Fl(An)18 b(in)o(teger)g(arra)o(y)h Fj(J)5 b(A)18 +b Fl(con)o(taining)g(the)h(column)e(indices)g(of)i(the)g(elemen)o(ts)d +Fj(a)1679 567 y Ff(ij)1727 560 y Fl(as)k(stored)182 620 y(in)c(the)g(arra)o +(y)g Fj(A)p Fl(.)21 b(The)16 b(length)g(of)h Fj(J)5 b(A)15 +b Fl(is)h(NNZ.)133 722 y Fg(\017)24 b Fl(An)18 b(in)o(teger)g(arra)o(y)g +Fj(I)t(A)g Fl(con)o(taining)g(the)h(p)q(oin)o(ters)f(to)h(the)f(b)q(eginning) +h(of)g(eac)o(h)f(ro)o(w)h(in)f(the)182 782 y(arra)o(ys)g Fj(A)g +Fl(and)h Fj(J)5 b(A)p Fl(.)26 b(Th)o(us)18 b(the)g(con)o(ten)o(t)f(of)h +Fj(I)t(A)p Fl(\()p Fj(i)p Fl(\))f(is)h(the)g(p)q(osition)g(in)g(arra)o(ys)h +Fj(A)e Fl(and)i Fj(J)5 b(A)182 842 y Fl(where)17 b(the)g Fj(i)p +Fl(-th)g(ro)o(w)g(starts.)25 b(The)17 b(length)g(of)g Fj(I)t(A)f +Fl(is)h Fj(N)g Fl(+)12 b(1)17 b(with)g Fj(I)t(A)p Fl(\()p Fj(N)f +Fl(+)c(1\))17 b(con)o(taining)182 903 y(the)i(n)o(um)o(b)q(er)f +Fj(I)t(A)p Fl(\(1\))13 b(+)g Fj(N)5 b(N)g(Z)t Fl(,)21 b(i.e.,)d(the)i +(address)g(in)g Fj(A)f Fl(and)h Fj(J)5 b(A)19 b Fl(of)h(the)g(b)q(eginning)g +(of)g(a)182 963 y(\014ctitious)c(ro)o(w)g Fj(N)h Fl(+)11 b(1.)60 +1077 y(The)16 b(order)h(of)g(the)f(nonzero)g(elemen)o(ts)e(within)i(the)g +(same)f(ro)o(w)i(are)f(not)h(imp)q(ortan)o(t.)k(A)16 b(v)m(ariation)60 +1137 y(to)23 b(this)f(sc)o(heme)e(is)i(to)h(sort)g(the)f(elemen)o(ts)e(in)i +(eac)o(h)g(ro)o(w)h(in)f(suc)o(h)g(a)h(w)o(a)o(y)f(that)h(their)f(column)60 +1197 y(p)q(ositions)d(are)f(in)g(increasing)g(order.)27 b(When)18 +b(this)g(sorting)g(in)g(enforced,)g(it)f(is)h(often)g(p)q(ossible)h(to)60 +1257 y(mak)o(e)e(substan)o(tial)j(sa)o(vings)g(in)f(the)g(n)o(um)o(b)q(er)f +(of)h(op)q(erations)i(of)e(some)g(w)o(ell-kno)o(wn)f(algorithms.)60 +1318 y(The)h(Compressed)f(Sparse)i(Column)e(format)g(is)h(iden)o(tical)e +(with)h(the)h(Compressed)f(Sparse)i(Ro)o(w)60 1378 y(format)15 +b(except)g(that)i(the)f(columns)e(of)j Fj(A)e Fl(are)h(stored)h(instead)f(of) +g(the)g(ro)o(ws.)22 b(In)15 b(other)i(w)o(ords)f(the)60 1438 +y(Compressed)d(Sparse)g(Column)g(format)f(is)h(simply)e(the)i(Compressed)g +(Sparse)h(Ro)o(w)f(format)g(for)g(the)60 1498 y(matrix)i Fj(A)256 +1480 y Ff(T)283 1498 y Fl(.)120 1558 y(The)j(Mo)q(di\014ed)f(Sparse)i(Ro)o(w) +f(\(MSR\))f(format)g(is)g(a)i(rather)e(common)f(v)m(ariation)i(of)g(the)f +(Com-)60 1619 y(pressed)e(Sparse)g(Ro)o(w)g(format)f(whic)o(h)g(consists)h +(of)g(k)o(eeping)e(the)i(main)e(diagonal)j(of)f Fj(A)f Fl(separately)l(.)60 +1679 y(The)19 b(corresp)q(onding)i(data)f(structure)f(consists)g(of)h(a)g +(real)f(arra)o(y)g Fj(A)g Fl(and)h(an)g(in)o(teger)e(arra)o(y)h +Fj(J)5 b(A)p Fl(.)60 1739 y(The)18 b(\014rst)h Fj(N)k Fl(p)q(ositions)c(in)f +Fj(A)g Fl(con)o(tain)g(the)g(diagonal)h(elemen)o(ts)d(of)i(the)g(matrix,)f +(in)h(order.)27 b(The)60 1799 y(p)q(osition)19 b Fj(N)f Fl(+)13 +b(1)19 b(of)g(the)f(arra)o(y)h Fj(A)f Fl(is)g(not)h(used.)29 +b(Starting)19 b(from)e(p)q(osition)j Fj(N)e Fl(+)12 b(2,)19 +b(the)g(nonzero)60 1859 y(elemen)o(ts)d(of)i Fj(A)p Fl(,)g(excluding)f(its)h +(diagonal)i(elemen)o(t)o(s,)c(are)i(stored)h(ro)o(w-wise.)28 +b(Corresp)q(onding)20 b(to)60 1920 y(eac)o(h)g(elemen)o(t)d +Fj(A)p Fl(\()p Fj(k)r Fl(\))j(the)g(in)o(teger)f Fj(J)5 b(A)p +Fl(\()p Fj(k)r Fl(\))19 b(is)i(the)f(column)e(index)i(of)g(the)g(elemen)o(t)e +Fj(A)p Fl(\()p Fj(k)r Fl(\))h(in)h(the)60 1980 y(matrix)14 +b Fj(A)p Fl(.)21 b(The)16 b Fj(N)h Fl(+)10 b(1)17 b(\014rst)f(p)q(ositions)h +(of)g Fj(J)5 b(A)15 b Fl(con)o(tain)h(the)g(p)q(oin)o(ter)g(to)h(the)f(b)q +(eginning)g(of)h(eac)o(h)60 2040 y(ro)o(w)j(in)f Fj(A)g Fl(and)h +Fj(J)5 b(A)p Fl(.)30 b(The)19 b(adv)m(an)o(tage)i(of)f(this)f(storage)i(mo)q +(de)d(is)h(that)h(man)o(y)e(matrices)g(ha)o(v)o(e)h(a)60 2100 +y(full)f(main)g(diagonal,)i(i.e.,)d Fj(a)606 2107 y Ff(ii)650 +2100 y Fg(6)p Fl(=)h(0)p Fj(;)8 b(i)19 b Fl(=)f(1)p Fj(;)8 +b(:)g(:)g(:)g(;)g(N)d Fl(,)19 b(and)g(this)g(diagonal)h(is)f(b)q(est)g +(represen)o(ted)f(b)o(y)60 2160 y(an)h(arra)o(y)g(of)g(length)f +Fj(N)5 b Fl(.)29 b(This)18 b(storage)i(mo)q(de)e(is)g(particularly)g(useful)g +(for)h(triangular)g(matrices)60 2221 y(with)f(non-unit)h(diagonals.)27 +b(Often)18 b(the)g(diagonal)h(is)f(then)g(stored)g(in)g(in)o(v)o(erted)e +(form)h(\(i.e.)26 b(1)p Fj(=a)1894 2228 y Ff(ii)60 2281 y Fl(is)15 +b(stored)g(in)g(place)f(of)i Fj(a)513 2288 y Ff(ii)538 2281 +y Fl(\))f(b)q(ecause)h(triangular)f(systems)f(are)h(often)g(solv)o(ed)f(rep)q +(eatedly)g(with)h(the)60 2341 y(same)i(matrix)f(man)o(y)g(times,)g(as)j(is)e +(the)h(case)g(for)g(example)d(in)j(preconditioned)f(Conjugate)i(Gra-)60 +2401 y(dien)o(t)d(metho)q(ds.)22 b(The)16 b(column)f(orien)o(ted)h(analogue)i +(of)f(the)f(MSR)g(format,)g(called)g(MSC)g(format,)60 2461 +y(is)f(also)h(used)g(in)f(some)g(of)h(the)f(other)h(mo)q(dules,)e(but)i(no)g +(transformation)f(to/from)g(it)g(to)h(the)f(CSC)60 2522 y(format)h(is)h +(necessary:)23 b(for)18 b(example)d(to)i(pass)h(from)e(CSC)i(to)g(MSC)f(one)g +(can)h(use)f(the)g(routine)g(to)60 2582 y(pass)k(from)d(the)i(CSR)g(to)g(the) +g(MSR)f(formats,)h(since)f(the)h(data)g(structures)g(are)g(iden)o(tical.)30 +b(The)60 2642 y(ab)q(o)o(v)o(e)16 b(three)g(storage)h(mo)q(des)f(are)g(used)g +(in)g(man)o(y)f(w)o(ell-kno)o(wn)g(pac)o(k)m(ages.)p eop +%%Page: 6 6 +6 5 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1589 w Fl(6)60 +132 y Fh(2.1.2)55 b(The)19 b(banded)g(Linpac)n(k)f(format)f(\(BND\))60 +224 y Fl(Banded)h(matrices)d(represen)o(t)i(the)h(simplest)d(form)i(of)h +(sparse)g(matrices)e(and)i(they)g(often)f(con)o(v)o(ey)60 284 +y(the)e(easiest)g(w)o(a)o(y)f(of)i(exploiting)e(sparsit)o(y)l(.)21 +b(There)14 b(are)h(man)o(y)f(w)o(a)o(ys)h(of)g(storing)h(a)g(banded)f +(matrix.)60 344 y(The)f(one)g(w)o(e)f(adopted)i(here)e(follo)o(ws)g(the)h +(data)h(structure)e(used)h(in)f(the)h(Linpac)o(k)f(banded)i(solution)60 +404 y(routines.)24 b(Our)18 b(motiv)m(ation)e(is)h(that)h(one)g(can)f(easily) +g(tak)o(e)f(adv)m(an)o(tage)j(of)e(this)h(widely)e(a)o(v)m(ailable)60 +465 y(pac)o(k)m(age)h(if)f(the)h(matrices)e(are)i(banded.)23 +b(F)l(or)17 b(fairly)f(small)f(matrices)g(\(sa)o(y)l(,)h Fj(N)k(<)15 +b Fl(2000)j(on)f(sup)q(er-)60 529 y(computers,)f Fj(N)22 b(<)16 +b Fl(200)j(on)f(fast)h(w)o(orkstations,)f(and)g(with)g(a)g(bandwidth)g(of)g +Fj(O)q Fl(\()p Fj(N)1642 497 y Fe(1)p 1642 503 16 2 v 1642 +524 a(2)1664 529 y Fl(\)\),)g(this)g(ma)o(y)60 589 y(represen)o(t)g(a)g +(viable)g(and)h(simple)d(w)o(a)o(y)j(of)f(solving)h(linear)f(systems.)26 +b(One)19 b(m)o(ust)e(\014rst)h(transform)60 650 y(the)d(initial)g(data)h +(structure)f(in)o(to)h(the)f(banded)h(Linpac)o(k)g(format)e(and)j(then)e +(call)g(the)g(appropriate)60 710 y(band)k(solv)o(er.)27 b(F)l(or)18 +b(large)h(problems)e(it)h(is)g(clear)g(that)h(a)f(b)q(etter)g(alternativ)o(e) +f(w)o(ould)i(b)q(e)f(to)h(use)g(a)60 770 y(sparse)i(solv)o(er)f(suc)o(h)g(as) +h(MA28,)g(whic)o(h)f(requires)f(the)h(input)g(matrix)f(to)i(b)q(e)f(in)g(the) +g(co)q(ordinate)60 830 y(format.)120 890 y(In)14 b(the)g(BND)g(format)f(the)h +(nonzero)h(elemen)o(ts)c(of)k Fj(A)f Fl(are)g(stored)h(in)f(a)g(rectangular)h +(arra)o(y)f Fj(AB)s(D)60 951 y Fl(with)22 b(the)h(nonzero)g(elemen)o(ts)c(of) +k(the)g Fj(j)s Fl(-th)g(column)e(b)q(eing)h(stored)h(in)g(the)f +Fj(j)c Fg(\000)d Fj(th)23 b Fl(column)e(of)60 1011 y Fj(AB)s(D)q +Fl(.)30 b(W)l(e)19 b(also)h(need)f(to)h(kno)o(w)f(the)g(n)o(um)o(b)q(er)f +Fj(M)5 b(L)20 b Fl(of)f(diagonals)i(b)q(elo)o(w)e(the)g(main)f(diagonals)60 +1071 y(and)f(the)g(n)o(um)o(b)q(er)d Fj(M)5 b(U)23 b Fl(of)17 +b(diagonals)g(ab)q(o)o(v)o(e)g(the)f(main)g(diagonals.)23 b(Th)o(us)17 +b(the)f(bandwidth)i(of)e Fj(A)60 1131 y Fl(is)j Fj(M)5 b(L)14 +b Fl(+)f Fj(M)5 b(U)18 b Fl(+)c(1)19 b(whic)o(h)g(is)g(the)g(minim)n(um)c(n)o +(um)o(b)q(er)i(of)j(ro)o(ws)f(required)f(in)h(the)g(arra)o(y)g +Fj(AB)s(D)q Fl(.)60 1191 y(An)e(additional)h(in)o(teger)f(parameter)f(is)i +(needed)e(to)j(indicate)d(whic)o(h)h(ro)o(w)h(of)g Fj(AB)s(D)h +Fl(con)o(tains)e(the)60 1252 y(lo)o(w)o(est)f(diagonal.)60 +1381 y Fh(2.1.3)55 b(The)19 b(co)r(ordinate)e(format)h(\(COO\))60 +1474 y Fl(The)g(co)q(ordinate)h(format)f(is)g(certainly)f(the)h(simplest)e +(storage)j(sc)o(heme)d(for)j(sparse)g(matrices.)25 b(It)60 +1534 y(consists)17 b(of)f(three)g(arra)o(ys:)21 b(a)c(real)f(arra)o(y)g(of)h +(size)e Fj(N)5 b(N)g(Z)21 b Fl(con)o(taining)16 b(the)g(real)g(v)m(alues)g +(of)h(nonzero)60 1594 y(elemen)o(ts)e(of)j Fj(A)f Fl(in)g(an)o(y)h(order,)g +(an)g(in)o(teger)f(arra)o(y)g(con)o(taining)h(their)f(ro)o(w)h(indices)e(and) +j(a)f(second)60 1654 y(in)o(teger)c(arra)o(y)g(con)o(taining)h(their)f +(column)f(indices.)19 b(Note)14 b(that)h(this)g(sc)o(heme)d(is)i(as)i +(general)e(as)h(the)60 1715 y(CSR)20 b(format,)f(but)h(from)f(the)g(p)q(oin)o +(t)h(of)g(view)f(of)h(memory)d(requiremen)o(t)f(it)j(is)h(not)g(as)h +(e\016cien)o(t.)60 1775 y(On)d(the)g(other)g(hand)h(it)e(is)h(attractiv)o(e)f +(b)q(ecause)h(of)g(its)g(simplicit)o(y)c(and)19 b(the)f(fact)g(that)g(it)f +(is)h(v)o(ery)60 1835 y(commonly)i(used.)43 b(Inciden)o(tally)l(,)22 +b(w)o(e)h(should)h(men)o(tion)d(a)j(v)m(ariation)f(to)h(this)f(mo)q(de)g +(whic)o(h)f(is)60 1895 y(p)q(erhaps)17 b(the)g(most)e(economical)g(in)h +(terms)f(of)i(memory)d(usage.)22 b(The)17 b(mo)q(di\014ed)e(v)o(ersion)h +(requires)60 1955 y(only)f(a)h(real)f(arra)o(y)h Fj(A)f Fl(con)o(taining)g +(the)h(real)f(v)m(alues)g Fj(a)1063 1962 y Ff(ij)1109 1955 +y Fl(along)h(with)f(only)h(one)f(in)o(teger)g(arra)o(y)h(that)60 +2016 y(con)o(tains)e(the)g(in)o(teger)f(v)m(alues)h(\()p Fj(i)7 +b Fg(\000)g Fl(1\))p Fj(N)12 b Fl(+)7 b Fj(j)16 b Fl(for)f(eac)o(h)e(corresp) +q(onding)j(nonzero)e(elemen)o(t)d Fj(a)1772 2023 y Ff(ij)1802 +2016 y Fl(.)20 b(It)14 b(is)60 2076 y(clear)f(that)i(this)f(is)f(an)i(unam)o +(biguous)f(represen)o(tation)f(of)h(all)g(the)g(nonzero)g(elemen)o(ts)d(of)j +Fj(A)p Fl(.)20 b(There)60 2136 y(are)d(t)o(w)o(o)g(dra)o(wbac)o(ks)h(to)f +(this)g(sc)o(heme.)22 b(First,)17 b(it)g(requires)f(some)g(in)o(teger)g +(arithmetic)f(to)j(extract)60 2196 y(the)h(column)f(and)j(ro)o(w)f(indices)e +(of)i(eac)o(h)f(elemen)o(t)e(when)j(they)f(are)g(needed.)31 +b(Second,)20 b(for)g(large)60 2256 y(matrices)13 b(it)i(ma)o(y)f(lead)h(to)h +(in)o(teger)e(o)o(v)o(er\015o)o(w)h(b)q(ecause)g(of)h(the)f(need)f(to)i(deal) +f(with)g(in)o(tegers)g(whic)o(h)60 2316 y(ma)o(y)e(b)q(e)i(v)o(ery)e(large)h +(\(of)h(the)f(order)h(of)g Fj(N)830 2298 y Fd(2)850 2316 y +Fl(\).)20 b(Because)14 b(of)h(these)f(t)o(w)o(o)g(dra)o(wbac)o(ks)h(this)f +(sc)o(heme)e(has)60 2377 y(seldom)j(b)q(een)h(used)g(in)g(practice.)60 +2507 y Fh(2.1.4)55 b(The)19 b(diagonal)f(format)g(\(DIA\))60 +2599 y Fl(The)k(matrices)e(that)j(arise)f(in)f(man)o(y)g(applications)h +(often)g(consist)g(of)h(a)f(few)g(diagonals.)40 b(This)60 2659 +y(structure)18 b(has)g(probably)g(b)q(een)g(the)g(\014rst)g(one)g(to)g(b)q(e) +g(exploited)f(for)h(the)g(purp)q(ose)h(of)f(impro)o(ving)p +eop +%%Page: 7 7 +7 6 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1589 w Fl(7)60 +132 y(p)q(erformance)16 b(of)i(matrix)e(b)o(y)g(v)o(ector)h(pro)q(ducts)h(on) +g(sup)q(ercomputers,)e(see)h(references)f(in)h([9].)24 b(T)l(o)60 +192 y(store)17 b(these)e(matrices)g(w)o(e)h(ma)o(y)e(store)j(the)f(diagonals) +h(in)f(a)h(rectangular)f(arra)o(y)h Fj(D)q(I)t(AG)p Fl(\(1)d(:)g +Fj(N)r(;)8 b Fl(1)14 b(:)60 252 y Fj(N)5 b(D)q(I)t(AG)p Fl(\))17 +b(where)e Fj(N)5 b(D)q(I)t(AG)17 b Fl(is)f(the)f(n)o(um)o(b)q(er)g(of)h +(diagonals.)22 b(W)l(e)16 b(also)g(need)g(to)g(kno)o(w)g(the)g(o\013sets)60 +312 y(of)i(eac)o(h)f(of)i(the)e(diagonals)i(with)f(resp)q(ect)f(to)h(the)g +(main)f(diagonal.)26 b(These)18 b(will)f(b)q(e)h(stored)g(in)g(an)60 +372 y(arra)o(y)h Fj(I)t(O)q(F)7 b(F)g Fl(\(1)19 b(:)f Fj(N)5 +b(D)q(I)t(AG)p Fl(\).)32 b(Th)o(us,)20 b(in)f(p)q(osition)h(\()p +Fj(i;)8 b(k)r Fl(\))19 b(of)g(the)g(arra)o(y)h Fj(D)q(I)t(AG)g +Fl(is)f(lo)q(cated)g(the)60 432 y(elemen)o(t)11 b Fj(a)264 +440 y Ff(i;i)p Fd(+)p Ff(iof)t(f)t Fd(\()p Ff(k)q Fd(\))458 +432 y Fl(of)k(the)f(original)g(matrix.)19 b(The)14 b(order)h(in)f(whic)o(h)f +(the)h(diagonals)h(are)g(stored)f(in)60 493 y(the)h(columns)f(of)i +Fj(D)q(I)t(AG)g Fl(is)f(unimp)q(ortan)o(t.)20 b(Note)15 b(also)h(that)g(all)f +(the)g(diagonals)i(except)d(the)h(main)60 553 y(diagonal)j(ha)o(v)o(e)f(few)o +(er)f(than)i Fj(N)23 b Fl(elemen)o(ts,)14 b(so)k(there)f(are)g(p)q(ositions)h +(in)f Fj(D)q(I)t(AG)h Fl(that)g(will)e(not)i(b)q(e)60 613 y(used.)120 +673 y(In)13 b(man)o(y)f(applications)h(there)g(is)g(a)g(small)f(n)o(um)o(b)q +(er)g(of)h(non-empt)o(y)f(diagonals)i(and)g(this)f(sc)o(heme)60 +733 y(is)19 b(enough.)29 b(In)19 b(general)f(ho)o(w)o(ev)o(er,)g(it)g(ma)o(y) +g(b)q(e)h(desirable)f(to)h(supplemen)o(t)d(this)j(data)h(structure,)60 +794 y(e.g.,)e(b)o(y)g(a)h(compressed)f(sparse)h(ro)o(w)g(format.)28 +b(A)18 b(general)g(matrix)f(is)i(therefore)f(represen)o(ted)f(as)60 +854 y(the)i(sum)f(of)h(a)g(diagonal-structured)h(matrix)d(and)j(a)f(general)g +(sparse)g(matrix.)28 b(The)19 b(con)o(v)o(ersion)60 914 y(routine)14 +b(CSRDIA)g(whic)o(h)g(con)o(v)o(erts)f(from)g(the)h(compressed)f(sparse)i(ro) +o(w)g(format)e(to)i(the)f(diagonal)60 974 y(format)h(has)h(an)g(option)g(to)g +(this)f(e\013ect.)21 b(If)15 b(the)g(user)h(w)o(an)o(ts)f(to)h(con)o(v)o(ert) +e(a)i(general)g(sparse)g(matrix)60 1034 y(to)e(one)g(with,)f(sa)o(y)l(,)h(5)g +(diagonals,)h(and)f(if)f(the)h(input)f(matrix)f(has)i(more)f(than)h(5)g +(diagonals,)h(the)e(rest)60 1095 y(of)k(the)g(matrix)e(\(after)h(extraction)g +(of)i(the)e(5)h(desired)f(diagonals\))i(will)e(b)q(e)h(put,)f(if)g(desired,)g +(in)o(to)h(a)60 1155 y(matrix)c(in)i(the)g(CSR)h(format.)k(In)15 +b(addition,)g(the)g(co)q(de)g(ma)o(y)f(also)i(compute)e(the)g(most)h(imp)q +(ortan)o(t)60 1215 y(5)f(diagonals)g(if)f(w)o(an)o(ted,)h(or)f(it)g(can)h +(get)g(those)f(indicated)g(b)o(y)g(the)g(user)g(through)i(the)e(arra)o(y)h +Fj(I)t(O)q(F)7 b(F)g Fl(.)60 1345 y Fh(2.1.5)55 b(The)19 b(Ellpac)n(k-Itpac)n +(k)e(format)h(\(ELL\))60 1437 y Fl(The)g(Ellpac)o(k-Itpac)o(k)e(format)h([6,) +h(11,)g(5])g(is)f(a)i(generalization)e(of)h(the)g(diagonal)g(storage)h(sc)o +(heme)60 1497 y(whic)o(h)13 b(is)h(in)o(tended)f(for)i(general)e(sparse)i +(matrices)d(with)i(a)h(limited)c(maxim)n(um)f(n)o(um)o(b)q(er)i(of)j(nonze-) +60 1558 y(ros)21 b(p)q(er)g(ro)o(w.)35 b(Tw)o(o)21 b(rectangular)g(arra)o(ys) +g(of)g(the)g(same)e(size)h(are)h(required,)f(one)h(real)g(and)g(one)60 +1618 y(in)o(teger.)32 b(The)21 b(\014rst,)g Fj(C)t(O)q(E)s(F)7 +b Fl(,)20 b(is)h(similar)d(to)i Fj(D)q(I)t(AG)h Fl(and)g(con)o(tains)f(the)h +(nonzero)f(elemen)o(ts)e(of)60 1678 y Fj(A)p Fl(.)44 b(Assuming)23 +b(that)h(there)g(are)g(at)g(most)f Fj(N)5 b(D)q(I)t(AG)25 b +Fl(nonzero)f(elemen)o(ts)d(in)j(eac)o(h)f(ro)o(w)i(of)f Fj(A)p +Fl(,)60 1738 y(w)o(e)f(can)g(store)g(the)g(nonzero)g(elemen)o(ts)e(of)i(eac)o +(h)f(ro)o(w)i(of)f(the)g(matrix)e(in)i(a)g(ro)o(w)h(of)f(the)g(arra)o(y)60 +1798 y Fj(C)t(O)q(E)s(F)7 b Fl(\(1)21 b(:)g Fj(N)r(;)8 b Fl(1)22 +b(:)f Fj(N)5 b(D)q(I)t(AG)p Fl(\))21 b(completing)e(the)h(ro)o(w)h(b)o(y)f +(zeros)h(if)f(necessary)l(.)34 b(T)l(ogether)21 b(with)60 1859 +y Fj(C)t(O)q(E)s(F)k Fl(w)o(e)17 b(need)h(to)h(store)f(an)h(in)o(teger)e +(arra)o(y)h Fj(J)5 b(C)t(O)q(E)s(F)i Fl(\(1)17 b(:)f Fj(N)r(;)8 +b Fl(1)18 b(:)f Fj(N)5 b(D)q(I)t(AG)p Fl(\))18 b(whic)o(h)g(con)o(tains)60 +1919 y(the)e(column)f(p)q(ositions)i(of)f(eac)o(h)g(en)o(try)f(in)h +Fj(C)t(O)q(E)s(F)7 b Fl(.)60 2049 y Fh(2.1.6)55 b(The)19 b(Blo)r(c)n(k)e +(Sparse)i(Ro)n(w)g(format)f(\(BSR\))60 2141 y Fl(Blo)q(c)o(k)12 +b(matrices)e(are)j(common)d(in)j(all)f(areas)h(of)g(scien)o(ti\014c)e +(computing.)19 b(The)12 b(b)q(est)h(w)o(a)o(y)g(to)g(describ)q(e)60 +2201 y(blo)q(c)o(k)k(matrices)e(is)j(b)o(y)e(viewing)h(them)f(as)i(sparse)g +(matrices)d(whose)k(nonzero)e(en)o(tries)f(are)i(square)60 +2261 y(dense)12 b(blo)q(c)o(ks.)19 b(Blo)q(c)o(k)11 b(matrices)f(arise)i +(from)f(the)g(discretization)g(of)h(partial)g(di\013eren)o(tial)f(equations) +60 2322 y(when)17 b(there)f(are)h(sev)o(eral)f(degrees)g(of)h(freedom)f(p)q +(er)h(grid)f(p)q(oin)o(t.)23 b(There)17 b(are)g(restrictions)f(to)h(this)60 +2382 y(sc)o(heme.)h(Eac)o(h)d(of)g(the)f(blo)q(c)o(ks)g(is)g(treated)h(as)g +(a)g(dense)f(blo)q(c)o(k.)20 b(If)14 b(there)g(are)h(zero)f(elemen)o(ts)e +(within)60 2442 y(eac)o(h)k(blo)q(c)o(k)f(they)h(m)o(ust)f(b)q(e)h(treated)g +(as)h(nonzero)g(elemen)o(ts)c(with)j(the)g(v)m(alue)g(zero.)120 +2502 y(There)23 b(are)h(sev)o(eral)e(v)m(ariations)i(to)g(the)f(metho)q(d)g +(used)h(for)f(storing)h(sparse)h(matrices)c(with)60 2562 y(blo)q(c)o(k)f +(structure.)35 b(The)21 b(one)h(considered)e(here,)h(the)g(Blo)q(c)o(k)f +(Sparse)h(Ro)o(w)g(format,)g(is)g(a)g(simple)60 2623 y(generalization)16 +b(of)g(the)g(Compressed)g(Sparse)g(Ro)o(w)h(format.)p eop +%%Page: 8 8 +8 7 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1589 w Fl(8)120 +132 y(W)l(e)19 b(denote)f(here)h(b)o(y)f Fj(N)5 b(B)s(LK)23 +b Fl(the)c(dimension)e(of)i(eac)o(h)f(blo)q(c)o(k,)h(b)o(y)f +Fj(N)5 b(N)g(Z)t(R)20 b Fl(the)f(n)o(um)o(b)q(er)e(of)60 192 +y(nonzero)f(blo)q(c)o(ks)f(in)g Fj(A)g Fl(\(i.e.,)e Fj(N)5 +b(N)g(Z)t(R)15 b Fl(=)f Fj(N)5 b(N)g(Z)q(=)p Fl(\()p Fj(N)g(B)s(LK)1162 +174 y Fd(2)1183 192 y Fl(\)\))15 b(and)h(b)o(y)f Fj(N)5 b(R)17 +b Fl(the)e(blo)q(c)o(k)g(dimension)60 252 y(of)h Fj(A)p Fl(,)f(\(i.e.,)e +Fj(N)5 b(R)15 b Fl(=)f Fj(N)q(=)m(N)5 b(B)s(LK)t Fl(\),)16 +b(the)f(letter)g Fj(R)h Fl(standing)g(for)g(`reduced'.)k(Lik)o(e)14 +b(the)i(Compressed)60 312 y(Sparse)21 b(Ro)o(w)f(format)f(w)o(e)h(need)g +(three)f(arra)o(ys.)33 b(A)20 b(rectangular)g(real)g(arra)o(y)g +Fj(A)p Fl(\(1)h(:)f Fj(N)5 b(N)g(Z)t(R;)j Fl(1)21 b(:)60 372 +y Fj(N)5 b(B)s(LK)q(;)j Fl(1)24 b(:)e Fj(N)5 b(B)s(LK)t Fl(\))22 +b(con)o(tains)g(the)f(nonzero)h(blo)q(c)o(ks)g(listed)e(\(blo)q(c)o(k\)-ro)o +(w-wise.)38 b(Asso)q(ciated)60 432 y(with)18 b(this)f(real)g(arra)o(y)h(is)g +(an)g(in)o(teger)e(arra)o(y)i Fj(J)5 b(A)p Fl(\(1)16 b(:)g +Fj(N)5 b(N)g(Z)t(R)p Fl(\))18 b(whic)o(h)f(holds)h(the)g(actual)g(column)60 +493 y(p)q(ositions)e(in)f(the)f(original)h(matrix)f(of)h(the)g(\(1)p +Fj(;)8 b Fl(1\))15 b(elemen)o(ts)e(of)i(the)g(nonzero)g(blo)q(c)o(ks.)21 +b(Finally)l(,)13 b(the)60 553 y(p)q(oin)o(ter)j(arra)o(y)g +Fj(I)t(A)p Fl(\(1)e(:)f Fj(N)5 b(R)12 b Fl(+)f(1\))16 b(p)q(oin)o(ts)h(to)g +(the)f(b)q(eginning)g(of)h(eac)o(h)e(blo)q(c)o(k)h(ro)o(w)h(in)f +Fj(A)f Fl(and)i Fj(J)5 b(A)p Fl(.)120 613 y(The)18 b(sa)o(vings)h(in)f +(memory)e(and)j(in)f(the)g(use)h(of)g(indirect)e(addressing)i(with)f(this)h +(sc)o(heme)d(o)o(v)o(er)60 673 y(Compressed)g(Sparse)g(Ro)o(w)h(can)f(b)q(e)g +(substan)o(tial)h(for)f(large)h(v)m(alues)f(of)g Fj(N)5 b(B)s(LK)t +Fl(.)60 803 y Fh(2.1.7)55 b(The)19 b(Symme)o(tric)c(Skyline)i(format)g +(\(SSK\))60 895 y Fl(A)h(skyline)f(matrix)g(is)h(often)h(referred)f(to)g(as)i +(a)f(v)m(ariable)f(band)h(matrix)e(or)i(a)g(pro\014le)f(matrix)f([3].)60 +956 y(The)f(main)e(attraction)j(of)f(skyline)e(matrices)g(is)i(that)g(when)g +(piv)o(oting)f(is)h(not)g(necessary)g(then)f(the)60 1016 y(skyline)h +(structure)g(of)i(the)f(matrix)e(is)i(preserv)o(ed)f(during)h(Gaussian)h +(elimination.)j(If)c(the)g(matrix)60 1076 y(is)22 b(symmetri)o(c)d(w)o(e)i +(only)h(need)g(to)g(store)g(its)g(lo)o(w)o(er)f(triangular)h(part.)39 +b(This)22 b(is)g(a)g(collection)f(of)60 1136 y(ro)o(ws)d(whose)h(length)f(v)m +(aries.)26 b(A)18 b(simple)e(metho)q(d)h(used)h(to)h(store)f(a)g(Symmetric)c +(Skyline)j(matrix)60 1196 y(is)24 b(to)h(place)e(all)h(the)g(ro)o(ws)h(in)f +(order)g(from)g(1)g(to)h Fj(N)30 b Fl(in)23 b(a)i(real)f(arra)o(y)g +Fj(A)g Fl(and)h(then)f(k)o(eep)g(an)60 1257 y(in)o(teger)13 +b(arra)o(y)i(whic)o(h)e(holds)i(the)f(p)q(oin)o(ters)h(to)f(the)g(b)q +(eginning)h(of)g(eac)o(h)f(ro)o(w,)g(see)g([2].)20 b(The)15 +b(column)60 1317 y(p)q(ositions)21 b(of)f(the)g(nonzero)g(elemen)o(ts)d +(stored)k(in)e Fj(A)h Fl(can)g(easily)f(b)q(e)i(deriv)o(ed)d(and)j(are)f +(therefore)60 1377 y(not)h(needed.)35 b(Ho)o(w)o(ev)o(er,)19 +b(there)h(are)h(sev)o(eral)f(v)m(ariations)h(to)h(this)e(sc)o(heme)f(that)i +(are)g(commonly)60 1437 y(used)e(is)g(commercial)d(soft)o(w)o(are)j(pac)o(k)m +(ages.)31 b(F)l(or)19 b(example,)e(w)o(e)i(found)h(that)f(in)g(man)o(y)f +(instances)60 1497 y(the)h(p)q(oin)o(ter)g(is)h(to)f(the)h(diagonal)g(elemen) +o(t)c(rather)k(than)g(to)g(the)f(\014rst)h(elemen)o(t)c(in)j(the)g(ro)o(w.)31 +b(In)60 1558 y(some)17 b(cases)i(\(e.g.,)e(IBM's)g(ISSL)h(library\))g(b)q +(oth)h(are)f(supp)q(orted.)28 b(Giv)o(en)17 b(that)i(these)e(v)m(ariations)60 +1618 y(are)f(commonly)e(used)i(it)g(is)g(a)h(go)q(o)q(d)h(idea)e(to)g(pro)o +(vide)g(at)g(least)g(a)h(few)f(of)h(them.)60 1748 y Fh(2.1.8)55 +b(The)19 b(Non)f(Symmetri)o(c)e(Skyline)h(format)g(\(NSK\))60 +1840 y Fl(Conceptually)l(,)e(the)h(data)h(structure)f(of)g(a)h(nonsymmetric)c +(skyline)i(matrix)f(consists)j(of)f(t)o(w)o(o)g(sub-)60 1900 +y(structures.)32 b(The)20 b(\014rst)h(consists)f(of)g(the)g(lo)o(w)o(er)f +(part)i(of)f Fj(A)g Fl(stored)g(in)g(skyline)e(format)i(and)g(the)60 +1960 y(second)d(of)f(its)h(upp)q(er)f(triangular)h(part)g(stored)g(in)f(a)h +(column)e(orien)o(ted)g(skyline)g(format)h(\(i.e.,)e(the)60 +2021 y(transp)q(ose)20 b(is)e(stored)g(in)g(standard)i(ro)o(w)e(skyline)f(mo) +q(de\).)26 b(Sev)o(eral)17 b(w)o(a)o(ys)h(of)h(putting)f(these)g(sub-)60 +2081 y(structures)e(together)h(ma)o(y)d(b)q(e)j(used)f(and)h(there)e(are)i +(no)f(comp)q(elling)f(reasons)i(for)f(preferring)g(one)60 2141 +y(strategy)g(o)o(v)o(er)f(another)h(one.)21 b(One)15 b(p)q(ossibilit)o(y)g +(is)g(to)h(use)g(t)o(w)o(o)f(separate)h(arra)o(ys)g Fj(AL)f +Fl(and)h Fj(AU)21 b Fl(for)60 2201 y(the)14 b(lo)o(w)o(er)g(part)g(and)h(upp) +q(er)g(part)g(resp)q(ectiv)o(ely)l(,)c(with)k(the)f(diagonal)h(elemen)o(t)c +(in)j(the)g(upp)q(er)h(part.)60 2261 y(The)h(data)h(structures)g(for)f(eac)o +(h)g(of)g(t)o(w)o(o)g(parts)h(is)f(similar)f(to)h(that)h(used)f(for)h(the)f +(SSK)g(storage.)60 2391 y Fh(2.1.9)55 b(The)19 b(link)n(ed)e(list)h(storage)g +(format)g(\(LNK\))60 2484 y Fl(This)13 b(is)g(one)h(of)f(the)g(oldest)h(data) +g(structures)f(used)g(for)h(sparse)g(matrix)d(computations.)20 +b(It)13 b(consists)60 2544 y(of)k(four)g(arra)o(ys:)k Fj(A)p +Fl(,)16 b Fj(J)5 b(C)t(O)q(L)p Fl(,)16 b Fj(LI)t(N)5 b(K)20 +b Fl(and)d Fj(J)5 b(S)s(T)i(ART)g Fl(.)20 b(The)d(arra)o(ys)g +Fj(A)f Fl(and)h Fj(J)5 b(C)t(O)q(L)16 b Fl(con)o(tain)g(the)60 +2604 y(nonzero)d(elemen)o(ts)e(and)i(their)g(corresp)q(onding)h(column)d +(indices)h(resp)q(ectiv)o(ely)l(.)18 b(The)13 b(in)o(teger)f(arra)o(y)60 +2664 y Fj(LI)t(N)5 b(K)19 b Fl(is)c(the)g(usual)g(link)f(p)q(oin)o(ter)h +(arra)o(y)g(in)g(link)o(ed)e(list)i(data)h(structures:)k Fj(LI)t(N)5 +b(K)t Fl(\()p Fj(k)r Fl(\))15 b(p)q(oin)o(ts)h(to)p eop +%%Page: 9 9 +9 8 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1589 w Fl(9)60 +132 y(the)15 b(p)q(osition)h(of)g(the)f(nonzero)h(elemen)o(t)d(next)i(to)h +Fj(A)p Fl(\()p Fj(k)r Fl(\))p Fj(;)8 b(J)d(C)t(O)q(L)p Fl(\()p +Fj(k)r Fl(\))14 b(in)i(the)f(same)f(ro)o(w.)21 b(Note)16 b(that)60 +192 y(the)d(order)h(of)g(the)g(elemen)o(ts)c(within)k(eac)o(h)f(ro)o(w)h(is)f +(unimp)q(ortan)o(t.)20 b(If)13 b Fj(LI)t(N)5 b(K)t Fl(\()p +Fj(k)r Fl(\))14 b(=)g(0)g(then)f(there)g(is)60 252 y(no)18 +b(next)e(elemen)o(t,)e(i.e.,)h Fj(A)p Fl(\()p Fj(k)r Fl(\))p +Fj(;)8 b(J)d(C)t(O)q(L)p Fl(\()p Fj(k)r Fl(\))17 b(is)g(the)g(last)g(elemen)o +(t)d(of)j(the)g(ro)o(w.)24 b(Finally)l(,)16 b Fj(I)t(S)s(T)7 +b(ART)60 312 y Fl(p)q(oin)o(ts)15 b(to)g(the)f(\014rst)h(elemen)o(t)c(of)k +(eac)o(h)f(ro)o(w)h(in)f(in)h(the)f(previous)g(arra)o(ys.)21 +b(Th)o(us,)15 b Fj(k)h Fl(=)e Fj(I)t(S)s(T)7 b(ART)g Fl(\(1\))60 +372 y(p)q(oin)o(ts)23 b(to)g(the)g(\014rst)g(elemen)o(t)d(of)j(the)f(\014rst) +h(ro)o(w,)h(in)f Fj(A;)8 b(I)t(C)t(O)q(L)p Fl(,)23 b Fj(I)t(S)s(T)7 +b(ART)g Fl(\(2\))21 b(to)i(the)g(second)60 432 y(elemen)o(t,)13 +b(etc..)20 b(As)c(a)h(con)o(v)o(en)o(tion)d Fj(I)t(S)s(T)7 +b(ART)g Fl(\()p Fj(i)p Fl(\))12 b(=)i(0,)i(means)f(that)i(the)f +Fj(i)p Fl(-th)g(ro)o(w)h(is)f(empt)o(y)l(.)60 562 y Fh(2.1.10)55 +b(The)19 b(Jagged)f(Diagonal)h(format)e(\(JAD\))60 655 y Fl(This)j(storage)g +(mo)q(de)e(is)i(v)o(ery)e(useful)h(for)g(the)h(e\016cien)o(t)d(implem)o(en)o +(tati)o(on)g(of)j(iterativ)o(e)e(metho)q(ds)60 715 y(on)f(parallel)f(and)h(v) +o(ector)e(pro)q(cessors)j([9].)j(Starting)c(from)e(the)h(CSR)h(format,)e(the) +i(idea)f(is)g(to)h(\014rst)60 775 y(reorder)11 b(the)h(ro)o(ws)g(of)g(the)f +(matrix)f(decreasingly)g(according)i(to)g(their)f(n)o(um)o(b)q(er)f(of)i +(nonzeros)g(en)o(tries.)60 835 y(Then,)k(a)g(new)g(data)h(structure)e(is)h +(built)f(b)o(y)h(constructing)g(what)h(w)o(e)e(call)g(\\jagged)i(diagonals")h +(\(j-)60 895 y(diagonals\).)24 b(W)l(e)16 b(store)h(as)g(a)g(dense)g(v)o +(ector,)e(the)h(v)o(ector)g(consisting)h(of)g(all)f(the)h(\014rst)g(elemen)n +(ts)d(in)60 956 y Fj(A;)8 b(J)d(A)12 b Fl(from)h(eac)o(h)h(ro)o(w,)g +(together)g(with)g(an)g(in)o(teger)f(v)o(ector)g(con)o(taining)h(the)g +(column)e(p)q(ositions)j(of)60 1016 y(the)f(corresp)q(onding)h(elemen)o(ts.)i +(This)d(is)g(follo)o(w)o(ed)f(b)o(y)g(the)h(second)g(jagged)h(diagonal)g +(consisting)f(of)60 1076 y(the)i(elemen)o(ts)d(in)j(the)g(second)g(p)q +(ositions)h(from)e(the)h(left.)k(As)c(w)o(e)g(build)g(more)e(and)j(more)e(of) +h(these)60 1136 y(diagonals,)i(their)f(length)g(decreases.)25 +b(The)17 b(n)o(um)o(b)q(er)f(of)i(j-diagonals)h(is)e(equal)g(to)h(the)f(n)o +(um)o(b)q(er)f(of)60 1196 y(nonzero)d(elemen)o(ts)d(of)j(the)f(\014rst)h(ro)o +(w,)h(i.e.,)d(to)i(the)g(largest)f(n)o(um)o(b)q(er)f(of)i(nonzero)g(elemen)o +(ts)d(p)q(er)j(ro)o(w.)60 1257 y(The)j(data)h(structure)e(to)h(represen)o(t)f +(a)i(general)e(matrix)f(in)i(this)g(form)f(consists,)h(b)q(efore)f(an)o +(ything,)60 1317 y(of)g(the)g(p)q(erm)o(utation)e(arra)o(y)i(whic)o(h)f +(reorders)h(the)f(ro)o(ws.)22 b(Then)15 b(the)f(real)g(arra)o(y)h +Fj(A)g Fl(con)o(taining)f(the)60 1377 y(jagged)j(diagonals)h(in)e(succession) +g(and)h(the)f(arra)o(y)h Fj(J)5 b(A)15 b Fl(of)i(the)f(corresp)q(onding)h +(column)e(p)q(ositions)60 1437 y(are)e(stored,)g(together)f(with)h(a)g(p)q +(oin)o(ter)f(arra)o(y)h Fj(I)t(A)e Fl(whic)o(h)h(p)q(oin)o(ts)h(to)g(the)f(b) +q(eginning)h(of)g(eac)o(h)f(jagged)60 1497 y(diagonal)18 b(in)g(the)f(arra)o +(ys)h Fj(A;)8 b(J)d(A)p Fl(.)24 b(The)17 b(adv)m(an)o(tage)i(of)f(this)f(sc)o +(heme)e(for)j(matrix)e(m)o(ultiplic)o(ations)60 1558 y(has)h(b)q(een)f +(illustrated)f(in)h([9])g(and)h(in)f([1])g(in)f(the)h(con)o(text)g(of)g +(triangular)h(system)e(solutions.)60 1687 y Fh(2.1.11)55 b(The)15 +b(Symmetr)o(ic)d(and)k(Unsymme)o(tric)c(Sparse)j(Skyline)e(format)h(\(SSS,)h +(USS\))60 1780 y Fl(This)f(is)g(an)h(extension)f(of)h(the)f(CSR-t)o(yp)q(e)g +(format)f(describ)q(ed)h(ab)q(o)o(v)o(e.)21 b(In)14 b(the)g(symmetri)o(c)d(v) +o(ersion,)60 1840 y(the)i(follo)o(wing)f(arra)o(ys)h(are)g(used:)20 +b Fj(D)q(I)t(AG)13 b Fl(stores)g(the)g(diagonal,)h Fj(AL;)8 +b(J)d(AL;)j(I)t(AL)j Fl(stores)i(the)g(strict)60 1900 y(lo)o(w)o(er)19 +b(part)i(in)f(CSR)g(format,)g(and)g Fj(AU)25 b Fl(stores)c(the)f(v)m(alues)g +(of)g(the)g(strict)g(upp)q(er)g(part)h(in)e(CSC)60 1960 y(format.)h(In)14 +b(the)g(unsymmetric)c(v)o(ersion,)k(instead)g(of)h Fj(AU)k +Fl(alone,)c(the)f(strict)f(upp)q(er)i(part)g(is)f(stored)60 +2021 y(in)i Fj(AU;)8 b(J)d(AU;)j(I)t(AU)19 b Fl(in)d(CSC)g(format.)60 +2151 y Fh(2.1.12)55 b(The)19 b(V)-5 b(ariable)18 b(Blo)r(c)n(k)g(Ro)n(w)h +(format)f(\(VBR\))60 2243 y Fl(In)i(man)o(y)f(applications,)i(matrices)e(are) +i(blo)q(c)o(k)o(ed,)f(but)g(the)h(blo)q(c)o(ks)f(are)h(not)g(all)f(the)g +(same)f(size.)60 2303 y(These)13 b(so-called)h(v)m(ariable)f(blo)q(c)o(k)g +(matrices)e(arise)j(from)e(the)h(discretization)f(of)i(systems)e(of)i +(partial)60 2363 y(di\013eren)o(tial)j(equations)h(where)g(there)f(is)h(a)g +(v)m(arying)h(n)o(um)o(b)q(er)d(of)i(equations)g(at)h(eac)o(h)e(grid)h(p)q +(oin)o(t.)60 2423 y(Lik)o(e)d(in)g(the)g(Blo)q(c)o(k)f(Sparse)i(Ro)o(w)g +(\(BSR\))e(format,)h(all)g(en)o(tries)f(of)i(nonzero)f(blo)q(c)o(ks)h(\(blo)q +(c)o(ks)f(whic)o(h)60 2484 y(con)o(tain)i(an)o(y)g(nonzeros\))g(are)g +(stored,)g(ev)o(en)f(if)g(their)h(v)m(alue)f(is)h(zero.)23 +b(Also)17 b(lik)o(e)e(the)i(BSR)f(format,)60 2544 y(there)g(is)g +(signi\014can)o(t)g(sa)o(vings)g(in)g(in)o(teger)f(p)q(oin)o(ter)h(o)o(v)o +(erhead)g(in)g(the)g(data)h(structure.)120 2604 y(V)l(ariable)j(blo)q(c)o(k)h +(generalizations)f(can)i(b)q(e)f(made)f(to)h(man)o(y)f(matrix)f(storage)j +(formats.)35 b(The)60 2664 y(V)l(ariable)19 b(Blo)q(c)o(k)f(Ro)o(w)i(\(VBR\)) +e(format)h(is)h(a)g(generalization)f(of)h(the)f(Compressed)g(Sparse)h(Ro)o(w) +p eop +%%Page: 10 10 +10 9 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(10)60 +132 y(\(CSR\))23 b(format,)f(and)i(is)e(similar)e(to)j(the)f(v)m(ariable)g +(blo)q(c)o(k)g(format)g(used)h(at)g(the)f(Univ)o(ersit)o(y)e(of)60 +192 y(W)l(aterlo)q(o,)d(and)f(one)h(curren)o(tly)d(prop)q(osed)k(in)e(the)g +(Sparse)h(BLAS)f(to)q(olkit.)120 252 y(In)22 b(the)g(VBR)f(format,)h(the)g +Fj(I)t(A)f Fl(and)i Fj(J)5 b(A)21 b Fl(arra)o(ys)i(of)f(the)g(CSR)g(format)g +(store)g(the)g(sparsit)o(y)60 312 y(structure)14 b(of)h(the)f(blo)q(c)o(ks.) +20 b(The)15 b(en)o(tries)e(in)h(eac)o(h)g(blo)q(c)o(k)g(are)h(stored)f(in)h +Fj(A)f Fl(in)g(column-ma)s(jor)e(order)60 372 y(so)i(that)g(eac)o(h)g(blo)q +(c)o(k)f(ma)o(y)f(b)q(e)i(passed)g(as)g(a)h(small)d(dense)h(matrix)f(to)i(a)g +(F)l(ortran)g(subprogram.)21 b(The)60 432 y(blo)q(c)o(k)12 +b(ro)o(w)h(and)h(blo)q(c)o(k)e(column)f(partitionings)i(are)g(stored)g(in)f +(the)h(v)o(ectors)f Fq(KVSTR)h Fl(and)h Fq(KVSTC)p Fl(,)60 +493 y(b)o(y)i(storing)h(the)f(\014rst)g(ro)o(w)h(or)f(column)f(n)o(um)o(b)q +(er)g(of)h(eac)o(h)g(blo)q(c)o(k)g(ro)o(w)g(or)h(column)e(resp)q(ectiv)o(ely) +l(.)j(In)60 553 y(most)g(applications,)i(the)f(blo)q(c)o(k)f(ro)o(w)h(and)h +(column)e(partitionings)h(will)f(b)q(e)h(conformal,)g(and)g(the)60 +613 y(same)e(arra)o(y)g(ma)o(y)f(b)q(e)i(used)g(in)f(the)h(programs.)25 +b(Finally)l(,)16 b(in)o(teger)h(p)q(oin)o(ters)g(to)h(the)g(b)q(eginning)g +(of)60 673 y(eac)o(h)e(blo)q(c)o(k)f(in)h Fj(A)g Fl(are)g(stored)h(in)f(the)g +(arra)o(y)g Fj(K)t(A)p Fl(.)120 733 y Fj(I)t(A)i Fl(con)o(tains)h(p)q(oin)o +(ters)h(to)f(the)g(b)q(eginning)h(of)f(eac)o(h)g(blo)q(c)o(k)f(ro)o(w)i(in)f +Fj(J)5 b(A)18 b Fl(and)i Fj(K)t(A)p Fl(.)30 b(Th)o(us)19 b +Fj(I)t(A)60 794 y Fl(has)d(length)g(equal)f(to)h(the)f(n)o(um)o(b)q(er)f(of)i +(blo)q(c)o(k)f(ro)o(ws)h(\(plus)g(one)g(to)g(mark)e(the)h(end)h(of)g(the)f +(matrix\),)60 854 y(and)i Fj(J)5 b(A)16 b Fl(has)h(length)g(equal)f(to)h(the) +f(n)o(um)o(b)q(er)f(of)i(nonzero)g(blo)q(c)o(ks.)22 b Fj(K)t(A)17 +b Fl(has)g(the)f(same)g(length)g(as)60 914 y Fj(J)5 b(A)19 +b Fl(plus)h(one)g(to)g(mark)e(the)i(end)g(of)g(the)f(matrix.)31 +b Fq(KVSTR)20 b Fl(and)g Fq(KVSTC)h Fl(ha)o(v)o(e)e(length)h(equal)60 +974 y(to)f(the)g(n)o(um)o(b)q(er)e(of)j(blo)q(c)o(k)e(ro)o(ws)i(and)f +(columns)f(resp)q(ectiv)o(ely)l(,)f(and)i Fj(A)g Fl(has)h(length)e(equal)h +(to)g(the)60 1034 y(n)o(um)o(b)q(er)c(of)i(nonzeros)g(in)f(the)h(matrix.)j +(The)d(follo)o(wing)f(\014gure)h(sho)o(ws)h(the)e(VBR)g(format)g(applied)60 +1095 y(to)h(a)f(small)f(matrix.)120 1155 y(This)e(v)o(ersion)f(of)h(Sparskit) +g(has)g(a)g(n)o(um)o(b)q(er)e(of)i(routines)g(to)g(supp)q(ort)h(the)e(v)m +(ariable)h(blo)q(c)o(k)f(matrix)60 1215 y(format.)19 b(CSR)-5 +b(VBR)10 b(and)j(VBR)o(CSR)d(con)o(v)o(ert)g(b)q(et)o(w)o(een)h(the)h(VBR)e +(and)i(CSR)g(formats;)g(VBRINF)o(O)60 1275 y(prin)o(ts)f(some)f(elemen)o +(tary)e(information)i(ab)q(out)i(the)f(blo)q(c)o(k)f(structure)h(of)h(a)f +(matrix)e(in)i(VBR)f(format;)60 1335 y(AMUXV)j(p)q(erforms)h(a)i(matrix-v)o +(ector)d(pro)q(duct)i(with)g(a)h(matrix)d(in)i(VBR)f(format;)g(CSRKVSTR)60 +1396 y(and)i(CSRKVSTC)f(are)g(used)g(to)h(determine)c(ro)o(w)k(and)f(column)f +(blo)q(c)o(k)g(partitionings)i(of)f(a)h(matrix)60 1456 y(in)f(CSR)g(format,)f +(and)h(KVSTMER)o(GE)g(is)g(used)g(to)g(com)o(bine)e(ro)o(w)i(and)h(column)d +(partitionings)j(to)60 1516 y(ac)o(hiev)o(e)e(a)j(conformal)e(partitioning.) +60 1660 y Fi(2.2)70 b(The)22 b(F)n(ORMA)-6 b(TS)23 b(con)n(v)n(ersion)g(mo)r +(dule)60 1753 y Fl(It)16 b(is)h(imp)q(ortan)o(t)f(to)h(note)g(that)g(there)f +(is)h(no)g(need)g(to)g(ha)o(v)o(e)f(a)h(subroutine)g(for)g(eac)o(h)f(pair)h +(of)g(data)60 1813 y(structures,)i(since)f(all)h(w)o(e)f(need)h(is)g(to)g(b)q +(e)g(able)g(to)g(con)o(v)o(ert)f(an)o(y)h(format)f(to)i(the)e(standard)j(ro)o +(w-)60 1873 y(compressed)15 b(format)g(and)h(then)g(bac)o(k)f(to)h(an)o(y)g +(other)g(format.)21 b(There)15 b(are)h(curren)o(tly)e(32)j(di\013eren)o(t)60 +1933 y(con)o(v)o(ersion)e(routines)g(in)g(this)h(mo)q(dule)e(all)h(of)h(whic) +o(h)f(are)g(dev)o(oted)g(to)h(con)o(v)o(erting)e(from)g(one)i(data)60 +1993 y(structure)g(in)o(to)g(another.)120 2054 y(The)k(naming)g(mec)o(hanism) +d(adopted)k(is)f(to)h(use)f(a)h(6-c)o(haracter)g(name)e(for)i(eac)o(h)e(of)i +(the)f(sub-)60 2114 y(routines,)h(the)f(\014rst)g(3)h(for)f(the)g(input)g +(format)g(and)g(the)g(last)h(3)f(for)h(the)f(output)g(format.)33 +b(Th)o(us)60 2174 y(COOCSR)13 b(p)q(erforms)f(the)g(con)o(v)o(ersion)f(from)h +(the)g(co)q(ordinate)h(format)f(to)h(the)f(Compressed)g(Sparse)60 +2234 y(Ro)o(w)17 b(format.)24 b(Ho)o(w)o(ev)o(er)15 b(it)i(w)o(as)h +(necessary)f(to)g(break)g(the)g(naming)g(rule)f(in)h(one)g(exception.)23 +b(W)l(e)60 2294 y(needed)13 b(a)i(v)o(ersion)e(of)i(COOCSR)f(that)h(is)e +(in-place,)h(i.e.,)e(whic)o(h)i(can)g(tak)o(e)f(the)h(input)g(matrix,)e(and) +60 2355 y(con)o(v)o(ert)17 b(it)h(directly)f(in)o(to)h(a)h(CSR)g(format)f(b)o +(y)g(using)h(v)o(ery)e(little)g(additional)h(w)o(ork)h(space.)28 +b(This)60 2415 y(routine)16 b(is)g(called)f(COICSR.)h(Eac)o(h)g(of)g(the)g +(formats)g(has)g(a)h(routine)f(to)g(translate)h(it)e(to)i(the)f(CSR)60 +2475 y(format)i(and)i(a)f(routine)f(to)i(con)o(v)o(ert)d(bac)o(k)i(to)g(it)f +(from)g(the)g(CSR)h(format.)29 b(The)19 b(only)f(exception)60 +2535 y(is)i(that)h(a)g(CSCCSR)g(routine)f(is)g(not)h(necessary)f(since)g(the) +g(con)o(v)o(ersion)g(from)f(Column)h(Sparse)60 2595 y(format)d(to)i(Sparse)g +(Ro)o(w)f(format)f(can)i(b)q(e)f(p)q(erformed)f(with)h(the)g(same)f(routine)h +(CSR)o(CSC.)g(This)60 2656 y(is)e(essen)o(tially)f(a)h(transp)q(osition)i(op) +q(eration.)p eop +%%Page: 11 11 +11 10 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(11)60 +90 y + 29364963 25841160 0 0 26510049 23352524 startTexFig + 60 90 a +%%BeginDocument: vbrpic.eps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /tmp/xfig-fig009549 +%%Creator: fig2dev +%%CreationDate: Sun May 1 19:21:40 1994 +%%For: chow@mega (Edmond Chow,EE/CS 6-210,626-0071,625-3031) +%%BoundingBox: 0 0 403 355 +%%Pages: 0 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/l {lineto} bind def +/m {moveto} bind def +/s {stroke} bind def +/n {newpath} bind def +/gs {gsave} bind def +/gr {grestore} bind def +/clp {closepath} bind def +/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul +4 -2 roll mul setrgbcolor} bind def +/col-1 {} def +/col0 {0 0 0 setrgbcolor} bind def +/col1 {0 0 1 setrgbcolor} bind def +/col2 {0 1 0 setrgbcolor} bind def +/col3 {0 1 1 setrgbcolor} bind def +/col4 {1 0 0 setrgbcolor} bind def +/col5 {1 0 1 setrgbcolor} bind def +/col6 {1 1 0 setrgbcolor} bind def +/col7 {1 1 1 setrgbcolor} bind def + end +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +0 setlinecap 0 setlinejoin +-58.0 414.0 translate 0.900 -0.900 scale +0.500 setlinewidth +% Polyline +n 99 439 m 479 439 l 479 459 l 99 459 l 99 439 l clp gs col-1 s gr +% Polyline +n 119 439 m 119 459 l gs col-1 s gr +% Polyline +n 139 439 m 139 459 l gs col-1 s gr +% Polyline +n 159 439 m 159 459 l gs col-1 s gr +% Polyline +n 179 439 m 179 459 l gs col-1 s gr +% Polyline +n 199 439 m 199 459 l gs col-1 s gr +% Polyline +n 219 439 m 219 459 l gs col-1 s gr +% Polyline +n 239 439 m 239 459 l gs col-1 s gr +% Polyline +n 259 439 m 259 459 l gs col-1 s gr +n 279 439 m 279 439 l gs col-1 s gr +% Polyline +n 279 439 m 279 459 l gs col-1 s gr +% Polyline +n 299 439 m 299 459 l gs col-1 s gr +% Polyline +n 319 439 m 319 459 l gs col-1 s gr +% Polyline +n 339 439 m 339 459 l gs col-1 s gr +% Polyline +n 359 439 m 359 459 l gs col-1 s gr +% Polyline +n 379 439 m 379 459 l gs col-1 s gr +% Polyline +n 399 439 m 399 459 l gs col-1 s gr +% Polyline +n 419 439 m 419 459 l gs col-1 s gr +% Polyline +n 459 439 m 459 459 l gs col-1 s gr +/Times-Roman findfont 12.00 scalefont setfont +104 434 m +gs 1 -1 scale ( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +69 454 m +gs 1 -1 scale (A) col-1 show gr +% Polyline +n 399 79 m 499 79 l 499 99 l 399 99 l 399 79 l clp gs col-1 s gr +% Polyline +n 419 79 m 419 99 l gs col-1 s gr +% Polyline +n 439 79 m 439 99 l gs col-1 s gr +% Polyline +n 459 79 m 459 99 l gs col-1 s gr +% Polyline +n 479 79 m 479 99 l gs col-1 s gr +/Times-Roman findfont 12.00 scalefont setfont +404 74 m +gs 1 -1 scale ( 1 2 3 4 5) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +339 94 m +gs 1 -1 scale (KVSTC) col-1 show gr +% Polyline +n 199 79 m 279 79 l 279 99 l 199 99 l 199 79 l clp gs col-1 s gr +% Polyline +n 219 79 m 219 99 l gs col-1 s gr +% Polyline +n 239 79 m 239 99 l gs col-1 s gr +% Polyline +n 259 79 m 259 99 l gs col-1 s gr +/Times-Roman findfont 12.00 scalefont setfont +209 94 m +gs 1 -1 scale (1 3 4 7) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +204 74 m +gs 1 -1 scale ( 1 2 3 4) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +139 94 m +gs 1 -1 scale (KVSTR) col-1 show gr +% Polyline +n 99 219 m 179 219 l 179 239 l 99 239 l 99 219 l clp gs col-1 s gr +% Polyline +n 99 279 m 219 279 l 219 299 l 99 299 l 99 279 l clp gs col-1 s gr +% Polyline +n 99 339 m 239 339 l 239 359 l 99 359 l 99 339 l clp gs col-1 s gr +% Polyline +n 119 219 m 119 239 l gs col-1 s gr +% Polyline +n 139 219 m 139 239 l gs col-1 s gr +% Polyline +n 159 219 m 159 239 l gs col-1 s gr +% Polyline +n 119 279 m 119 299 l gs col-1 s gr +% Polyline +n 139 279 m 139 299 l gs col-1 s gr +% Polyline +n 159 279 m 159 299 l gs col-1 s gr +% Polyline +n 179 279 m 179 299 l gs col-1 s gr +% Polyline +n 199 279 m 199 299 l gs col-1 s gr +% Polyline +n 119 339 m 119 359 l gs col-1 s gr +% Polyline +n 139 339 m 139 359 l gs col-1 s gr +% Polyline +n 159 339 m 159 359 l gs col-1 s gr +% Polyline +n 179 339 m 179 359 l gs col-1 s gr +% Polyline +n 199 339 m 199 359 l gs col-1 s gr +% Polyline +n 219 339 m 219 359 l gs col-1 s gr +% Polyline +n 109 239 m 109 259 l gs col-1 s gr +n 111.000 251.000 m 109.000 259.000 l 107.000 251.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 124 239 m 144 259 l gs col-1 s gr +n 139.757 251.929 m 144.000 259.000 l 136.929 254.757 l gs 2 setlinejoin col-1 s gr +% Polyline +n 149 239 m 184 259 l gs col-1 s gr +n 178.046 253.294 m 184.000 259.000 l 176.062 256.767 l gs 2 setlinejoin col-1 s gr +% Polyline +n 169 239 m 224 259 l gs col-1 s gr +n 217.165 254.386 m 224.000 259.000 l 215.798 258.146 l gs 2 setlinejoin col-1 s gr +% Polyline +n 439 439 m 439 459 l gs col-1 s gr +% Polyline +n 109 359 m 109 419 l gs col-1 s gr +n 111.000 411.000 m 109.000 419.000 l 107.000 411.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 129 359 m 184 419 l gs col-1 s gr +n 180.069 411.751 m 184.000 419.000 l 177.120 414.454 l gs 2 setlinejoin col-1 s gr +% Polyline +n 144 359 m 224 419 l gs col-1 s gr +n 218.800 412.600 m 224.000 419.000 l 216.400 415.800 l gs 2 setlinejoin col-1 s gr +% Polyline +n 169 359 m 279 419 l gs col-1 s gr +n 272.935 413.413 m 279.000 419.000 l 271.019 416.925 l gs 2 setlinejoin col-1 s gr +% Polyline +n 189 359 m 299 419 l gs col-1 s gr +n 292.935 413.413 m 299.000 419.000 l 291.019 416.925 l gs 2 setlinejoin col-1 s gr +% Polyline +n 209 359 m 364 419 l gs col-1 s gr +n 357.261 414.247 m 364.000 419.000 l 355.817 417.977 l gs 2 setlinejoin col-1 s gr +% Polyline +n 229 359 m 484 419 l gs col-1 s gr +n 476.671 415.221 m 484.000 419.000 l 475.755 419.115 l gs 2 setlinejoin col-1 s gr +% Polyline +n 379 159 m 379 279 l gs col-1 s gr +% Polyline +n 439 159 m 439 279 l gs col-1 s gr +% Polyline +n 499 279 m 499 159 l 339 159 l 339 279 l clp gs col-1 s gr +% Polyline +n 459 159 m 459 279 l gs col-1 s gr +% Polyline +n 339 199 m 499 199 l gs col-1 s gr +% Polyline +n 339 219 m 499 219 l gs col-1 s gr +% Polyline +n 409 99 m 354 139 l gs col-1 s gr +n 361.646 135.912 m 354.000 139.000 l 359.294 132.677 l gs 2 setlinejoin col-1 s gr +% Polyline +n 429 99 m 389 139 l gs col-1 s gr +n 396.071 134.757 m 389.000 139.000 l 393.243 131.929 l gs 2 setlinejoin col-1 s gr +% Polyline +n 449 99 m 449 139 l gs col-1 s gr +n 451.000 131.000 m 449.000 139.000 l 447.000 131.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 469 99 m 469 139 l gs col-1 s gr +n 471.000 131.000 m 469.000 139.000 l 467.000 131.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 489 99 m 504 139 l gs col-1 s gr +n 503.064 130.807 m 504.000 139.000 l 499.318 132.212 l gs 2 setlinejoin col-1 s gr +% Polyline +n 269 99 m 319 284 l gs col-1 s gr +n 318.843 275.755 m 319.000 284.000 l 314.982 276.799 l gs 2 setlinejoin col-1 s gr +% Polyline +n 249 99 m 319 224 l gs col-1 s gr +n 316.836 216.043 m 319.000 224.000 l 313.346 217.997 l gs 2 setlinejoin col-1 s gr +% Polyline +n 224 99 m 319 204 l gs col-1 s gr +n 315.116 196.726 m 319.000 204.000 l 312.150 199.410 l gs 2 setlinejoin col-1 s gr +% Polyline +n 209 99 m 319 169 l gs col-1 s gr +n 313.324 163.018 m 319.000 169.000 l 311.177 166.392 l gs 2 setlinejoin col-1 s gr +/Times-Roman findfont 12.00 scalefont setfont +104 294 m +gs 1 -1 scale ( 1 3 2 3 3 4) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 354 m +gs 1 -1 scale ( 1 5 7 10 11 14 20) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 334 m +gs 1 -1 scale ( 1 2 3 4 5 6 7) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +69 234 m +gs 1 -1 scale (IA) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +69 294 m +gs 1 -1 scale (JA) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +64 354 m +gs 1 -1 scale (KA) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 234 m +gs 1 -1 scale ( 1 3 5 7) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 214 m +gs 1 -1 scale ( 1 2 3 4) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 274 m +gs 1 -1 scale ( 1 2 3 4 5 6) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +224 274 m +gs 1 -1 scale ( 7) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 454 m +gs 1 -1 scale ( 1 4 2 5 3 6 7 8 9 10 11 14 17 12 15 18 13 16 19) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +404 94 m +gs 1 -1 scale ( 1 3 6 7 9 ) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +344 174 m +gs 1 -1 scale ( 1 2 3) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +344 194 m +gs 1 -1 scale ( 4 5 6) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +384 214 m +gs 1 -1 scale ( 7 8 9 10) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +444 234 m +gs 1 -1 scale (11 12 13) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +444 254 m +gs 1 -1 scale (14 15 16) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +444 274 m +gs 1 -1 scale (17 18 19) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 174 m +gs 1 -1 scale (1) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 194 m +gs 1 -1 scale (2) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 214 m +gs 1 -1 scale (3) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 234 m +gs 1 -1 scale (4) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 254 m +gs 1 -1 scale (5) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 274 m +gs 1 -1 scale (6) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +344 154 m +gs 1 -1 scale ( 1 2 3 4 5 6 7 8) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 294 m +gs 1 -1 scale (7) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +494 154 m +gs 1 -1 scale ( 9) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +259 344 m +gs 1 -1 scale (IA also indexes into KA) col-1 show gr +$F2psEnd +%%EndDocument + + endTexFig + 394 1829 a Fl(Figure)16 b(2:)22 b(A)15 b(6)d Fg(\002)f Fl(8)16 +b(sparse)h(matrix)e(and)i(its)f(storage)h(v)o(ectors.)120 1963 +y(Considerable)h(e\013ort)h(has)g(b)q(een)g(put)f(at)h(attempting)e(to)i(mak) +o(e)d(the)i(con)o(v)o(ersion)g(routines)g(in-)60 2023 y(place,)12 +b(i.e.,)g(in)g(allo)o(wing)g(some)g(or)h(all)f(of)h(the)f(output)h(arra)o(ys) +g(to)g(b)q(e)g(the)f(same)g(as)h(the)g(input)f(arra)o(ys.)60 +2083 y(The)17 b(purp)q(ose)g(is)g(to)g(sa)o(v)o(e)f(storage)i(whenev)o(er)d +(p)q(ossible)i(without)g(sacri\014cing)g(p)q(erformance.)k(The)60 +2143 y(added)15 b(\015exibilit)o(y)d(can)i(b)q(e)h(v)o(ery)e(con)o(v)o(enien) +o(t)f(in)j(some)e(situations.)21 b(When)15 b(the)f(additional)g(co)q(ding)60 +2203 y(complexit)o(y)f(to)k(p)q(ermit)d(the)i(routine)h(to)f(b)q(e)h +(in-place)e(w)o(as)i(not)g(to)q(o)g(high)g(this)f(w)o(as)h(alw)o(a)o(ys)f +(done.)60 2264 y(If)c(the)h(subroutine)g(is)g(in-place)f(this)g(is)h(clearly) +e(indicated)h(in)h(the)f(do)q(cumen)o(tation.)20 b(As)12 b(men)o(tioned)60 +2324 y(ab)q(o)o(v)o(e,)i(w)o(e)h(found)g(it)f(necessary)h(in)f(one)h +(instance)f(to)h(pro)o(vide)f(b)q(oth)i(the)e(in-place)g(v)o(ersion)g(as)h(w) +o(ell)60 2384 y(as)22 b(the)f(regular)g(v)o(ersion:)30 b(COICSR)21 +b(is)g(an)g(in-place)g(v)o(ersion)f(of)i(the)e(COOCSR)i(routine.)35 +b(W)l(e)60 2444 y(w)o(ould)19 b(also)h(lik)o(e)d(to)i(add)h(that)f(other)g +(routines)g(that)h(a)o(v)o(oid)e(the)h(CSR)g(format)g(for)g(some)f(of)h(the) +60 2504 y(more)14 b(imp)q(ortan)o(t)h(data)i(structures)e(ma)o(y)f(ev)o(en)o +(tually)g(b)q(e)i(included.)j(F)l(or)d(no)o(w,)g(there)f(is)g(only)h(one)60 +2565 y(suc)o(h)g(routine)338 2547 y Fd(1)374 2565 y Fl(namely)l(,)e(COOELL.)p +60 2608 744 2 v 116 2639 a Fc(1)135 2654 y Fo(Con)o(tributed)g(b)o(y)g(E.)f +(Rothman)f(from)g(Cornell)h(Univ)o(ersit)o(y)m(.)p eop +%%Page: 12 12 +12 11 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(12)60 +132 y Fi(2.3)70 b(In)n(ternal)22 b(format)h(used)g(in)f(SP)-6 +b(ARSKIT)60 224 y Fl(Most)17 b(of)h(the)f(routines)g(in)f(SP)l(ARSKIT)h(use)g +(in)o(ternally)e(the)i(Compressed)f(Sparse)i(Ro)o(w)f(format.)60 +284 y(The)d(selection)e(of)i(the)g(CSR)g(mo)q(de)f(has)h(b)q(een)g(motiv)m +(ated)e(b)o(y)i(sev)o(eral)e(factors.)21 b(Simplicit)n(y)l(,)11 +b(gener-)60 344 y(alit)o(y)l(,)k(and)j(widespread)f(use)g(are)g(certainly)e +(the)i(most)f(imp)q(ortan)o(t)g(ones.)24 b(Ho)o(w)o(ev)o(er,)15 +b(it)h(has)i(often)60 404 y(b)q(een)f(argued)h(that)f(the)g(column)f(sc)o +(heme)e(ma)o(y)i(ha)o(v)o(e)g(b)q(een)h(a)g(b)q(etter)g(c)o(hoice.)23 +b(One)16 b(argumen)o(t)g(in)60 465 y(this)g(fa)o(v)o(or)f(is)h(that)g(v)o +(ector)f(mac)o(hines)f(usually)h(giv)o(e)g(a)h(b)q(etter)g(p)q(erformance)e +(for)i(suc)o(h)g(op)q(erations)60 525 y(as)f(matrix)e(v)o(ector)g(b)o(y)h(m)o +(ultipli)o(cations)e(for)j(matrices)d(stored)j(in)f(CSC)h(format.)k(In)14 +b(fact)h(for)f(paral-)60 585 y(lel)h(mac)o(hines)f(whic)o(h)h(ha)o(v)o(e)h(a) +g(lo)o(w)g(o)o(v)o(erhead)f(in)h(lo)q(op)h(sync)o(hronization)e(\(e.g.,)g +(the)h(Allian)o(ts\),)e(the)60 645 y(situation)h(is)g(rev)o(ersed,)e(see)h +([9])h(for)g(details.)20 b(F)l(or)15 b(almost)f(an)o(y)h(argumen)o(t)e(in)i +(fa)o(v)o(or)f(of)h(one)g(sc)o(heme)60 705 y(there)e(seems)e(to)j(b)q(e)f(an) +h(argumen)o(t)e(in)g(fa)o(v)o(or)h(of)h(the)f(other.)20 b(F)l(ortunately)l(,) +13 b(the)g(di\013erence)f(pro)o(vided)60 766 y(in)i(functionalit)o(y)g(is)g +(rather)h(minor.)k(F)l(or)c(example)e(the)h(subroutine)h(APLB)g(to)g(add)g(t) +o(w)o(o)g(matrices)60 826 y(in)h(CSR)h(format,)e(describ)q(ed)h(in)h(Section) +f(5.1,)g(can)h(actually)f(b)q(e)h(also)g(used)f(to)h(add)g(t)o(w)o(o)g +(matrices)60 886 y(in)f(CSC)h(format,)e(since)g(the)h(data)h(structures)f +(are)h(iden)o(tical.)i(Sev)o(eral)c(suc)o(h)h(subroutines)g(can)h(b)q(e)60 +946 y(used)h(for)f(b)q(oth)i(sc)o(hemes,)c(b)o(y)i(pretending)g(that)h(the)g +(input)f(matrices)e(are)j(stored)g(in)f(CSR)h(mo)q(de)60 1006 +y(whereas)f(in)e(fact)i(they)e(are)i(stored)f(in)g(CSC)h(mo)q(de.)60 +1173 y Fk(3)83 b(Manipulation)27 b(routines)60 1282 y Fl(The)16 +b(mo)q(dule)f(UNAR)l(Y)f(of)i(SP)l(ARSKIT)g(consists)g(of)g(a)h(n)o(um)o(b)q +(er)d(of)i(utilities)f(to)h(manipulate)e(and)60 1342 y(p)q(erform)i(basic)g +(op)q(erations)i(with)e(sparse)h(matrices.)j(The)d(follo)o(wing)f(sections)g +(giv)o(e)g(an)h(o)o(v)o(erview)60 1403 y(of)g(this)f(part)g(of)h(the)f(pac)o +(k)m(age.)60 1547 y Fi(3.1)70 b(Miscell)o(aneous)21 b(op)r(erations)i(with)f +(sparse)h(matrices)60 1639 y Fl(There)e(are)h(a)g(large)f(n)o(um)o(b)q(er)f +(of)i(non-algebraic)g(op)q(erations)g(that)g(are)g(commonly)c(used)k(when)60 +1700 y(w)o(orking)g(with)f(sparse)i(matrices.)36 b(A)21 b(t)o(ypical)g +(example)e(is)j(to)g(transform)g Fj(A)f Fl(in)o(to)g Fj(B)26 +b Fl(=)e Fj(P)7 b(AQ)60 1760 y Fl(where)16 b Fj(P)23 b Fl(and)16 +b Fj(Q)g Fl(are)g(t)o(w)o(o)g(p)q(erm)o(utation)e(matrices.)20 +b(Another)15 b(example)f(is)i(to)g(extract)f(the)h(lo)o(w)o(er)60 +1820 y(triangular)h(part)h(of)f Fj(A)f Fl(or)i(a)f(giv)o(en)f(diagonal)i +(from)d Fj(A)p Fl(.)23 b(Sev)o(eral)16 b(other)h(suc)o(h)f(`extraction')g(op) +q(era-)60 1880 y(tions)f(are)g(supplied)f(in)h(SP)l(ARSKIT.)f(Also)g(pro)o +(vided)h(is)f(the)h(transp)q(osition)h(function.)21 b(This)15 +b(ma)o(y)60 1940 y(seem)h(as)j(an)g(unnecessary)f(addition)g(since)g(the)g +(routine)f(CSR)o(CSC)i(already)f(do)q(es)h(p)q(erform)e(this)60 +2001 y(function)i(economically)l(.)26 b(Ho)o(w)o(ev)o(er,)18 +b(the)h(new)g(transp)q(osition)h(pro)o(vided)e(is)h(in-place,)f(in)h(that)g +(it)60 2061 y(ma)o(y)e(transp)q(ose)i(the)f(matrix)f(and)h(o)o(v)o(erwrite)f +(the)h(result)g(on)g(the)g(original)g(matrix,)f(th)o(us)h(sa)o(ving)60 +2121 y(memory)e(usage.)29 b(Since)18 b(man)o(y)g(of)h(these)f(manipulation)g +(routines)g(in)o(v)o(olv)o(e)f(one)i(matrix)e(\(as)i(op-)60 +2181 y(p)q(osed)g(to)f(t)o(w)o(o)g(in)g(the)f(basic)h(linear)g(algebra)g +(routines\))g(w)o(e)f(created)h(a)g(mo)q(dule)f(called)g(UNAR)l(Y)60 +2241 y(to)g(include)e(these)h(subroutines.)120 2302 y(Another)k(set)g(of)g +(subroutines)g(that)h(are)f(sometime)o(s)e(useful)h(are)h(those)h(in)o(v)o +(olving)d(a)i(`mask'.)60 2362 y(A)c(mask)f(de\014nes)h(a)h(giv)o(en)e +(nonzero)i(pattern)f(and)h(for)f(all)g(practical)f(purp)q(oses)j(a)e(mask)g +(matrix)e(is)60 2422 y(a)19 b(sparse)g(matrix)e(whose)i(nonzero)g(en)o(tries) +e(are)h(all)g(ones)h(\(therefore)f(there)g(is)g(no)h(need)f(to)h(store)60 +2482 y(its)g(real)f(v)m(alues\).)29 b(Sometime)o(s)16 b(it)j(is)f(useful)h +(to)g(extract)f(from)g(a)h(giv)o(en)f(matrix)f Fj(A)h Fl(the)g(`mask)o(ed')60 +2542 y(matrix)e(according)i(to)h(a)f(mask)f Fj(M)5 b Fl(,)18 +b(i.e.,)f(to)h(compute)f(the)g(matrix)f Fj(A)c Fg(\014)g Fj(M)24 +b Fl(,)18 b(where)f Fg(\014)h Fl(denotes)60 2602 y(the)e(elemen)o(t-wise)d +(matrix)i(pro)q(duct,)h(and)h Fj(M)22 b Fl(is)16 b(some)f(mask)g(matrix.)p +eop +%%Page: 13 13 +13 12 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(13)60 +132 y Fi(3.2)70 b(The)22 b(mo)r(dule)f(UNAR)-6 b(Y)60 224 y +Fl(This)23 b(mo)q(dule)f(of)i(SP)l(ARSKIT)e(consists)i(of)g(a)f(n)o(um)o(b)q +(er)f(of)h(routines)g(to)h(p)q(erform)e(some)g(basic)60 284 +y(non-algebraic)d(op)q(erations)h(on)g(a)f(matrix.)27 b(The)19 +b(follo)o(wing)g(is)f(a)i(list)e(of)h(the)g(routines)g(curren)o(tly)60 +344 y(supp)q(orted)e(with)f(a)h(brief)e(explanation.)120 554 +y Fh(SUBMA)-5 b(T)147 b Fl(Extracts)15 b(a)g(square)g(or)g(rectangular)g +(submatrix)f(from)g(a)h(sparse)g(matrix.)510 615 y(Both)23 +b(the)h(input)f(and)h(output)g(matrices)e(are)h(in)g(CSR)h(format.)42 +b(The)510 675 y(routine)16 b(is)g(in-place.)120 783 y Fh(FIL)-5 +b(TER)187 b Fl(Filters)15 b(out)h(elemen)o(ts)d(from)i(a)i(matrix)d +(according)i(to)g(their)g(magnitude.)510 843 y(Both)g(the)h(input)f(and)h +(the)f(output)h(matrices)e(are)h(in)g(CSR)h(format.)k(The)510 +904 y(output)i(matrix,)e(is)h(obtained)g(from)f(the)h(input)g(matrix)e(b)o(y) +i(remo)o(ving)510 964 y(all)e(the)f(elemen)o(ts)e(that)k(are)f(smaller)e +(than)j(a)f(certain)f(threshold.)33 b(The)510 1024 y(threshold)15 +b(is)g(computed)e(for)i(eac)o(h)g(ro)o(w)g(according)g(to)g(one)g(of)g(three) +f(pro-)510 1084 y(vided)h(options.)22 b(The)17 b(algorithm)e(is)h(in-place.) +120 1193 y Fh(FIL)-5 b(TERM)134 b Fl(Same)15 b(as)i(ab)q(o)o(v)o(e,)f(but)g +(for)h(the)f(MSR)g(format.)120 1313 y Fh(CSOR)-5 b(T)201 b +Fl(Sorts)15 b(the)f(elemen)o(ts)d(of)k(a)g(matrix)d(stored)j(in)e(CSR)i +(format)e(in)h(increasing)510 1373 y(order)i(of)h(the)f(column)f(n)o(um)o(b)q +(ers.)120 1472 y Fh(TRANSP)154 b Fl(This)16 b(is)g(an)h(in-place)f(transp)q +(osition)h(routine,)f(i.e.,)e(it)i(can)g(b)q(e)g(view)o(ed)f(as)510 +1532 y(an)21 b(in-place)e(v)o(ersion)h(of)g(the)g(CSR)o(CSC)h(routine)f(in)g +(F)o(ORMA)l(TS.)e(One)510 1592 y(notable)e(disadv)m(an)o(tage)g(of)g(TRANSP)g +(is)f(that)h(unlik)o(e)e(CSR)o(CSC)i(it)f(do)q(es)510 1652 +y(not)g(sort)g(the)f(nonzero)g(elemen)o(ts)e(in)i(increasing)f(n)o(um)o(b)q +(er)g(of)i(the)f(column)510 1713 y(p)q(ositions.)120 1824 y +Fh(COPMA)-5 b(T)141 b Fl(Cop)o(y)16 b(of)h(a)g(matrix)d(in)o(to)i(another)h +(matrix)d(\(b)q(oth)j(stored)g(CSR\).)120 1944 y Fh(MSR)n(COP)146 +b Fl(Copies)16 b(a)h(matrix)e(in)h(MSR)f(format)h(in)o(to)g(a)h(matrix)d(in)i +(MSR)g(format.)120 2064 y Fh(GETELM)146 b Fl(F)l(unction)13 +b(returning)g(the)f(v)m(alue)h(of)g Fj(a)1203 2071 y Ff(ij)1246 +2064 y Fl(for)h(an)o(y)f(pair)g(\()p Fj(i;)8 b(j)s Fl(\).)19 +b(Also)13 b(returns)510 2124 y(address)k(of)g(the)f(elemen)n(t)e(in)i(arra)o +(ys)g Fj(A;)8 b(J)d(A)p Fl(.)120 2233 y Fh(GETDIA)164 b Fl(Extracts)12 +b(a)g(sp)q(eci\014ed)f(diagonal)i(from)d(a)j(matrix.)18 b(An)11 +b(option)h(is)g(pro)o(vided)510 2293 y(to)20 b(transform)g(the)g(input)f +(matrix)g(so)h(that)h(the)e(extracted)g(diagonal)i(is)510 2353 +y(zero)q(ed)d(out)h(in)f(input)g(matrix.)26 b(Otherwise)18 +b(the)g(diagonal)i(is)e(extracted)510 2413 y(and)f(the)f(input)g(matrix)e +(remains)h(un)o(touc)o(hed.)120 2522 y Fh(GETL)236 b Fl(This)22 +b(subroutine)g(extracts)g(the)f(lo)o(w)o(er)g(triangular)h(part)h(of)f(a)g +(matrix,)510 2582 y(including)15 b(the)h(main)f(diagonal.)22 +b(The)17 b(algorithm)e(is)h(in-place.)120 2690 y Fh(GETU)227 +b Fl(Extracts)14 b(the)g(upp)q(er)g(triangular)h(part)f(of)h(a)f(matrix.)19 +b(Similar)12 b(to)i(GETL.)p eop +%%Page: 14 14 +14 13 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(14)120 +132 y Fh(LEVELS)175 b Fl(Computes)14 b(the)h(lev)o(el)e(sc)o(heduling)h(data) +i(structure)e(for)i(lo)o(w)o(er)e(triangular)510 192 y(matrices,)g(see)i +([1].)120 303 y Fh(AMASK)178 b Fl(Extracts)21 b Fj(C)k Fl(=)d +Fj(A)14 b Fg(\014)g Fj(M)5 b Fl(,)22 b(i.e.,)e(p)q(erforms)g(the)h(mask)f(op) +q(eration.)36 b(This)510 363 y(routine)16 b(computes)f(a)h(sparse)h(matrix)e +(from)g(an)h(input)g(matrix)f Fj(A)h Fl(b)o(y)f(ex-)510 423 +y(tracting)d(only)h(the)f(elemen)o(ts)e(in)i Fj(A)p Fl(,)g(where)g(the)g +(corresp)q(onding)i(elemen)o(ts)510 483 y(of)f Fj(M)19 b Fl(are)13 +b(nonzero.)21 b(The)13 b(mask)f(matrix)g Fj(M)5 b Fl(,)13 b(is)g(a)h(sparse)g +(matrix)d(in)i(CSR)510 544 y(format)i(without)h(the)f(real)h(v)m(alues,)f +(i.e.,)f(only)h(the)h(in)o(teger)e(arra)o(ys)i(of)g(the)510 +604 y(CSR)g(format)g(are)g(passed.)120 712 y Fh(CPERM)180 b +Fl(P)o(erm)o(utes)13 b(the)h(columns)g(of)h(a)g(matrix,)e(i.e.,)g(computes)g +(the)i(matrix)e Fj(B)j Fl(=)510 772 y Fj(AQ)f Fl(where)h Fj(Q)g +Fl(is)g(a)h(p)q(erm)o(utation)e(matrix.)120 881 y Fh(RPERM)178 +b Fl(P)o(erm)o(utes)11 b(the)j(ro)o(ws)g(of)g(a)g(matrix,)d(i.e.,)h(computes) +h(the)g(matrix)f Fj(B)k Fl(=)e Fj(P)7 b(A)510 941 y Fl(where)16 +b Fj(P)23 b Fl(is)16 b(a)h(p)q(erm)o(utation)e(matrix.)120 +1050 y Fh(DPERM)177 b Fl(P)o(erm)o(utes)16 b(the)h(ro)o(ws)i(and)f(columns)f +(of)h(a)h(matrix,)d(i.e.,)g(computes)h Fj(B)i Fl(=)510 1110 +y Fj(P)7 b(AQ)23 b Fl(giv)o(en)f(t)o(w)o(o)h(p)q(erm)o(utation)f(matrices)f +Fj(P)31 b Fl(and)23 b Fj(Q)p Fl(.)42 b(This)23 b(routine)510 +1170 y(giv)o(es)15 b(a)i(sp)q(ecial)f(treatmen)o(t)e(to)j(the)f(common)e +(case)i(where)g Fj(Q)e Fl(=)f Fj(P)1780 1152 y Ff(T)1808 1170 +y Fl(.)120 1281 y Fh(DPERM2)149 b Fl(General)16 b(submatrix)f(p)q(erm)o +(utation/extraction)g(routine.)120 1401 y Fh(DMPERM)124 b Fl(Symmetri)o(c)19 +b(p)q(erm)o(utation)h(of)i(ro)o(w)g(and)g(column)e(\(B=P)l(AP'\))h(in)g(MSR) +510 1461 y(format)120 1560 y Fh(D)n(VPERM)137 b Fl(P)o(erforms)17 +b(an)i(in-place)f(p)q(erm)o(utation)f(of)i(a)f(real)g(v)o(ector,)g(i.e.,)f(p) +q(erforms)510 1620 y Fj(x)d Fl(:=)f Fj(P)7 b(x)p Fl(,)16 b(where)g +Fj(P)23 b Fl(is)16 b(a)h(p)q(erm)o(utation)e(matrix.)120 1729 +y Fh(IVPERM)157 b Fl(P)o(erforms)15 b(an)i(in-place)e(p)q(erm)o(utation)g(of) +i(an)g(in)o(teger)e(v)o(ector.)120 1849 y Fh(RETMX)177 b Fl(Returns)24 +b(the)f(maxim)n(um)d(absolute)k(v)m(alue)f(in)g(eac)o(h)g(ro)o(w)h(of)g(an)g +(input)510 1909 y(matrix.)120 2008 y Fh(DIAPOS)173 b Fl(Returns)23 +b(the)g(p)q(ositions)g(in)g(the)g(arra)o(ys)g Fj(A)g Fl(and)g +Fj(J)5 b(A)22 b Fl(of)h(the)g(diagonal)510 2068 y(elemen)o(ts,)13 +b(for)k(a)f(matrix)f(stored)h(in)g(CSR)h(format.)120 2177 y +Fh(EXTBDG)145 b Fl(Extracts)22 b(the)h(main)e(diagonal)i(blo)q(c)o(ks)f(of)g +(a)h(matrix.)38 b(The)22 b(output)h(is)510 2237 y(a)e(rectangular)h(matrix)d +(of)i(dimension)f Fj(N)f Fg(\002)14 b Fj(N)5 b(B)s(LK)t Fl(,)22 +b(con)o(taining)f(the)510 2297 y Fj(N)q(=)m(N)5 b(B)s(LK)21 +b Fl(blo)q(c)o(ks,)16 b(in)g(whic)o(h)f Fj(N)5 b(B)s(LK)21 +b Fl(is)16 b(the)g(blo)q(c)o(k-size)f(\(input\).)120 2408 y +Fh(GETBWD)129 b Fl(Returns)24 b(bandwidth)h(information)e(on)h(a)h(matrix.)43 +b(This)24 b(subroutine)510 2468 y(returns)17 b(the)g(bandwidth)h(of)g(the)f +(lo)o(w)o(er)g(part)g(and)h(the)g(upp)q(er)f(part)h(of)g(a)510 +2529 y(giv)o(en)13 b(matrix.)19 b(Ma)o(y)13 b(b)q(e)h(used)h(to)f(determine)d +(these)j(t)o(w)o(o)g(parameters)f(for)510 2589 y(con)o(v)o(erting)i(a)i +(matrix)d(in)o(to)i(the)g(BND)g(format.)p eop +%%Page: 15 15 +15 14 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(15)120 +132 y Fh(BLKFND)150 b Fl(A)o(ttempts)12 b(to)j(\014nd)f(the)g(blo)q(c)o +(k-size)f(of)i(a)g(matrix)d(stored)j(in)f(CSR)g(format.)510 +192 y(One)21 b(restriction)g(is)h(that)g(the)f(zero)h(elemen)o(ts)d(in)i(eac) +o(h)g(blo)q(c)o(k)g(if)h(there)510 252 y(are)15 b(an)o(y)g(are)g(assumed)f +(to)h(b)q(e)g(represen)o(ted)f(as)h(nonzero)h(elemen)o(ts)c(in)i(the)510 +312 y(data)j(structure)f(for)h(the)f Fj(A)f Fl(matrix,)f(with)j(zero)e(v)m +(alues.)120 421 y Fh(BLK)n(CHK)146 b Fl(Chec)o(ks)13 b(whether)g(a)g(giv)o +(en)g(in)o(teger)f(is)h(the)g(blo)q(c)o(k)g(size)g(of)g(A.)g(This)g(routine) +510 481 y(is)j(called)f(b)o(y)h(BLKFND.)f(Same)g(restriction)h(as)h(ab)q(o)o +(v)o(e.)120 589 y Fh(INFDIA)184 b Fl(Computes)17 b(the)g(n)o(um)o(b)q(er)f +(of)h(nonzero)h(elemen)o(ts)d(of)j(eac)o(h)f(of)g(the)h(2)p +Fj(n)12 b Fg(\000)g Fl(1)510 649 y(diagonals)k(of)f(a)g(matrix.)k(Note)14 +b(that)h(the)f(\014rst)h(diagonal)g(is)g(the)f(diagonal)510 +710 y(with)h(o\013set)h Fg(\000)p Fj(n)g Fl(whic)o(h)f(consists)g(of)h(the)f +(en)o(try)g Fj(a)1440 717 y Ff(n;)p Fd(1)1506 710 y Fl(and)h(the)f(last)h +(one)f(is)510 770 y(the)h(diagonal)h(with)f(o\013set)h Fj(n)g +Fl(whic)o(h)e(consists)i(of)f(the)g(elemen)o(t)e Fj(a)1740 +777 y Fd(1)p Ff(;n)1790 770 y Fl(.)120 882 y Fh(AMUBDG)125 +b Fl(Computes)23 b(the)g(n)o(um)o(b)q(er)f(of)i(nonzero)g(elemen)o(ts)d(in)i +(eac)o(h)g(ro)o(w)h(of)g(the)510 943 y(pro)q(duct)19 b(of)g(t)o(w)o(o)f +(sparse)h(matrices)e Fj(A)h Fl(and)h Fj(B)s Fl(.)27 b(Also)18 +b(returns)h(the)f(total)510 1003 y(n)o(um)o(b)q(er)c(of)j(nonzero)g(elemen)o +(ts.)120 1102 y Fh(APLBDG)149 b Fl(Computes)13 b(the)g(n)o(um)o(b)q(er)f(of)i +(nonzero)g(elemen)o(ts)d(in)i(eac)o(h)g(ro)o(w)h(of)g(the)f(sum)510 +1162 y(of)19 b(t)o(w)o(o)g(sparse)g(matrices)e Fj(A)i Fl(and)g +Fj(B)s Fl(.)29 b(Also)18 b(returns)h(the)g(total)g(n)o(um)o(b)q(er)510 +1222 y(of)e(nonzero)f(elemen)o(ts.)120 1321 y Fh(RNRMS)178 +b Fl(Computes)20 b(the)h(norms)g(of)g(the)g(ro)o(ws)g(of)h(a)f(matrix.)34 +b(The)21 b(usual)h(three)510 1381 y(norms)16 b Fg(k)p Fj(:)p +Fg(k)721 1388 y Fd(1)740 1381 y Fj(;)8 b Fg(k)p Fj(:)p Fg(k)826 +1388 y Fd(2)845 1381 y Fj(;)15 b Fl(and)i Fg(k)p Fj(:)p Fg(k)1033 +1388 y Fb(1)1086 1381 y Fl(are)g(supp)q(orted.)120 1492 y Fh(CNRMS)180 +b Fl(Computes)16 b(the)g(norms)g(of)h(the)g(columns)e(of)i(a)g(matrix.)k +(Similar)14 b(to)j(RN-)510 1552 y(RMS.)120 1651 y Fh(R)n(OSCAL)161 +b Fl(Scales)13 b(the)f(ro)o(ws)i(of)f(a)h(matrix)d(b)o(y)h(their)h(norms.)19 +b(The)13 b(same)f(three)h(norms)510 1711 y(as)k(in)f(RNRMS)f(are)h(a)o(v)m +(ailable.)120 1810 y Fh(COSCAL)161 b Fl(Scales)18 b(the)h(columns)e(of)i(a)h +(matrix)d(b)o(y)h(their)g(norms.)28 b(The)19 b(same)f(three)510 +1870 y(norms)e(as)g(in)g(RNRMS)g(are)g(a)o(v)m(ailable.)120 +1969 y Fh(ADDBLK)144 b Fl(Adds)16 b(a)h(matrix)d(B)i(in)o(to)g(a)h(blo)q(c)o +(k)e(of)i(A.)120 2089 y Fh(GET1UP)161 b Fl(Collects)22 b(the)h(\014rst)h +(elemen)o(t)o(s)d(of)i(eac)o(h)g(ro)o(w)g(of)g(the)g(upp)q(er)h(triangular) +510 2149 y(p)q(ortion)17 b(of)g(the)f(matrix.)120 2258 y Fh(XTR)n(O)n(WS)140 +b Fl(Extracts)16 b(giv)o(en)g(ro)o(ws)g(from)g(a)g(matrix)f(in)h(CSR)g +(format.)120 2378 y Fh(CSRKVSTR)79 b Fl(Finds)16 b(blo)q(c)o(k)g +(partitioning)g(of)h(matrix)d(in)i(CSR)g(format.)120 2498 y +Fh(CSRKVSTC)81 b Fl(Finds)16 b(blo)q(c)o(k)g(column)e(partitioning)j(of)f +(matrix)f(in)h(CSR)g(format.)120 2618 y Fh(KVSTMER)n(GE)23 +b Fl(Merges)16 b(blo)q(c)o(k)g(partitionings)g(for)h(conformal)e(ro)o +(w/column)g(pattern.)p eop +%%Page: 16 16 +16 15 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(16)60 +144 y Fk(4)83 b(Input/Output)27 b(routines)60 253 y Fl(The)19 +b(INOUT)e(mo)q(dule)g(of)i(SP)l(ARSKIT)f(comprises)f(a)i(few)g(routines)f +(for)h(reading,)g(writing,)f(and)60 314 y(for)d(plotting)h(and)f(visualizing) +g(the)f(structure)h(of)h(sparse)g(matrices.)j(Man)o(y)14 b(of)i(these)f +(routines)g(are)60 374 y(essen)o(tially)h(geared)j(to)o(w)o(ards)f(the)g +(utilization)f(of)h(the)g(Harw)o(ell/Bo)q(eing)f(collection)g(of)h(matrices.) +60 434 y(There)e(are)g(curren)o(tly)f(elev)o(en)f(subroutines)j(in)f(this)g +(mo)q(dule.)120 644 y Fh(READMT)134 b Fl(Reads)17 b(a)f(matrix)f(in)h(the)g +(Harw)o(ell/Bo)q(eing)f(format.)120 764 y Fh(PR)-5 b(TMT)184 +b Fl(Creates)15 b(a)g(Harw)o(ell)f(Bo)q(eing)h(\014le)f(from)g(an)h +(arbitrary)g(matrix)e(in)i(CSR)g(or)510 824 y(CSC)i(format.)120 +923 y Fh(DUMP)213 b Fl(DUMP)21 b(prin)o(ts)f(the)g(ro)o(ws)i(of)f(a)g(matrix) +e(in)i(a)g(\014le,)g(in)f(a)h(nice)f(readable)510 983 y(format.)39 +b(The)22 b(b)q(est)h(format)e(is)h(in)o(ternally)f(calculated)g(dep)q(ending) +i(on)510 1044 y(the)18 b(n)o(um)o(b)q(er)f(of)h(nonzero)h(elemen)o(ts.)24 +b(This)19 b(is)f(a)h(simple)d(routine)i(whic)o(h)510 1104 y(migh)o(t)d(b)q(e) +h(helpful)f(for)i(debugging)g(purp)q(oses.)120 1212 y Fh(PSPL)-5 +b(TM)162 b Fl(Generates)16 b(a)h(p)q(ost-script)g(plot)f(of)h(the)f(non-zero) +h(pattern)f(of)h(A.)120 1332 y Fh(PL)-5 b(TMT)192 b Fl(Creates)16 +b(a)h(pic)f(\014le)f(for)i(plotting)f(the)g(pattern)g(of)h(a)g(matrix.)120 +1453 y Fh(SMMS)222 b Fl(W)l(rite)15 b(the)h(matrx)f(in)h(a)h(format)f(used)g +(in)g(SMMS)g(pac)o(k)m(age.)120 1573 y Fh(READSM)142 b Fl(Reads)17 +b(matrices)d(in)i(co)q(ordinate)h(format)e(\(as)i(in)f(SMMS)g(pac)o(k)m +(age\).)120 1693 y Fh(READSK)151 b Fl(Reads)17 b(matrices)d(in)i(CSR)g +(format)g(\(simpli\014ed)e(H/B)h(format\).)120 1813 y Fh(SKIT)255 +b Fl(W)l(rites)16 b(matrices)e(to)j(a)f(\014le,)f(format)h(same)f(as)i(ab)q +(o)o(v)o(e.)120 1933 y Fh(PR)-5 b(TUNF)154 b Fl(W)l(rites)16 +b(matrices)e(\(in)i(CSR)g(format\))g(in)g(unformatted)f(\014les.)120 +2054 y Fh(READUNF)104 b Fl(Reads)17 b(unformatted)e(\014le)h(con)o(taining)g +(matrices)e(in)i(CSR)g(format.)120 2264 y(The)22 b(routines)f(readm)o(t)f +(and)j(prtm)o(t)d(allo)o(w)h(to)h(read)g(and)g(create)f(\014les)g(con)o +(taining)h(matrices)60 2324 y(stored)d(in)f(the)h(H/B)f(format.)27 +b(F)l(or)19 b(details)f(concerning)g(this)h(format)f(the)g(reader)h(is)f +(referred)g(to)60 2384 y([4])d(or)h(the)f(summary)e(giv)o(en)i(in)g(the)g(do) +q(cumen)o(tation)g(of)h(the)f(subroutine)h(READMT.)f(While)f(the)60 +2444 y(purp)q(ose)g(of)f(readm)o(t)e(is)i(clear,)f(it)g(is)h(not)g(ob)o +(vious)g(that)g(one)g(single)f(subroutine)h(can)g(write)g(a)g(matrix)60 +2504 y(in)19 b(H/B)g(format)g(and)h(still)e(satisfy)i(the)f(needs)g(of)h(all) +f(users.)31 b(F)l(or)19 b(example)f(for)h(some)g(matrices)60 +2565 y(all)c(nonzero)h(en)o(tries)e(are)i(actually)f(in)o(tegers)g(and)h(a)g +(format)f(using)h(sa)o(y)f(a)h(10)h(digit)e(man)o(tissa)g(ma)o(y)60 +2625 y(en)o(tail)21 b(an)h(enormous)f(w)o(aste)h(of)g(storage)h(if)e(the)g +(matrix)f(is)i(large.)37 b(The)22 b(solution)g(pro)o(vided)f(is)60 +2685 y(to)e(compute)e(in)o(ternally)g(the)h(b)q(est)h(formats)f(for)h(the)f +(in)o(teger)g(arra)o(ys)h(IA)f(and)h(JA.)f(A)g(little)f(help)p +eop +%%Page: 17 17 +17 16 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(17)60 +132 y(is)17 b(required)g(from)f(the)i(user)f(for)h(the)g(real)f(v)m(alues)h +(in)f(the)g(arra)o(ys)h(A)f(and)i(RHS.)d(Sp)q(eci\014cally)l(,)g(the)60 +192 y(desired)11 b(format)g(is)g(obtained)h(from)f(a)h(parameter)f(of)h(the)f +(subroutine)h(b)o(y)f(using)h(a)g(simple)e(notation,)60 252 +y(whic)o(h)16 b(is)g(explained)f(in)h(detail)f(in)h(the)g(do)q(cumen)o +(tation)f(of)i(the)f(routine.)120 312 y(Besides)i(the)h(pair)g(of)g(routines) +h(that)f(can)g(read/write)g(matrices)f(in)g(H/B)h(format,)f(there)h(are)60 +372 y(three)e(other)h(pairs)f(whic)o(h)g(can)h(b)q(e)f(used)h(to)g(input)f +(and)h(output)h(matrices)c(in)i(di\013eren)o(t)g(formats.)60 +432 y(The)12 b(SMMS)f(and)i(READSM)e(pair)h(write)f(and)i(read)f(matrices)e +(in)h(the)h(format)f(used)h(in)f(the)h(pac)o(k)m(age)60 493 +y(SMMS.)j(Sp)q(eci\014cally)l(,)f(READSM)i(reads)g(a)h(matrix)d(in)i(SMMS)f +(format)h(from)f(a)h(\014le)g(and)g(outputs)60 553 y(it)21 +b(in)g(CSR)g(format.)36 b(SMMS)21 b(accepts)g(a)g(matrix)f(in)h(CSR)g(format) +g(and)h(writes)f(it)f(to)i(a)g(\014le)e(in)60 613 y(SMMS)c(format.)21 +b(The)16 b(SMMS)g(format)g(is)g(essen)o(tially)e(a)j(COO)f(format.)21 +b(The)c(size)e(of)i(the)f(matrix)60 673 y(app)q(ears)f(in)e(the)g(\014rst)h +(line)e(of)h(the)h(\014le.)19 b(Eac)o(h)14 b(other)f(line)f(of)i(the)f +(\014le)g(con)o(tains)g(triplets)g(in)g(the)g(form)60 733 y(of)i(\()p +Fj(i)p Fl(,)f Fj(j)s Fl(,)h Fj(a)256 740 y Ff(ij)286 733 y +Fl(\))f(whic)o(h)g(denote)h(the)g(non-zero)g(elemen)o(ts)d(of)j(the)f +(matrix.)19 b(Similarly)l(,)12 b(READSK)i(and)60 794 y(SKIT)f(read)f(and)i +(write)e(matrices)e(in)j(CSR)g(format.)19 b(This)13 b(pair)f(is)h(v)o(ery)e +(similar)g(to)i(READMT)f(and)60 854 y(PR)l(TMT,)k(only)h(that)g(the)g +(\014les)f(read/written)h(b)o(y)f(READSK)h(and)g(SKIT)g(do)g(not)g(ha)o(v)o +(e)f(headers.)60 914 y(The)g(pair)f(READUNF)g(and)h(PR)l(TUNF)f(reads)h(and)h +(writes)e(the)g(matrices)f(\(stored)i(as)h Fj(ia)p Fl(,)d Fj(j)s(a)h +Fl(and)60 974 y Fj(a)p Fl(\))k(in)g(binary)g(form,)g(i.e.)f(the)h(n)o(um)o(b) +q(er)e(in)i(the)g(\014le)g(written)g(b)o(y)g(PR)l(TUNF)f(will)h(b)q(e)g(in)g +(mac)o(hine)60 1034 y(represen)o(tations.)26 b(The)18 b(primary)e(motiv)m +(ation)h(for)h(this)g(is)f(that)i(handling)f(the)f(arra)o(ys)i(in)e(binary)60 +1095 y(form)c(tak)o(es)g(less)g(space)h(than)g(in)g(the)f(usual)h(ASCI)q(I)f +(form,)g(and)h(is)f(usually)h(faster.)20 b(If)13 b(the)h(matrices)60 +1155 y(are)i(large)h(and)g(they)f(are)g(only)h(used)f(on)h(compatible)d +(computers,)h(it)h(migh)o(t)f(b)q(e)i(desirable)e(to)i(use)60 +1215 y(unformatted)e(\014les.)120 1275 y(W)l(e)22 b(found)h(it)f(extremel)o +(y)d(useful)j(to)h(b)q(e)f(able)g(to)h(visualize)d(a)j(sparse)g(matrix,)e +(notably)i(for)60 1335 y(debugging)15 b(purp)q(oses.)21 b(A)14 +b(simple)e(lo)q(ok)i(at)g(the)g(plot)g(can)g(sometimes)d(rev)o(eal)h(whether) +i(the)g(matrix)60 1396 y(obtained)j(from)f(some)f(reordering)i(tec)o(hnique)e +(do)q(es)i(indeed)f(ha)o(v)o(e)g(the)h(exp)q(ected)f(structure.)22 +b(F)l(or)60 1456 y(no)o(w)16 b(t)o(w)o(o)f(simple)e(plotting)j(mec)o(hanisms) +c(are)k(pro)o(vided.)k(First,)15 b(a)h(prepro)q(cessor)g(called)e(PL)l(TMT)60 +1516 y(to)20 b(the)f(Unix)g(utilit)o(y)e(`Pic')h(allo)o(ws)i(one)f(to)h +(generate)f(a)h(pic)f(\014le)g(from)f(a)i(matrix)e(that)i(is)f(in)g(the)60 +1576 y(Harw)o(ell/Bo)q(eing)d(format)g(or)h(an)o(y)g(other)g(format.)23 +b(F)l(or)17 b(example)d(for)k(a)f(Harw)o(ell/Bo)q(eing)f(matrix)60 +1636 y(\014le,)f(the)h(command)e(is)i(of)h(the)f(form)737 1738 +y Fa(hb2pic.ex)23 b(<)i(HB)p 1100 1738 16 2 v 18 w(file.)60 +1840 y Fl(The)13 b(output)g(\014le)f(is)h(then)f(prin)o(ted)g(b)o(y)g(the)h +(usual)g(tro\013)g(or)g(T)l(eX)f(commands.)19 b(A)12 b(translation)h(of)g +(this)60 1900 y(routine)j(in)o(to)g(one)g(that)h(generates)g(a)f(p)q +(ost-script)h(\014le)f(is)g(also)h(a)o(v)m(ailable)e(\(called)h(PSPL)l(TM\).) +g(W)l(e)60 1960 y(should)g(p)q(oin)o(t)g(out)g(that)g(the)g(plotting)g +(routines)f(are)h(v)o(ery)e(simple)g(in)h(nature)h(and)h(should)f(not)g(b)q +(e)60 2020 y(used)c(to)h(plot)f(large)g(matrices.)18 b(F)l(or)12 +b(example)e(the)i(pltm)o(t)e(routine)i(outputs)h(one)g(pic)e(command)f(line) +60 2080 y(for)16 b(ev)o(ery)d(nonzero)j(elemen)o(t.)i(This)d(constitutes)h(a) +f(con)o(v)o(enien)o(t)f(to)q(ol)i(for)f(do)q(cumen)o(t)f(preparation)60 +2141 y(for)g(example.)k(Matrices)12 b(of)i(size)e(just)h(up)h(to)g(a)f(few)g +(thousands)i(can)f(b)q(e)f(prin)o(ted)f(this)h(w)o(a)o(y)l(.)20 +b(Sev)o(eral)60 2201 y(options)d(concerning)f(the)g(size)f(of)i(the)f(plot)g +(and)h(caption)f(generation)h(are)f(a)o(v)m(ailable.)120 2261 +y(There)h(is)g(also)h(a)g(simple)d(utilit)o(y)g(program)i(called)f(\\h)o +(b2ps")j(whic)o(h)d(tak)o(es)h(a)h(matrix)e(\014le)g(with)60 +2321 y(HB)21 b(format)g(and)i(translates)f(it)f(in)o(to)h(a)g(p)q(ost-script) +h(\014le.)37 b(The)22 b(usage)h(of)f(this)g(program)g(is)f(as)60 +2381 y(follo)o(ws:)523 2483 y Fa(hb2ps.ex)i(<)i(HB)p 860 2483 +V 18 w(file)f(>)h(Postscript)p 1316 2483 V 15 w(file.)60 2585 +y Fl(The)17 b(\014le)f(can)i(b)q(e)f(preview)o(ed)e(with)i(ghostscript.)24 +b(The)17 b(follo)o(wing)g(graph)h(sho)o(ws)g(a)f(pattern)g(of)h(an)60 +2645 y(unsymmetric)13 b(matrix.)p eop +%%Page: 18 18 +18 17 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(18)240 +90 y + 23681433 20366028 0 0 34666987 29864919 startTexFig + 240 90 a +%%BeginDocument: jpwh.ps +%! +%%Creator: PSPLTM routine +%%309.92 133.88 1244.56 1165.72 +%%74 94 527 454 +%%BoundingBox: 0 0 527 454 +%%EndComments +/cm {72 mul 2.54 div} def +/mc {72 div 2.54 mul} def +/pnum { 72 div 2.54 mul 20 string +cvs print ( ) print} def +/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def +gsave +/Helvetica findfont 0.500000 cm scalefont setfont + 10.7950 cm 2.15000 cm moveto +(AN UNSYMMETRIC MATRIX FROM PHILIPS LTD, J.P.WHELAN,1978.) Cshow + 4.44500 cm 3.35000 cm translate + 12.7000 cm 992 div dup scale + 0.250000 setlinewidth +newpath + 0 0 moveto + 992 0 lineto + 992 992 lineto + 0 992 lineto +closepath stroke + 0.2 setlinewidth +1 1 translate +0.8 setlinewidth +/p {moveto 0 -.40 rmoveto + 0 .80 rlineto stroke} def + 0 990 p + 83 990 p + 1 989 p + 84 989 p + 121 989 p + 146 989 p + 164 989 p + 2 988 p + 121 988 p + 3 987 p + 121 987 p + 122 987 p + 140 987 p + 4 986 p + 84 986 p + 122 986 p + 5 985 p + 6 984 p + 100 984 p + 123 984 p + 7 983 p + 106 983 p + 123 983 p + 124 983 p + 8 982 p + 106 982 p + 111 982 p + 123 982 p + 9 981 p + 10 980 p + 95 980 p + 11 979 p + 106 979 p + 125 979 p + 138 979 p + 152 979 p + 12 978 p + 85 978 p + 95 978 p + 125 978 p + 13 977 p + 119 977 p + 14 976 p + 119 976 p + 126 976 p + 15 975 p + 119 975 p + 158 975 p + 16 974 p + 93 974 p + 126 974 p + 17 973 p + 93 973 p + 18 972 p + 93 972 p + 19 971 p + 101 971 p + 113 971 p + 20 970 p + 101 970 p + 139 970 p + 21 969 p + 82 969 p + 98 969 p + 101 969 p + 22 968 p + 98 968 p + 23 967 p + 98 967 p + 24 966 p + 25 965 p + 114 965 p + 139 965 p + 141 965 p + 153 965 p + 163 965 p + 26 964 p + 127 964 p + 139 964 p + 141 964 p + 27 963 p + 114 963 p + 28 962 p + 115 962 p + 143 962 p + 155 962 p + 165 962 p + 194 962 p + 29 961 p + 114 961 p + 143 961 p + 30 960 p + 128 960 p + 143 960 p + 31 959 p + 105 959 p + 117 959 p + 129 959 p + 166 959 p + 32 958 p + 105 958 p + 33 957 p + 83 957 p + 105 957 p + 34 956 p + 83 956 p + 94 956 p + 35 955 p + 94 955 p + 102 955 p + 36 954 p + 94 954 p + 37 953 p + 91 953 p + 128 953 p + 38 952 p + 39 951 p + 103 951 p + 112 951 p + 116 951 p + 128 951 p + 154 951 p + 156 951 p + 159 951 p + 167 951 p + 40 950 p + 91 950 p + 104 950 p + 41 949 p + 92 949 p + 103 949 p + 42 948 p + 104 948 p + 43 947 p + 44 946 p + 92 946 p + 108 946 p + 130 946 p + 45 945 p + 92 945 p + 130 945 p + 46 944 p + 47 943 p + 102 943 p + 131 943 p + 48 942 p + 102 942 p + 107 942 p + 132 942 p + 49 941 p + 108 941 p + 132 941 p + 50 940 p + 107 940 p + 51 939 p + 111 939 p + 161 939 p + 168 939 p + 180 939 p + 52 938 p + 107 938 p + 53 937 p + 54 936 p + 100 936 p + 110 936 p + 111 936 p + 55 935 p + 82 935 p + 56 934 p + 84 934 p + 100 934 p + 110 934 p + 57 933 p + 95 933 p + 58 932 p + 85 932 p + 108 932 p + 59 931 p + 85 931 p + 109 931 p + 60 930 p + 91 930 p + 109 930 p + 61 929 p + 99 929 p + 131 929 p + 133 929 p + 62 928 p + 131 928 p + 63 927 p + 103 927 p + 64 926 p + 99 926 p + 65 925 p + 127 925 p + 66 924 p + 109 924 p + 126 924 p + 67 923 p + 115 923 p + 68 922 p + 82 922 p + 113 922 p + 118 922 p + 69 921 p + 113 921 p + 134 921 p + 158 921 p + 169 921 p + 178 921 p + 188 921 p + 212 921 p + 70 920 p + 134 920 p + 71 919 p + 134 919 p + 72 918 p + 73 917 p + 135 917 p + 74 916 p + 117 916 p + 75 915 p + 117 915 p + 136 915 p + 76 914 p + 136 914 p + 77 913 p + 116 913 p + 136 913 p + 144 913 p + 147 913 p + 78 912 p + 96 912 p + 79 911 p + 112 911 p + 116 911 p + 144 911 p + 145 911 p + 187 911 p + 80 910 p + 96 910 p + 124 910 p + 81 909 p + 112 909 p + 124 909 p + 140 909 p + 145 909 p + 170 909 p + 82 908 p + 118 908 p + 168 908 p + 181 908 p + 195 908 p + 83 907 p + 171 907 p + 182 907 p + 190 907 p + 84 906 p + 146 906 p + 151 906 p + 172 906 p + 213 906 p + 85 905 p + 120 905 p + 160 905 p + 173 905 p + 197 905 p + 86 904 p + 99 904 p + 159 904 p + 82 903 p + 87 903 p + 118 903 p + 88 902 p + 164 902 p + 174 902 p + 89 901 p + 129 901 p + 90 900 p + 96 900 p + 138 900 p + 158 900 p + 175 900 p + 91 899 p + 104 899 p + 115 899 p + 154 899 p + 155 899 p + 176 899 p + 92 898 p + 133 898 p + 177 898 p + 93 897 p + 127 897 p + 178 897 p + 193 897 p + 220 897 p + 94 896 p + 179 896 p + 189 896 p + 95 895 p + 125 895 p + 173 895 p + 180 895 p + 183 895 p + 96 894 p + 144 894 p + 152 894 p + 175 894 p + 203 894 p + 97 893 p + 122 893 p + 140 893 p + 98 892 p + 153 892 p + 184 892 p + 195 892 p + 99 891 p + 150 891 p + 170 891 p + 221 891 p + 100 890 p + 110 890 p + 172 890 p + 186 890 p + 101 889 p + 181 889 p + 209 889 p + 264 889 p + 102 888 p + 148 888 p + 157 888 p + 163 888 p + 179 888 p + 198 888 p + 214 888 p + 103 887 p + 133 887 p + 159 887 p + 162 887 p + 200 887 p + 91 886 p + 104 886 p + 120 886 p + 154 886 p + 162 886 p + 176 886 p + 105 885 p + 129 885 p + 149 885 p + 182 885 p + 106 884 p + 183 884 p + 192 884 p + 107 883 p + 157 883 p + 184 883 p + 108 882 p + 120 882 p + 130 882 p + 161 882 p + 173 882 p + 177 882 p + 222 882 p + 109 881 p + 176 881 p + 100 880 p + 110 880 p + 172 880 p + 185 880 p + 111 879 p + 168 879 p + 180 879 p + 183 879 p + 186 879 p + 223 879 p + 247 879 p + 112 878 p + 145 878 p + 167 878 p + 170 878 p + 187 878 p + 113 877 p + 178 877 p + 181 877 p + 188 877 p + 114 876 p + 141 876 p + 149 876 p + 189 876 p + 91 875 p + 115 875 p + 142 875 p + 116 874 p + 147 874 p + 187 874 p + 207 874 p + 117 873 p + 135 873 p + 147 873 p + 169 873 p + 224 873 p + 82 872 p + 118 872 p + 151 872 p + 188 872 p + 225 872 p + 119 871 p + 138 871 p + 160 871 p + 226 871 p + 85 870 p + 104 870 p + 108 870 p + 120 870 p + 197 870 p + 199 870 p + 121 869 p + 150 869 p + 171 869 p + 190 869 p + 191 869 p + 227 869 p + 122 868 p + 146 868 p + 186 868 p + 191 868 p + 210 868 p + 219 868 p + 227 868 p + 123 867 p + 192 867 p + 124 866 p + 152 866 p + 192 866 p + 203 866 p + 219 866 p + 228 866 p + 95 865 p + 125 865 p + 196 865 p + 217 865 p + 229 865 p + 126 864 p + 142 864 p + 160 864 p + 193 864 p + 93 863 p + 127 863 p + 142 863 p + 194 863 p + 209 863 p + 218 863 p + 220 863 p + 230 863 p + 128 862 p + 155 862 p + 156 862 p + 208 862 p + 211 862 p + 105 861 p + 129 861 p + 166 861 p + 174 861 p + 224 861 p + 231 861 p + 108 860 p + 130 860 p + 132 860 p + 148 860 p + 177 860 p + 232 860 p + 131 859 p + 171 859 p + 215 859 p + 232 859 p + 233 859 p + 130 858 p + 132 858 p + 148 858 p + 161 858 p + 92 857 p + 103 857 p + 133 857 p + 200 857 p + 221 857 p + 234 857 p + 134 856 p + 135 856 p + 151 856 p + 235 856 p + 117 855 p + 134 855 p + 135 855 p + 169 855 p + 174 855 p + 235 855 p + 136 854 p + 175 854 p + 212 854 p + 121 853 p + 137 853 p + 150 853 p + 119 852 p + 138 852 p + 196 852 p + 139 851 p + 153 851 p + 140 850 p + 191 850 p + 114 849 p + 141 849 p + 165 849 p + 218 849 p + 115 848 p + 126 848 p + 127 848 p + 142 848 p + 194 848 p + 206 848 p + 283 848 p + 143 847 p + 149 847 p + 165 847 p + 201 847 p + 211 847 p + 96 846 p + 144 846 p + 207 846 p + 236 846 p + 112 845 p + 145 845 p + 203 845 p + 84 844 p + 122 844 p + 146 844 p + 164 844 p + 227 844 p + 116 843 p + 117 843 p + 147 843 p + 236 843 p + 237 843 p + 244 843 p + 265 843 p + 102 842 p + 130 842 p + 132 842 p + 148 842 p + 157 842 p + 238 842 p + 105 841 p + 114 841 p + 143 841 p + 149 841 p + 166 841 p + 99 840 p + 121 840 p + 150 840 p + 215 840 p + 84 839 p + 118 839 p + 134 839 p + 151 839 p + 185 839 p + 213 839 p + 225 839 p + 266 839 p + 96 838 p + 124 838 p + 152 838 p + 196 838 p + 98 837 p + 139 837 p + 153 837 p + 163 837 p + 205 837 p + 209 837 p + 251 837 p + 267 837 p + 91 836 p + 104 836 p + 154 836 p + 156 836 p + 162 836 p + 91 835 p + 128 835 p + 155 835 p + 204 835 p + 211 835 p + 239 835 p + 256 835 p + 263 835 p + 273 835 p + 128 834 p + 154 834 p + 156 834 p + 208 834 p + 250 834 p + 256 834 p + 257 834 p + 102 833 p + 107 833 p + 148 833 p + 157 833 p + 184 833 p + 158 832 p + 252 832 p + 268 832 p + 103 831 p + 159 831 p + 167 831 p + 250 831 p + 85 830 p + 119 830 p + 126 830 p + 160 830 p + 193 830 p + 206 830 p + 217 830 p + 242 830 p + 108 829 p + 132 829 p + 161 829 p + 222 829 p + 241 829 p + 245 829 p + 269 829 p + 103 828 p + 104 828 p + 154 828 p + 162 828 p + 200 828 p + 102 827 p + 153 827 p + 163 827 p + 179 827 p + 189 827 p + 198 827 p + 214 827 p + 251 827 p + 146 826 p + 164 826 p + 190 826 p + 213 826 p + 141 825 p + 143 825 p + 165 825 p + 218 825 p + 239 825 p + 240 825 p + 129 824 p + 149 824 p + 166 824 p + 201 824 p + 237 824 p + 258 824 p + 270 824 p + 288 824 p + 112 823 p + 159 823 p + 167 823 p + 208 823 p + 216 823 p + 82 822 p + 111 822 p + 168 822 p + 202 822 p + 247 822 p + 269 822 p + 271 822 p + 117 821 p + 135 821 p + 169 821 p + 212 821 p + 99 820 p + 112 820 p + 170 820 p + 216 820 p + 259 820 p + 262 820 p + 83 819 p + 121 819 p + 131 819 p + 171 819 p + 215 819 p + 84 818 p + 100 818 p + 110 818 p + 172 818 p + 185 818 p + 202 818 p + 210 818 p + 85 817 p + 95 817 p + 108 817 p + 173 817 p + 197 817 p + 217 817 p + 241 817 p + 129 816 p + 135 816 p + 174 816 p + 224 816 p + 231 816 p + 272 816 p + 96 815 p + 136 815 p + 175 815 p + 236 815 p + 252 815 p + 91 814 p + 104 814 p + 109 814 p + 176 814 p + 199 814 p + 204 814 p + 206 814 p + 263 814 p + 273 814 p + 297 814 p + 310 814 p + 92 813 p + 108 813 p + 130 813 p + 177 813 p + 199 813 p + 222 813 p + 93 812 p + 113 812 p + 178 812 p + 264 812 p + 268 812 p + 274 812 p + 285 812 p + 94 811 p + 102 811 p + 163 811 p + 179 811 p + 182 811 p + 198 811 p + 95 810 p + 111 810 p + 180 810 p + 223 810 p + 241 810 p + 82 809 p + 101 809 p + 113 809 p + 181 809 p + 195 809 p + 261 809 p + 264 809 p + 275 809 p + 83 808 p + 105 808 p + 179 808 p + 182 808 p + 233 808 p + 249 808 p + 276 808 p + 95 807 p + 106 807 p + 111 807 p + 183 807 p + 223 807 p + 229 807 p + 98 806 p + 107 806 p + 157 806 p + 184 806 p + 205 806 p + 110 805 p + 151 805 p + 172 805 p + 185 805 p + 202 805 p + 100 804 p + 111 804 p + 122 804 p + 186 804 p + 210 804 p + 112 803 p + 116 803 p + 187 803 p + 207 803 p + 216 803 p + 113 802 p + 118 802 p + 188 802 p + 225 802 p + 260 802 p + 94 801 p + 114 801 p + 163 801 p + 189 801 p + 201 801 p + 249 801 p + 83 800 p + 121 800 p + 164 800 p + 190 800 p + 254 800 p + 277 800 p + 121 799 p + 122 799 p + 140 799 p + 191 799 p + 219 799 p + 278 799 p + 106 798 p + 123 798 p + 124 798 p + 192 798 p + 228 798 p + 243 798 p + 93 797 p + 126 797 p + 160 797 p + 193 797 p + 220 797 p + 242 797 p + 127 796 p + 142 796 p + 194 796 p + 204 796 p + 230 796 p + 82 795 p + 98 795 p + 181 795 p + 195 795 p + 205 795 p + 275 795 p + 125 794 p + 138 794 p + 152 794 p + 196 794 p + 226 794 p + 228 794 p + 252 794 p + 255 794 p + 279 794 p + 85 793 p + 120 793 p + 173 793 p + 197 793 p + 248 793 p + 280 793 p + 311 793 p + 326 793 p + 102 792 p + 163 792 p + 179 792 p + 198 792 p + 214 792 p + 233 792 p + 281 792 p + 294 792 p + 302 792 p + 120 791 p + 176 791 p + 177 791 p + 199 791 p + 234 791 p + 248 791 p + 310 791 p + 103 790 p + 133 790 p + 162 790 p + 200 790 p + 234 790 p + 143 789 p + 166 789 p + 189 789 p + 201 789 p + 249 789 p + 258 789 p + 270 789 p + 300 789 p + 303 789 p + 331 789 p + 168 788 p + 172 788 p + 185 788 p + 202 788 p + 247 788 p + 261 788 p + 304 788 p + 333 788 p + 96 787 p + 124 787 p + 145 787 p + 203 787 p + 259 787 p + 279 787 p + 282 787 p + 155 786 p + 176 786 p + 194 786 p + 204 786 p + 239 786 p + 283 786 p + 153 785 p + 184 785 p + 195 785 p + 205 785 p + 238 785 p + 267 785 p + 271 785 p + 294 785 p + 307 785 p + 142 784 p + 160 784 p + 176 784 p + 206 784 p + 280 784 p + 297 784 p + 116 783 p + 144 783 p + 187 783 p + 207 783 p + 257 783 p + 282 783 p + 128 782 p + 156 782 p + 167 782 p + 208 782 p + 101 781 p + 127 781 p + 153 781 p + 209 781 p + 267 781 p + 122 780 p + 172 780 p + 186 780 p + 210 780 p + 284 780 p + 289 780 p + 308 780 p + 128 779 p + 143 779 p + 155 779 p + 211 779 p + 256 779 p + 270 779 p + 136 778 p + 169 778 p + 212 778 p + 244 778 p + 285 778 p + 293 778 p + 298 778 p + 312 778 p + 84 777 p + 151 777 p + 164 777 p + 213 777 p + 254 777 p + 266 777 p + 102 776 p + 163 776 p + 198 776 p + 214 776 p + 238 776 p + 131 775 p + 150 775 p + 171 775 p + 215 775 p + 221 775 p + 286 775 p + 167 774 p + 170 774 p + 187 774 p + 216 774 p + 257 774 p + 125 773 p + 160 773 p + 173 773 p + 217 773 p + 226 773 p + 246 773 p + 280 773 p + 313 773 p + 127 772 p + 141 772 p + 165 772 p + 218 772 p + 230 772 p + 240 772 p + 122 771 p + 124 771 p + 191 771 p + 219 771 p + 243 771 p + 259 771 p + 287 771 p + 93 770 p + 127 770 p + 193 770 p + 220 770 p + 268 770 p + 314 770 p + 322 770 p + 334 770 p + 99 769 p + 133 769 p + 215 769 p + 221 769 p + 232 769 p + 262 769 p + 315 769 p + 108 768 p + 161 768 p + 177 768 p + 222 768 p + 245 768 p + 248 768 p + 291 768 p + 316 768 p + 111 767 p + 180 767 p + 183 767 p + 223 767 p + 117 766 p + 129 766 p + 174 766 p + 224 766 p + 231 766 p + 237 766 p + 253 766 p + 288 766 p + 118 765 p + 151 765 p + 188 765 p + 225 765 p + 235 765 p + 260 765 p + 261 765 p + 119 764 p + 196 764 p + 217 764 p + 226 764 p + 242 764 p + 255 764 p + 121 763 p + 122 763 p + 146 763 p + 227 763 p + 254 763 p + 277 763 p + 284 763 p + 289 763 p + 124 762 p + 192 762 p + 196 762 p + 228 762 p + 229 762 p + 243 762 p + 290 762 p + 296 762 p + 317 762 p + 125 761 p + 183 761 p + 228 761 p + 229 761 p + 246 761 p + 290 761 p + 325 761 p + 127 760 p + 194 760 p + 218 760 p + 230 760 p + 240 760 p + 283 760 p + 314 760 p + 129 759 p + 174 759 p + 224 759 p + 231 759 p + 276 759 p + 318 759 p + 130 758 p + 131 758 p + 221 758 p + 232 758 p + 281 758 p + 286 758 p + 291 758 p + 315 758 p + 319 758 p + 131 757 p + 182 757 p + 198 757 p + 233 757 p + 286 757 p + 292 757 p + 302 757 p + 133 756 p + 199 756 p + 200 756 p + 234 756 p + 250 756 p + 315 756 p + 320 756 p + 336 756 p + 134 755 p + 135 755 p + 225 755 p + 235 755 p + 253 755 p + 260 755 p + 272 755 p + 293 755 p + 321 755 p + 144 754 p + 147 754 p + 175 754 p + 236 754 p + 282 754 p + 312 754 p + 147 753 p + 166 753 p + 224 753 p + 237 753 p + 244 753 p + 265 753 p + 288 753 p + 148 752 p + 205 752 p + 214 752 p + 238 752 p + 245 752 p + 281 752 p + 294 752 p + 307 752 p + 155 751 p + 165 751 p + 204 751 p + 239 751 p + 263 751 p + 303 751 p + 165 750 p + 218 750 p + 230 750 p + 240 750 p + 251 750 p + 300 750 p + 314 750 p + 358 750 p + 161 749 p + 173 749 p + 180 749 p + 241 749 p + 246 749 p + 299 749 p + 311 749 p + 316 749 p + 160 748 p + 193 748 p + 226 748 p + 242 748 p + 322 748 p + 192 747 p + 219 747 p + 228 747 p + 243 747 p + 284 747 p + 290 747 p + 309 747 p + 317 747 p + 359 747 p + 147 746 p + 212 746 p + 237 746 p + 244 746 p + 253 746 p + 265 746 p + 312 746 p + 323 746 p + 161 745 p + 222 745 p + 238 745 p + 245 745 p + 269 745 p + 316 745 p + 324 745 p + 217 744 p + 229 744 p + 241 744 p + 246 744 p + 255 744 p + 299 744 p + 311 744 p + 313 744 p + 325 744 p + 342 744 p + 354 744 p + 360 744 p + 388 744 p + 403 744 p + 111 743 p + 168 743 p + 202 743 p + 247 743 p + 299 743 p + 197 742 p + 199 742 p + 222 742 p + 248 742 p + 291 742 p + 326 742 p + 357 742 p + 182 741 p + 189 741 p + 201 741 p + 249 741 p + 258 741 p + 156 740 p + 159 740 p + 234 740 p + 250 740 p + 310 740 p + 327 740 p + 347 740 p + 153 739 p + 163 739 p + 240 739 p + 251 739 p + 300 739 p + 158 738 p + 175 738 p + 196 738 p + 252 738 p + 279 738 p + 328 738 p + 335 738 p + 345 738 p + 356 738 p + 224 737 p + 235 737 p + 244 737 p + 253 737 p + 272 737 p + 323 737 p + 329 737 p + 338 737 p + 190 736 p + 213 736 p + 227 736 p + 254 736 p + 277 736 p + 289 736 p + 301 736 p + 318 736 p + 330 736 p + 196 735 p + 226 735 p + 246 735 p + 255 735 p + 296 735 p + 328 735 p + 354 735 p + 422 735 p + 155 734 p + 156 734 p + 211 734 p + 256 734 p + 327 734 p + 348 734 p + 350 734 p + 156 733 p + 207 733 p + 216 733 p + 257 733 p + 295 733 p + 332 733 p + 347 733 p + 361 733 p + 166 732 p + 201 732 p + 249 732 p + 258 732 p + 276 732 p + 306 732 p + 331 732 p + 362 732 p + 170 731 p + 203 731 p + 219 731 p + 259 731 p + 262 731 p + 295 731 p + 317 731 p + 353 731 p + 363 731 p + 188 730 p + 225 730 p + 235 730 p + 260 730 p + 274 730 p + 285 730 p + 293 730 p + 321 730 p + 181 729 p + 202 729 p + 225 729 p + 261 729 p + 266 729 p + 275 729 p + 333 729 p + 341 729 p + 364 729 p + 170 728 p + 221 728 p + 259 728 p + 262 728 p + 278 728 p + 287 728 p + 320 728 p + 361 728 p + 363 728 p + 365 728 p + 375 728 p + 155 727 p + 176 727 p + 239 727 p + 263 727 p + 273 727 p + 327 727 p + 344 727 p + 350 727 p + 366 727 p + 101 726 p + 178 726 p + 181 726 p + 264 726 p + 274 726 p + 305 726 p + 334 726 p + 147 725 p + 237 725 p + 244 725 p + 265 725 p + 323 725 p + 332 725 p + 348 725 p + 367 725 p + 151 724 p + 213 724 p + 261 724 p + 266 724 p + 301 724 p + 321 724 p + 333 724 p + 153 723 p + 205 723 p + 209 723 p + 267 723 p + 305 723 p + 358 723 p + 368 723 p + 370 723 p + 158 722 p + 178 722 p + 220 722 p + 268 722 p + 298 722 p + 328 722 p + 369 722 p + 374 722 p + 387 722 p + 405 722 p + 161 721 p + 168 721 p + 245 721 p + 269 721 p + 271 721 p + 307 721 p + 349 721 p + 166 720 p + 201 720 p + 211 720 p + 270 720 p + 303 720 p + 331 720 p + 348 720 p + 355 720 p + 168 719 p + 205 719 p + 269 719 p + 271 719 p + 304 719 p + 370 719 p + 174 718 p + 235 718 p + 253 718 p + 272 718 p + 318 718 p + 338 718 p + 155 717 p + 176 717 p + 263 717 p + 273 717 p + 178 716 p + 260 716 p + 264 716 p + 274 716 p + 334 716 p + 341 716 p + 369 716 p + 371 716 p + 181 715 p + 195 715 p + 261 715 p + 275 715 p + 305 715 p + 182 714 p + 231 714 p + 258 714 p + 276 714 p + 306 714 p + 362 714 p + 372 714 p + 190 713 p + 227 713 p + 254 713 p + 277 713 p + 278 713 p + 292 713 p + 330 713 p + 191 712 p + 262 712 p + 277 712 p + 278 712 p + 287 712 p + 337 712 p + 343 712 p + 352 712 p + 196 711 p + 203 711 p + 252 711 p + 279 711 p + 296 711 p + 335 711 p + 353 711 p + 197 710 p + 206 710 p + 217 710 p + 280 710 p + 313 710 p + 198 709 p + 232 709 p + 238 709 p + 281 709 p + 319 709 p + 324 709 p + 339 709 p + 203 708 p + 207 708 p + 236 708 p + 282 708 p + 295 708 p + 335 708 p + 353 708 p + 142 707 p + 204 707 p + 230 707 p + 283 707 p + 297 707 p + 210 706 p + 227 706 p + 243 706 p + 284 706 p + 308 706 p + 343 706 p + 359 706 p + 377 706 p + 178 705 p + 212 705 p + 260 705 p + 285 705 p + 298 705 p + 215 704 p + 232 704 p + 233 704 p + 286 704 p + 292 704 p + 302 704 p + 337 704 p + 346 704 p + 351 704 p + 219 703 p + 262 703 p + 278 703 p + 287 703 p + 343 703 p + 166 702 p + 224 702 p + 237 702 p + 288 702 p + 338 702 p + 355 702 p + 210 701 p + 227 701 p + 254 701 p + 289 701 p + 301 701 p + 308 701 p + 330 701 p + 228 700 p + 229 700 p + 243 700 p + 290 700 p + 309 700 p + 222 699 p + 232 699 p + 248 699 p + 291 699 p + 319 699 p + 336 699 p + 233 698 p + 277 698 p + 286 698 p + 292 698 p + 337 698 p + 346 698 p + 212 697 p + 235 697 p + 260 697 p + 293 697 p + 329 697 p + 198 696 p + 205 696 p + 238 696 p + 294 696 p + 370 696 p + 373 696 p + 376 696 p + 390 696 p + 257 695 p + 259 695 p + 282 695 p + 295 695 p + 228 694 p + 255 694 p + 279 694 p + 296 694 p + 325 694 p + 345 694 p + 354 694 p + 406 694 p + 427 694 p + 428 694 p + 176 693 p + 206 693 p + 283 693 p + 297 693 p + 322 693 p + 344 693 p + 407 693 p + 212 692 p + 268 692 p + 285 692 p + 298 692 p + 369 692 p + 374 692 p + 395 692 p + 241 691 p + 246 691 p + 247 691 p + 299 691 p + 304 691 p + 309 691 p + 388 691 p + 408 691 p + 201 690 p + 240 690 p + 251 690 p + 300 690 p + 306 690 p + 358 690 p + 384 690 p + 386 690 p + 393 690 p + 400 690 p + 254 689 p + 266 689 p + 289 689 p + 301 689 p + 409 689 p + 430 689 p + 198 688 p + 233 688 p + 286 688 p + 302 688 p + 373 688 p + 201 687 p + 239 687 p + 270 687 p + 303 687 p + 350 687 p + 202 686 p + 271 686 p + 299 686 p + 304 686 p + 340 686 p + 264 685 p + 267 685 p + 275 685 p + 305 685 p + 341 685 p + 368 685 p + 258 684 p + 276 684 p + 300 684 p + 306 684 p + 362 684 p + 384 684 p + 401 684 p + 205 683 p + 238 683 p + 269 683 p + 307 683 p + 349 683 p + 210 682 p + 284 682 p + 289 682 p + 308 682 p + 340 682 p + 410 682 p + 447 682 p + 243 681 p + 290 681 p + 299 681 p + 309 681 p + 388 681 p + 402 681 p + 176 680 p + 199 680 p + 250 680 p + 310 680 p + 326 680 p + 336 680 p + 344 680 p + 404 680 p + 411 680 p + 197 679 p + 241 679 p + 246 679 p + 311 679 p + 342 679 p + 212 678 p + 236 678 p + 244 678 p + 312 678 p + 329 678 p + 332 678 p + 356 678 p + 367 678 p + 394 678 p + 217 677 p + 246 677 p + 280 677 p + 313 677 p + 360 677 p + 220 676 p + 230 676 p + 240 676 p + 314 676 p + 382 676 p + 391 676 p + 412 676 p + 413 676 p + 457 676 p + 221 675 p + 232 675 p + 234 675 p + 315 675 p + 320 675 p + 351 675 p + 222 674 p + 241 674 p + 245 674 p + 316 674 p + 324 674 p + 342 674 p + 349 674 p + 228 673 p + 243 673 p + 259 673 p + 317 673 p + 359 673 p + 398 673 p + 406 673 p + 231 672 p + 254 672 p + 272 672 p + 318 672 p + 372 672 p + 232 671 p + 281 671 p + 291 671 p + 319 671 p + 339 671 p + 351 671 p + 383 671 p + 392 671 p + 399 671 p + 234 670 p + 262 670 p + 315 670 p + 320 670 p + 365 670 p + 235 669 p + 260 669 p + 266 669 p + 321 669 p + 364 669 p + 371 669 p + 378 669 p + 220 668 p + 242 668 p + 297 668 p + 322 668 p + 387 668 p + 413 668 p + 458 668 p + 244 667 p + 253 667 p + 265 667 p + 323 667 p + 367 667 p + 379 667 p + 245 666 p + 281 666 p + 316 666 p + 324 666 p + 339 666 p + 229 665 p + 246 665 p + 296 665 p + 325 665 p + 197 664 p + 248 664 p + 310 664 p + 326 664 p + 357 664 p + 407 664 p + 411 664 p + 414 664 p + 250 663 p + 256 663 p + 263 663 p + 327 663 p + 347 663 p + 366 663 p + 252 662 p + 255 662 p + 268 662 p + 328 662 p + 345 662 p + 387 662 p + 253 661 p + 293 661 p + 312 661 p + 329 661 p + 378 661 p + 379 661 p + 395 661 p + 415 661 p + 451 661 p + 254 660 p + 277 660 p + 289 660 p + 330 660 p + 352 660 p + 409 660 p + 426 660 p + 201 659 p + 258 659 p + 270 659 p + 331 659 p + 384 659 p + 386 659 p + 389 659 p + 257 658 p + 265 658 p + 312 658 p + 332 658 p + 380 658 p + 396 658 p + 416 658 p + 439 658 p + 202 657 p + 261 657 p + 266 657 p + 333 657 p + 340 657 p + 220 656 p + 264 656 p + 274 656 p + 334 656 p + 368 656 p + 405 656 p + 417 656 p + 459 656 p + 252 655 p + 279 655 p + 282 655 p + 335 655 p + 356 655 p + 380 655 p + 234 654 p + 291 654 p + 310 654 p + 336 654 p + 383 654 p + 418 654 p + 463 654 p + 278 653 p + 286 653 p + 292 653 p + 337 653 p + 346 653 p + 375 653 p + 385 653 p + 253 652 p + 272 652 p + 288 652 p + 338 652 p + 379 652 p + 381 652 p + 397 652 p + 281 651 p + 319 651 p + 324 651 p + 339 651 p + 373 651 p + 376 651 p + 392 651 p + 304 650 p + 308 650 p + 333 650 p + 340 650 p + 402 650 p + 419 650 p + 261 649 p + 274 649 p + 305 649 p + 341 649 p + 364 649 p + 417 649 p + 419 649 p + 420 649 p + 438 649 p + 246 648 p + 311 648 p + 316 648 p + 342 648 p + 357 648 p + 360 648 p + 421 648 p + 456 648 p + 278 647 p + 284 647 p + 287 647 p + 343 647 p + 352 647 p + 363 647 p + 377 647 p + 263 646 p + 297 646 p + 310 646 p + 344 646 p + 412 646 p + 443 646 p + 252 645 p + 296 645 p + 328 645 p + 345 645 p + 422 645 p + 427 645 p + 431 645 p + 435 645 p + 286 644 p + 292 644 p + 337 644 p + 346 644 p + 401 644 p + 423 644 p + 454 644 p + 250 643 p + 257 643 p + 327 643 p + 347 643 p + 361 643 p + 396 643 p + 404 643 p + 460 643 p + 256 642 p + 265 642 p + 270 642 p + 348 642 p + 355 642 p + 396 642 p + 425 642 p + 269 641 p + 307 641 p + 316 641 p + 349 641 p + 421 641 p + 424 641 p + 256 640 p + 263 640 p + 303 640 p + 350 640 p + 366 640 p + 391 640 p + 425 640 p + 461 640 p + 286 639 p + 315 639 p + 319 639 p + 351 639 p + 383 639 p + 278 638 p + 330 638 p + 343 638 p + 352 638 p + 375 638 p + 385 638 p + 426 638 p + 259 637 p + 279 637 p + 282 637 p + 353 637 p + 398 637 p + 416 637 p + 427 637 p + 246 636 p + 255 636 p + 296 636 p + 354 636 p + 403 636 p + 428 636 p + 442 636 p + 270 635 p + 288 635 p + 348 635 p + 355 635 p + 381 635 p + 389 635 p + 429 635 p + 441 635 p + 452 635 p + 462 635 p + 252 634 p + 312 634 p + 335 634 p + 356 634 p + 374 634 p + 380 634 p + 248 633 p + 326 633 p + 342 633 p + 357 633 p + 392 633 p + 411 633 p + 414 633 p + 421 633 p + 463 633 p + 478 633 p + 240 632 p + 267 632 p + 300 632 p + 358 632 p + 382 632 p + 400 632 p + 434 632 p + 464 632 p + 243 631 p + 284 631 p + 317 631 p + 359 631 p + 377 631 p + 410 631 p + 246 630 p + 313 630 p + 342 630 p + 360 630 p + 403 630 p + 414 630 p + 456 630 p + 257 629 p + 262 629 p + 347 629 p + 361 629 p + 365 629 p + 416 629 p + 446 629 p + 465 629 p + 258 628 p + 276 628 p + 306 628 p + 362 628 p + 372 628 p + 397 628 p + 437 628 p + 259 627 p + 262 627 p + 343 627 p + 363 627 p + 398 627 p + 261 626 p + 321 626 p + 341 626 p + 364 626 p + 430 626 p + 438 626 p + 262 625 p + 320 625 p + 361 625 p + 365 625 p + 418 625 p + 263 624 p + 327 624 p + 350 624 p + 366 624 p + 391 624 p + 404 624 p + 461 624 p + 474 624 p + 265 623 p + 312 623 p + 323 623 p + 367 623 p + 394 623 p + 429 623 p + 267 622 p + 305 622 p + 334 622 p + 368 622 p + 382 622 p + 420 622 p + 268 621 p + 274 621 p + 298 621 p + 369 621 p + 371 621 p + 415 621 p + 445 621 p + 267 620 p + 271 620 p + 294 620 p + 370 620 p + 420 620 p + 424 620 p + 434 620 p + 436 620 p + 274 619 p + 321 619 p + 369 619 p + 371 619 p + 378 619 p + 415 619 p + 417 619 p + 438 619 p + 445 619 p + 276 618 p + 318 618 p + 362 618 p + 372 618 p + 423 618 p + 294 617 p + 302 617 p + 339 617 p + 373 617 p + 376 617 p + 390 617 p + 399 617 p + 268 616 p + 298 616 p + 356 616 p + 374 616 p + 395 616 p + 431 616 p + 444 616 p + 488 616 p + 262 615 p + 337 615 p + 352 615 p + 375 615 p + 385 615 p + 446 615 p + 467 615 p + 487 615 p + 294 614 p + 339 614 p + 373 614 p + 376 614 p + 390 614 p + 436 614 p + 466 614 p + 471 614 p + 284 613 p + 343 613 p + 359 613 p + 377 613 p + 426 613 p + 467 613 p + 321 612 p + 329 612 p + 371 612 p + 378 612 p + 451 612 p + 455 612 p + 485 612 p + 323 611 p + 329 611 p + 338 611 p + 379 611 p + 381 611 p + 394 611 p + 449 611 p + 452 611 p + 332 610 p + 335 610 p + 356 610 p + 380 610 p + 431 610 p + 439 610 p + 338 609 p + 355 609 p + 379 609 p + 381 609 p + 397 609 p + 449 609 p + 452 609 p + 314 608 p + 358 608 p + 368 608 p + 382 608 p + 434 608 p + 457 608 p + 503 608 p + 517 608 p + 319 607 p + 336 607 p + 351 607 p + 383 607 p + 418 607 p + 468 607 p + 300 606 p + 306 606 p + 331 606 p + 384 606 p + 386 606 p + 393 606 p + 433 606 p + 437 606 p + 441 606 p + 337 605 p + 352 605 p + 375 605 p + 385 605 p + 432 605 p + 468 605 p + 487 605 p + 498 605 p + 300 604 p + 331 604 p + 384 604 p + 386 604 p + 389 604 p + 400 604 p + 268 603 p + 322 603 p + 328 603 p + 387 603 p + 405 603 p + 435 603 p + 246 602 p + 299 602 p + 309 602 p + 388 602 p + 402 602 p + 408 602 p + 442 602 p + 469 602 p + 331 601 p + 355 601 p + 386 601 p + 389 601 p + 425 601 p + 433 601 p + 462 601 p + 470 601 p + 294 600 p + 373 600 p + 376 600 p + 390 600 p + 393 600 p + 314 599 p + 350 599 p + 366 599 p + 391 599 p + 470 599 p + 496 599 p + 497 599 p + 526 599 p + 319 598 p + 339 598 p + 357 598 p + 392 598 p + 399 598 p + 466 598 p + 300 597 p + 384 597 p + 390 597 p + 393 597 p + 401 597 p + 437 597 p + 454 597 p + 464 597 p + 471 597 p + 484 597 p + 486 597 p + 312 596 p + 367 596 p + 379 596 p + 394 596 p + 444 596 p + 481 596 p + 298 595 p + 329 595 p + 374 595 p + 395 595 p + 332 594 p + 347 594 p + 348 594 p + 396 594 p + 429 594 p + 461 594 p + 465 594 p + 482 594 p + 489 594 p + 545 594 p + 338 593 p + 362 593 p + 381 593 p + 397 593 p + 409 593 p + 317 592 p + 353 592 p + 363 592 p + 398 592 p + 406 592 p + 440 592 p + 450 592 p + 494 592 p + 319 591 p + 373 591 p + 392 591 p + 399 591 p + 468 591 p + 300 590 p + 358 590 p + 386 590 p + 400 590 p + 433 590 p + 457 590 p + 493 590 p + 306 589 p + 346 589 p + 393 589 p + 401 589 p + 423 589 p + 454 589 p + 309 588 p + 340 588 p + 388 588 p + 402 588 p + 408 588 p + 410 588 p + 419 588 p + 447 588 p + 448 588 p + 469 588 p + 472 588 p + 492 588 p + 504 588 p + 546 588 p + 568 588 p + 570 588 p + 246 587 p + 354 587 p + 360 587 p + 403 587 p + 407 587 p + 422 587 p + 453 587 p + 458 587 p + 473 587 p + 505 587 p + 310 586 p + 347 586 p + 366 586 p + 404 586 p + 460 586 p + 474 586 p + 268 585 p + 334 585 p + 387 585 p + 405 585 p + 413 585 p + 458 585 p + 488 585 p + 506 585 p + 296 584 p + 317 584 p + 398 584 p + 406 584 p + 440 584 p + 442 584 p + 448 584 p + 450 584 p + 507 584 p + 297 583 p + 326 583 p + 403 583 p + 407 583 p + 412 583 p + 443 583 p + 473 583 p + 475 583 p + 299 582 p + 388 582 p + 402 582 p + 408 582 p + 301 581 p + 330 581 p + 397 581 p + 409 581 p + 430 581 p + 432 581 p + 449 581 p + 479 581 p + 508 581 p + 308 580 p + 359 580 p + 402 580 p + 410 580 p + 440 580 p + 447 580 p + 448 580 p + 500 580 p + 310 579 p + 326 579 p + 357 579 p + 411 579 p + 443 579 p + 463 579 p + 491 579 p + 314 578 p + 344 578 p + 407 578 p + 412 578 p + 475 578 p + 314 577 p + 322 577 p + 405 577 p + 413 577 p + 509 577 p + 516 577 p + 326 576 p + 357 576 p + 360 576 p + 414 576 p + 456 576 p + 473 576 p + 329 575 p + 369 575 p + 371 575 p + 415 575 p + 451 575 p + 476 575 p + 332 574 p + 353 574 p + 361 574 p + 416 574 p + 439 574 p + 465 574 p + 520 574 p + 547 574 p + 334 573 p + 341 573 p + 371 573 p + 417 573 p + 445 573 p + 459 573 p + 336 572 p + 365 572 p + 383 572 p + 418 572 p + 446 572 p + 460 572 p + 477 572 p + 499 572 p + 340 571 p + 341 571 p + 402 571 p + 419 571 p + 424 571 p + 483 571 p + 492 571 p + 510 571 p + 531 571 p + 341 570 p + 368 570 p + 370 570 p + 420 570 p + 459 570 p + 483 570 p + 511 570 p + 517 570 p + 342 569 p + 349 569 p + 357 569 p + 421 569 p + 466 569 p + 469 569 p + 478 569 p + 255 568 p + 345 568 p + 403 568 p + 422 568 p + 428 568 p + 435 568 p + 346 567 p + 372 567 p + 401 567 p + 423 567 p + 432 567 p + 349 566 p + 370 566 p + 419 566 p + 424 566 p + 483 566 p + 492 566 p + 534 566 p + 348 565 p + 350 565 p + 389 565 p + 425 565 p + 462 565 p + 470 565 p + 330 564 p + 352 564 p + 377 564 p + 426 564 p + 479 564 p + 296 563 p + 345 563 p + 353 563 p + 427 563 p + 450 563 p + 480 563 p + 296 562 p + 354 562 p + 422 562 p + 428 562 p + 453 562 p + 355 561 p + 367 561 p + 396 561 p + 429 561 p + 482 561 p + 548 561 p + 562 561 p + 301 560 p + 364 560 p + 409 560 p + 430 560 p + 472 560 p + 485 560 p + 345 559 p + 374 559 p + 380 559 p + 431 559 p + 444 559 p + 480 559 p + 490 559 p + 501 559 p + 385 558 p + 409 558 p + 423 558 p + 432 558 p + 384 557 p + 389 557 p + 400 557 p + 433 557 p + 464 557 p + 484 557 p + 493 557 p + 358 556 p + 370 556 p + 382 556 p + 434 556 p + 436 556 p + 503 556 p + 345 555 p + 387 555 p + 422 555 p + 435 555 p + 480 555 p + 490 555 p + 370 554 p + 376 554 p + 434 554 p + 436 554 p + 471 554 p + 519 554 p + 530 554 p + 362 553 p + 384 553 p + 393 553 p + 437 553 p + 441 553 p + 484 553 p + 486 553 p + 508 553 p + 341 552 p + 364 552 p + 371 552 p + 438 552 p + 455 552 p + 510 552 p + 511 552 p + 332 551 p + 380 551 p + 416 551 p + 439 551 p + 482 551 p + 398 550 p + 406 550 p + 410 550 p + 440 550 p + 512 550 p + 535 550 p + 355 549 p + 384 549 p + 437 549 p + 441 549 p + 513 549 p + 354 548 p + 388 548 p + 406 548 p + 442 548 p + 453 548 p + 502 548 p + 504 548 p + 344 547 p + 407 547 p + 411 547 p + 443 547 p + 496 547 p + 518 547 p + 374 546 p + 394 546 p + 431 546 p + 444 546 p + 476 546 p + 481 546 p + 549 546 p + 558 546 p + 369 545 p + 371 545 p + 417 545 p + 445 545 p + 455 545 p + 476 545 p + 495 545 p + 361 544 p + 375 544 p + 418 544 p + 446 544 p + 467 544 p + 494 544 p + 540 544 p + 543 544 p + 550 544 p + 308 543 p + 402 543 p + 410 543 p + 447 543 p + 472 543 p + 479 543 p + 500 543 p + 402 542 p + 406 542 p + 410 542 p + 448 542 p + 500 542 p + 514 542 p + 379 541 p + 381 541 p + 409 541 p + 449 541 p + 485 541 p + 508 541 p + 537 541 p + 398 540 p + 406 540 p + 427 540 p + 450 540 p + 501 540 p + 514 540 p + 329 539 p + 378 539 p + 415 539 p + 451 539 p + 481 539 p + 355 538 p + 379 538 p + 381 538 p + 452 538 p + 513 538 p + 548 538 p + 403 537 p + 428 537 p + 442 537 p + 453 537 p + 507 537 p + 539 537 p + 565 537 p + 346 536 p + 393 536 p + 401 536 p + 454 536 p + 378 535 p + 438 535 p + 445 535 p + 455 535 p + 515 535 p + 524 535 p + 529 535 p + 342 534 p + 360 534 p + 414 534 p + 456 534 p + 478 534 p + 502 534 p + 314 533 p + 382 533 p + 400 533 p + 457 533 p + 509 533 p + 516 533 p + 525 533 p + 541 533 p + 575 533 p + 579 533 p + 587 533 p + 322 532 p + 403 532 p + 405 532 p + 458 532 p + 475 532 p + 505 532 p + 506 532 p + 536 532 p + 557 532 p + 597 532 p + 334 531 p + 417 531 p + 420 531 p + 459 531 p + 506 531 p + 509 531 p + 511 531 p + 517 531 p + 551 531 p + 347 530 p + 404 530 p + 418 530 p + 460 530 p + 474 530 p + 518 530 p + 533 530 p + 543 530 p + 545 530 p + 350 529 p + 366 529 p + 396 529 p + 461 529 p + 489 529 p + 355 528 p + 389 528 p + 425 528 p + 462 528 p + 489 528 p + 513 528 p + 336 527 p + 357 527 p + 411 527 p + 463 527 p + 477 527 p + 491 527 p + 533 527 p + 358 526 p + 393 526 p + 433 526 p + 464 526 p + 503 526 p + 519 526 p + 532 526 p + 361 525 p + 396 525 p + 416 525 p + 465 525 p + 520 525 p + 543 525 p + 552 525 p + 376 524 p + 392 524 p + 421 524 p + 466 524 p + 530 524 p + 534 524 p + 542 524 p + 553 524 p + 559 524 p + 591 524 p + 375 523 p + 377 523 p + 446 523 p + 467 523 p + 494 523 p + 498 523 p + 512 523 p + 528 523 p + 550 523 p + 383 522 p + 385 522 p + 399 522 p + 468 522 p + 477 522 p + 487 522 p + 554 522 p + 388 521 p + 402 521 p + 421 521 p + 469 521 p + 502 521 p + 538 521 p + 568 521 p + 389 520 p + 391 520 p + 425 520 p + 470 520 p + 493 520 p + 376 519 p + 393 519 p + 436 519 p + 471 519 p + 553 519 p + 555 519 p + 582 519 p + 402 518 p + 430 518 p + 447 518 p + 472 518 p + 510 518 p + 522 518 p + 523 518 p + 546 518 p + 403 517 p + 407 517 p + 414 517 p + 473 517 p + 505 517 p + 527 517 p + 556 517 p + 602 517 p + 366 516 p + 404 516 p + 460 516 p + 474 516 p + 496 516 p + 497 516 p + 544 516 p + 407 515 p + 412 515 p + 458 515 p + 475 515 p + 516 515 p + 526 515 p + 556 515 p + 557 515 p + 592 515 p + 617 515 p + 415 514 p + 444 514 p + 445 514 p + 476 514 p + 488 514 p + 495 514 p + 558 514 p + 418 513 p + 463 513 p + 468 513 p + 477 513 p + 499 513 p + 533 513 p + 553 513 p + 559 513 p + 357 512 p + 421 512 p + 456 512 p + 478 512 p + 491 512 p + 527 512 p + 560 512 p + 409 511 p + 426 511 p + 447 511 p + 479 511 p + 521 511 p + 427 510 p + 431 510 p + 435 510 p + 480 510 p + 501 510 p + 507 510 p + 394 509 p + 444 509 p + 451 509 p + 481 509 p + 515 509 p + 537 509 p + 548 509 p + 561 509 p + 396 508 p + 429 508 p + 439 508 p + 482 508 p + 547 508 p + 549 508 p + 552 508 p + 562 508 p + 419 507 p + 420 507 p + 424 507 p + 483 507 p + 530 507 p + 531 507 p + 566 507 p + 593 507 p + 595 507 p + 604 507 p + 393 506 p + 433 506 p + 437 506 p + 484 506 p + 486 506 p + 532 506 p + 583 506 p + 378 505 p + 430 505 p + 449 505 p + 485 505 p + 515 505 p + 563 505 p + 393 504 p + 437 504 p + 484 504 p + 486 504 p + 554 504 p + 555 504 p + 594 504 p + 616 504 p + 375 503 p + 385 503 p + 468 503 p + 487 503 p + 498 503 p + 499 503 p + 540 503 p + 374 502 p + 405 502 p + 476 502 p + 488 502 p + 490 502 p + 495 502 p + 536 502 p + 558 502 p + 396 501 p + 461 501 p + 462 501 p + 489 501 p + 497 501 p + 584 501 p + 586 501 p + 431 500 p + 435 500 p + 488 500 p + 490 500 p + 539 500 p + 569 500 p + 411 499 p + 463 499 p + 478 499 p + 491 499 p + 518 499 p + 560 499 p + 402 498 p + 419 498 p + 424 498 p + 492 498 p + 546 498 p + 568 498 p + 595 498 p + 400 497 p + 433 497 p + 470 497 p + 493 497 p + 532 497 p + 575 497 p + 584 497 p + 605 497 p + 398 496 p + 446 496 p + 467 496 p + 494 496 p + 520 496 p + 535 496 p + 550 496 p + 445 495 p + 476 495 p + 488 495 p + 495 495 p + 524 495 p + 574 495 p + 391 494 p + 443 494 p + 474 494 p + 496 494 p + 526 494 p + 544 494 p + 391 493 p + 474 493 p + 489 493 p + 497 493 p + 385 492 p + 467 492 p + 487 492 p + 498 492 p + 528 492 p + 576 492 p + 620 492 p + 418 491 p + 477 491 p + 487 491 p + 499 491 p + 540 491 p + 589 491 p + 410 490 p + 447 490 p + 448 490 p + 500 490 p + 512 490 p + 431 489 p + 450 489 p + 480 489 p + 501 489 p + 547 489 p + 564 489 p + 569 489 p + 572 489 p + 442 488 p + 456 488 p + 469 488 p + 502 488 p + 504 488 p + 527 488 p + 538 488 p + 565 488 p + 382 487 p + 434 487 p + 464 487 p + 503 487 p + 519 487 p + 541 487 p + 566 487 p + 571 487 p + 402 486 p + 442 486 p + 502 486 p + 504 486 p + 596 486 p + 606 486 p + 618 486 p + 643 486 p + 403 485 p + 458 485 p + 473 485 p + 505 485 p + 597 485 p + 405 484 p + 458 484 p + 459 484 p + 506 484 p + 536 484 p + 551 484 p + 581 484 p + 598 484 p + 406 483 p + 453 483 p + 480 483 p + 507 483 p + 514 483 p + 409 482 p + 437 482 p + 449 482 p + 508 482 p + 521 482 p + 563 482 p + 594 482 p + 413 481 p + 457 481 p + 459 481 p + 509 481 p + 525 481 p + 419 480 p + 438 480 p + 472 480 p + 510 480 p + 529 480 p + 531 480 p + 593 480 p + 420 479 p + 438 479 p + 459 479 p + 511 479 p + 524 479 p + 593 479 p + 440 478 p + 467 478 p + 500 478 p + 512 478 p + 521 478 p + 522 478 p + 528 478 p + 596 478 p + 603 478 p + 441 477 p + 452 477 p + 462 477 p + 513 477 p + 583 477 p + 584 477 p + 599 477 p + 619 477 p + 633 477 p + 448 476 p + 450 476 p + 507 476 p + 514 476 p + 535 476 p + 564 476 p + 596 476 p + 455 475 p + 481 475 p + 485 475 p + 515 475 p + 537 475 p + 561 475 p + 563 475 p + 590 475 p + 600 475 p + 413 474 p + 457 474 p + 475 474 p + 516 474 p + 557 474 p + 581 474 p + 587 474 p + 382 473 p + 420 473 p + 459 473 p + 517 473 p + 525 473 p + 551 473 p + 443 472 p + 460 472 p + 491 472 p + 518 472 p + 544 472 p + 556 472 p + 588 472 p + 436 471 p + 464 471 p + 503 471 p + 519 471 p + 580 471 p + 416 470 p + 465 470 p + 494 470 p + 520 470 p + 567 470 p + 578 470 p + 479 469 p + 508 469 p + 512 469 p + 521 469 p + 522 469 p + 523 469 p + 603 469 p + 620 469 p + 627 469 p + 644 469 p + 651 469 p + 472 468 p + 512 468 p + 521 468 p + 522 468 p + 523 468 p + 570 468 p + 577 468 p + 472 467 p + 521 467 p + 522 467 p + 523 467 p + 577 467 p + 627 467 p + 628 467 p + 644 467 p + 455 466 p + 495 466 p + 511 466 p + 524 466 p + 529 466 p + 590 466 p + 624 466 p + 645 466 p + 457 465 p + 509 465 p + 517 465 p + 525 465 p + 579 465 p + 391 464 p + 475 464 p + 496 464 p + 526 464 p + 587 464 p + 601 464 p + 473 463 p + 478 463 p + 502 463 p + 527 463 p + 538 463 p + 565 463 p + 573 463 p + 602 463 p + 467 462 p + 498 462 p + 512 462 p + 528 462 p + 585 462 p + 603 462 p + 620 462 p + 639 462 p + 455 461 p + 510 461 p + 524 461 p + 529 461 p + 590 461 p + 624 461 p + 628 461 p + 436 460 p + 466 460 p + 483 460 p + 530 460 p + 534 460 p + 582 460 p + 604 460 p + 419 459 p + 483 459 p + 510 459 p + 531 459 p + 595 459 p + 464 458 p + 484 458 p + 493 458 p + 532 458 p + 541 458 p + 571 458 p + 583 458 p + 605 458 p + 630 458 p + 632 458 p + 460 457 p + 463 457 p + 477 457 p + 533 457 p + 559 457 p + 588 457 p + 589 457 p + 629 457 p + 424 456 p + 466 456 p + 530 456 p + 534 456 p + 542 456 p + 440 455 p + 494 455 p + 514 455 p + 535 455 p + 567 455 p + 458 454 p + 488 454 p + 506 454 p + 536 454 p + 539 454 p + 574 454 p + 598 454 p + 622 454 p + 659 454 p + 449 453 p + 481 453 p + 515 453 p + 537 453 p + 469 452 p + 502 452 p + 527 452 p + 538 452 p + 542 452 p + 606 452 p + 453 451 p + 490 451 p + 536 451 p + 539 451 p + 564 451 p + 607 451 p + 659 451 p + 446 450 p + 487 450 p + 499 450 p + 540 450 p + 576 450 p + 585 450 p + 608 450 p + 457 449 p + 503 449 p + 532 449 p + 541 449 p + 575 449 p + 609 449 p + 466 448 p + 534 448 p + 538 448 p + 542 448 p + 591 448 p + 621 448 p + 626 448 p + 446 447 p + 460 447 p + 465 447 p + 543 447 p + 589 447 p + 610 447 p + 613 447 p + 665 447 p + 474 446 p + 496 446 p + 518 446 p + 544 446 p + 545 446 p + 588 446 p + 592 446 p + 610 446 p + 635 446 p + 637 446 p + 396 445 p + 460 445 p + 544 445 p + 545 445 p + 586 445 p + 610 445 p + 402 444 p + 472 444 p + 492 444 p + 546 444 p + 570 444 p + 577 444 p + 618 444 p + 416 443 p + 482 443 p + 501 443 p + 547 443 p + 549 443 p + 552 443 p + 611 443 p + 429 442 p + 452 442 p + 481 442 p + 548 442 p + 562 442 p + 599 442 p + 612 442 p + 444 441 p + 482 441 p + 547 441 p + 549 441 p + 572 441 p + 611 441 p + 446 440 p + 467 440 p + 494 440 p + 550 440 p + 578 440 p + 585 440 p + 459 439 p + 506 439 p + 517 439 p + 551 439 p + 566 439 p + 579 439 p + 581 439 p + 631 439 p + 645 439 p + 646 439 p + 691 439 p + 716 439 p + 465 438 p + 482 438 p + 547 438 p + 552 438 p + 611 438 p + 613 438 p + 638 438 p + 647 438 p + 466 437 p + 471 437 p + 477 437 p + 553 437 p + 554 437 p + 582 437 p + 614 437 p + 468 436 p + 486 436 p + 553 436 p + 554 436 p + 555 436 p + 576 436 p + 615 436 p + 616 436 p + 471 435 p + 486 435 p + 554 435 p + 555 435 p + 580 435 p + 615 435 p + 616 435 p + 473 434 p + 475 434 p + 518 434 p + 556 434 p + 573 434 p + 592 434 p + 602 434 p + 617 434 p + 625 434 p + 648 434 p + 692 434 p + 458 433 p + 475 433 p + 516 433 p + 557 433 p + 597 433 p + 598 433 p + 617 433 p + 660 433 p + 444 432 p + 476 432 p + 488 432 p + 558 432 p + 561 432 p + 569 432 p + 574 432 p + 466 431 p + 477 431 p + 533 431 p + 559 431 p + 560 431 p + 629 431 p + 649 431 p + 478 430 p + 491 430 p + 559 430 p + 560 430 p + 573 430 p + 626 430 p + 481 429 p + 515 429 p + 558 429 p + 561 429 p + 612 429 p + 623 429 p + 650 429 p + 429 428 p + 482 428 p + 548 428 p + 562 428 p + 640 428 p + 485 427 p + 508 427 p + 515 427 p + 563 427 p + 600 427 p + 619 427 p + 651 427 p + 501 426 p + 514 426 p + 539 426 p + 564 426 p + 567 426 p + 607 426 p + 652 426 p + 653 426 p + 658 426 p + 664 426 p + 686 426 p + 693 426 p + 453 425 p + 502 425 p + 527 425 p + 565 425 p + 606 425 p + 607 425 p + 625 425 p + 483 424 p + 503 424 p + 551 424 p + 566 424 p + 571 424 p + 609 424 p + 642 424 p + 520 423 p + 535 423 p + 564 423 p + 567 423 p + 578 423 p + 641 423 p + 652 423 p + 653 423 p + 686 423 p + 690 423 p + 694 423 p + 402 422 p + 469 422 p + 492 422 p + 568 422 p + 618 422 p + 490 421 p + 501 421 p + 558 421 p + 569 421 p + 572 421 p + 622 421 p + 402 420 p + 522 420 p + 546 420 p + 570 420 p + 503 419 p + 532 419 p + 566 419 p + 571 419 p + 580 419 p + 630 419 p + 642 419 p + 501 418 p + 549 418 p + 569 418 p + 572 418 p + 652 418 p + 654 418 p + 527 417 p + 556 417 p + 560 417 p + 573 417 p + 648 417 p + 495 416 p + 536 416 p + 558 416 p + 574 416 p + 622 416 p + 645 416 p + 650 416 p + 457 415 p + 493 415 p + 541 415 p + 575 415 p + 632 415 p + 498 414 p + 540 414 p + 554 414 p + 576 414 p + 614 414 p + 634 414 p + 655 414 p + 695 414 p + 522 413 p + 523 413 p + 546 413 p + 577 413 p + 627 413 p + 643 413 p + 656 413 p + 669 413 p + 670 413 p + 696 413 p + 520 412 p + 550 412 p + 567 412 p + 578 412 p + 608 412 p + 613 412 p + 641 412 p + 457 411 p + 525 411 p + 551 411 p + 579 411 p + 609 411 p + 519 410 p + 555 410 p + 571 410 p + 580 410 p + 636 410 p + 506 409 p + 516 409 p + 551 409 p + 581 409 p + 631 409 p + 471 408 p + 530 408 p + 553 408 p + 582 408 p + 591 408 p + 615 408 p + 636 408 p + 657 408 p + 484 407 p + 513 407 p + 532 407 p + 583 407 p + 594 407 p + 630 407 p + 633 407 p + 671 407 p + 489 406 p + 493 406 p + 513 406 p + 584 406 p + 586 406 p + 599 406 p + 601 406 p + 605 406 p + 633 406 p + 640 406 p + 680 406 p + 697 406 p + 528 405 p + 540 405 p + 550 405 p + 585 405 p + 639 405 p + 641 405 p + 489 404 p + 545 404 p + 584 404 p + 586 404 p + 637 404 p + 638 404 p + 640 404 p + 683 404 p + 457 403 p + 516 403 p + 526 403 p + 587 403 p + 601 403 p + 631 403 p + 667 403 p + 518 402 p + 533 402 p + 544 402 p + 588 402 p + 648 402 p + 676 402 p + 698 402 p + 739 402 p + 499 401 p + 533 401 p + 543 401 p + 589 401 p + 608 401 p + 614 401 p + 629 401 p + 668 401 p + 698 401 p + 699 401 p + 715 401 p + 515 400 p + 524 400 p + 529 400 p + 590 400 p + 628 400 p + 677 400 p + 685 400 p + 733 400 p + 466 399 p + 542 399 p + 582 399 p + 591 399 p + 626 399 p + 657 399 p + 662 399 p + 663 399 p + 682 399 p + 740 399 p + 475 398 p + 544 398 p + 556 398 p + 592 398 p + 483 397 p + 510 397 p + 511 397 p + 593 397 p + 624 397 p + 656 397 p + 486 396 p + 508 396 p + 583 396 p + 594 396 p + 619 396 p + 655 396 p + 483 395 p + 492 395 p + 531 395 p + 595 395 p + 604 395 p + 621 395 p + 656 395 p + 662 395 p + 504 394 p + 512 394 p + 514 394 p + 596 394 p + 653 394 p + 658 394 p + 661 394 p + 670 394 p + 672 394 p + 458 393 p + 505 393 p + 557 393 p + 597 393 p + 659 393 p + 660 393 p + 506 392 p + 536 392 p + 557 392 p + 598 392 p + 660 392 p + 681 392 p + 684 392 p + 700 392 p + 513 391 p + 548 391 p + 584 391 p + 599 391 p + 600 391 p + 612 391 p + 697 391 p + 701 391 p + 712 391 p + 722 391 p + 515 390 p + 563 390 p + 599 390 p + 600 390 p + 677 390 p + 687 390 p + 702 390 p + 526 389 p + 584 389 p + 587 389 p + 601 389 p + 635 389 p + 637 389 p + 666 389 p + 674 389 p + 728 389 p + 743 389 p + 473 388 p + 527 388 p + 556 388 p + 602 388 p + 512 387 p + 521 387 p + 528 387 p + 603 387 p + 661 387 p + 670 387 p + 675 387 p + 703 387 p + 483 386 p + 530 386 p + 595 386 p + 604 386 p + 646 386 p + 662 386 p + 682 386 p + 704 386 p + 713 386 p + 493 385 p + 532 385 p + 584 385 p + 605 385 p + 632 385 p + 674 385 p + 504 384 p + 538 384 p + 565 384 p + 606 384 p + 658 384 p + 663 384 p + 688 384 p + 705 384 p + 735 384 p + 764 384 p + 539 383 p + 564 383 p + 565 383 p + 607 383 p + 625 383 p + 664 383 p + 706 383 p + 540 382 p + 578 382 p + 589 382 p + 608 382 p + 665 382 p + 678 382 p + 541 381 p + 566 381 p + 579 381 p + 609 381 p + 642 381 p + 666 381 p + 679 381 p + 689 381 p + 543 380 p + 544 380 p + 545 380 p + 610 380 p + 638 380 p + 698 380 p + 707 380 p + 547 379 p + 549 379 p + 552 379 p + 611 379 p + 623 379 p + 647 379 p + 701 379 p + 708 379 p + 548 378 p + 561 378 p + 599 378 p + 612 378 p + 623 378 p + 543 377 p + 552 377 p + 578 377 p + 613 377 p + 647 377 p + 665 377 p + 553 376 p + 576 376 p + 589 376 p + 614 376 p + 634 376 p + 657 376 p + 668 376 p + 554 375 p + 555 375 p + 582 375 p + 615 375 p + 634 375 p + 636 375 p + 486 374 p + 554 374 p + 555 374 p + 616 374 p + 711 374 p + 475 373 p + 556 373 p + 557 373 p + 617 373 p + 635 373 p + 667 373 p + 673 373 p + 504 372 p + 546 372 p + 568 372 p + 618 372 p + 621 372 p + 643 372 p + 513 371 p + 563 371 p + 594 371 p + 619 371 p + 651 371 p + 671 371 p + 702 371 p + 498 370 p + 521 370 p + 528 370 p + 620 370 p + 639 370 p + 695 370 p + 703 370 p + 542 369 p + 595 369 p + 618 369 p + 621 369 p + 663 369 p + 705 369 p + 536 368 p + 569 368 p + 574 368 p + 622 368 p + 650 368 p + 654 368 p + 664 368 p + 709 368 p + 718 368 p + 561 367 p + 611 367 p + 612 367 p + 623 367 p + 654 367 p + 687 367 p + 708 367 p + 524 366 p + 529 366 p + 593 366 p + 624 366 p + 685 366 p + 691 366 p + 556 365 p + 565 365 p + 607 365 p + 625 365 p + 673 365 p + 688 365 p + 706 365 p + 710 365 p + 542 364 p + 560 364 p + 591 364 p + 626 364 p + 521 363 p + 523 363 p + 577 363 p + 627 363 p + 644 363 p + 675 363 p + 523 362 p + 529 362 p + 590 362 p + 628 362 p + 669 362 p + 685 362 p + 533 361 p + 559 361 p + 589 361 p + 629 361 p + 649 361 p + 532 360 p + 571 360 p + 583 360 p + 630 360 p + 679 360 p + 711 360 p + 551 359 p + 581 359 p + 587 359 p + 631 359 p + 681 359 p + 684 359 p + 716 359 p + 741 359 p + 753 359 p + 532 358 p + 575 358 p + 605 358 p + 632 358 p + 666 358 p + 679 358 p + 513 357 p + 583 357 p + 584 357 p + 633 357 p + 671 357 p + 697 357 p + 576 356 p + 614 356 p + 615 356 p + 634 356 p + 655 356 p + 668 356 p + 723 356 p + 724 356 p + 730 356 p + 738 356 p + 742 356 p + 787 356 p + 831 356 p + 544 355 p + 601 355 p + 617 355 p + 635 355 p + 667 355 p + 676 355 p + 728 355 p + 580 354 p + 582 354 p + 615 354 p + 636 354 p + 723 354 p + 544 353 p + 586 353 p + 601 353 p + 637 353 p + 676 353 p + 680 353 p + 707 353 p + 743 353 p + 552 352 p + 586 352 p + 610 352 p + 638 352 p + 683 352 p + 707 352 p + 528 351 p + 585 351 p + 620 351 p + 639 351 p + 678 351 p + 562 350 p + 584 350 p + 586 350 p + 640 350 p + 680 350 p + 683 350 p + 567 349 p + 578 349 p + 585 349 p + 641 349 p + 661 349 p + 694 349 p + 566 348 p + 571 348 p + 609 348 p + 642 348 p + 646 348 p + 689 348 p + 713 348 p + 504 347 p + 577 347 p + 618 347 p + 643 347 p + 672 347 p + 521 346 p + 523 346 p + 627 346 p + 644 346 p + 669 346 p + 677 346 p + 744 346 p + 524 345 p + 551 345 p + 574 345 p + 645 345 p + 681 345 p + 551 344 p + 604 344 p + 642 344 p + 646 344 p + 689 344 p + 691 344 p + 704 344 p + 714 344 p + 745 344 p + 552 343 p + 611 343 p + 613 343 p + 647 343 p + 690 343 p + 719 343 p + 727 343 p + 746 343 p + 767 343 p + 556 342 p + 573 342 p + 588 342 p + 648 342 p + 649 342 p + 688 342 p + 559 341 p + 629 341 p + 648 341 p + 649 341 p + 724 341 p + 739 341 p + 740 341 p + 747 341 p + 754 341 p + 785 341 p + 561 340 p + 574 340 p + 622 340 p + 650 340 p + 687 340 p + 718 340 p + 732 340 p + 521 339 p + 563 339 p + 619 339 p + 651 339 p + 744 339 p + 748 339 p + 758 339 p + 564 338 p + 567 338 p + 572 338 p + 652 338 p + 690 338 p + 564 337 p + 567 337 p + 596 337 p + 653 337 p + 686 337 p + 572 336 p + 622 336 p + 623 336 p + 654 336 p + 708 336 p + 709 336 p + 720 336 p + 749 336 p + 576 335 p + 594 335 p + 634 335 p + 655 335 p + 695 335 p + 577 334 p + 593 334 p + 595 334 p + 656 334 p + 696 334 p + 704 334 p + 725 334 p + 582 333 p + 591 333 p + 614 333 p + 657 333 p + 564 332 p + 596 332 p + 606 332 p + 658 332 p + 672 332 p + 693 332 p + 706 332 p + 735 332 p + 750 332 p + 762 332 p + 792 332 p + 536 331 p + 539 331 p + 597 331 p + 659 331 p + 700 331 p + 557 330 p + 597 330 p + 598 330 p + 660 330 p + 673 330 p + 684 330 p + 596 329 p + 603 329 p + 641 329 p + 661 329 p + 678 329 p + 750 329 p + 751 329 p + 770 329 p + 795 329 p + 591 328 p + 595 328 p + 604 328 p + 662 328 p + 682 328 p + 752 328 p + 591 327 p + 606 327 p + 621 327 p + 663 327 p + 740 327 p + 752 327 p + 764 327 p + 765 327 p + 564 326 p + 607 326 p + 622 326 p + 664 326 p + 693 326 p + 709 326 p + 543 325 p + 608 325 p + 613 325 p + 665 325 p + 699 325 p + 601 324 p + 609 324 p + 632 324 p + 666 324 p + 674 324 p + 741 324 p + 587 323 p + 617 323 p + 635 323 p + 667 323 p + 728 323 p + 753 323 p + 589 322 p + 614 322 p + 634 322 p + 668 322 p + 715 322 p + 729 322 p + 754 322 p + 577 321 p + 628 321 p + 644 321 p + 669 321 p + 717 321 p + 726 321 p + 769 321 p + 577 320 p + 596 320 p + 603 320 p + 670 320 p + 675 320 p + 726 320 p + 751 320 p + 776 320 p + 583 319 p + 619 319 p + 633 319 p + 671 319 p + 711 319 p + 734 319 p + 738 319 p + 755 319 p + 825 319 p + 596 318 p + 643 318 p + 658 318 p + 672 318 p + 696 318 p + 705 318 p + 750 318 p + 776 318 p + 617 317 p + 625 317 p + 660 317 p + 673 317 p + 700 317 p + 753 317 p + 756 317 p + 768 317 p + 771 317 p + 784 317 p + 601 316 p + 605 316 p + 666 316 p + 674 316 p + 755 316 p + 603 315 p + 627 315 p + 670 315 p + 675 315 p + 588 314 p + 635 314 p + 637 314 p + 676 314 p + 692 314 p + 757 314 p + 772 314 p + 798 314 p + 803 314 p + 590 313 p + 600 313 p + 644 313 p + 677 313 p + 702 313 p + 744 313 p + 758 313 p + 763 313 p + 769 313 p + 814 313 p + 608 312 p + 639 312 p + 661 312 p + 678 312 p + 742 312 p + 759 312 p + 770 312 p + 777 312 p + 609 311 p + 630 311 p + 632 311 p + 679 311 p + 731 311 p + 584 310 p + 637 310 p + 640 310 p + 680 310 p + 734 310 p + 743 310 p + 757 310 p + 778 310 p + 799 310 p + 598 309 p + 631 309 p + 645 309 p + 681 309 p + 718 309 p + 732 309 p + 760 309 p + 786 309 p + 800 309 p + 847 309 p + 591 308 p + 604 308 p + 662 308 p + 682 308 p + 713 308 p + 723 308 p + 737 308 p + 761 308 p + 783 308 p + 586 307 p + 638 307 p + 640 307 p + 683 307 p + 701 307 p + 721 307 p + 767 307 p + 598 306 p + 631 306 p + 660 306 p + 684 306 p + 760 306 p + 590 305 p + 624 305 p + 628 305 p + 685 305 p + 717 305 p + 733 305 p + 769 305 p + 564 304 p + 567 304 p + 653 304 p + 686 304 p + 694 304 p + 762 304 p + 801 304 p + 600 303 p + 623 303 p + 650 303 p + 687 303 p + 712 303 p + 720 303 p + 722 303 p + 763 303 p + 606 302 p + 625 302 p + 648 302 p + 688 302 p + 692 302 p + 736 302 p + 747 302 p + 764 302 p + 768 302 p + 781 302 p + 802 302 p + 609 301 p + 642 301 p + 646 301 p + 689 301 p + 716 301 p + 731 301 p + 745 301 p + 567 300 p + 647 300 p + 652 300 p + 690 300 p + 719 300 p + 551 299 p + 624 299 p + 646 299 p + 691 299 p + 717 299 p + 793 299 p + 800 299 p + 556 298 p + 676 298 p + 688 298 p + 692 298 p + 739 298 p + 756 298 p + 768 298 p + 803 298 p + 564 297 p + 658 297 p + 664 297 p + 693 297 p + 762 297 p + 773 297 p + 567 296 p + 641 296 p + 686 296 p + 694 296 p + 746 296 p + 576 295 p + 620 295 p + 655 295 p + 695 295 p + 703 295 p + 577 294 p + 656 294 p + 672 294 p + 696 294 p + 725 294 p + 726 294 p + 789 294 p + 804 294 p + 584 293 p + 599 293 p + 633 293 p + 697 293 p + 734 293 p + 588 292 p + 589 292 p + 610 292 p + 698 292 p + 699 292 p + 715 292 p + 772 292 p + 589 291 p + 665 291 p + 698 291 p + 699 291 p + 727 291 p + 729 291 p + 598 290 p + 659 290 p + 673 290 p + 700 290 p + 710 290 p + 760 290 p + 771 290 p + 775 290 p + 599 289 p + 611 289 p + 683 289 p + 701 289 p + 721 289 p + 600 288 p + 619 288 p + 677 288 p + 702 288 p + 712 288 p + 758 288 p + 603 287 p + 620 287 p + 695 287 p + 703 287 p + 748 287 p + 751 287 p + 759 287 p + 604 286 p + 646 286 p + 656 286 p + 704 286 p + 714 286 p + 737 286 p + 793 286 p + 606 285 p + 621 285 p + 672 285 p + 705 285 p + 725 285 p + 735 285 p + 752 285 p + 765 285 p + 789 285 p + 607 284 p + 625 284 p + 658 284 p + 706 284 p + 710 284 p + 610 283 p + 637 283 p + 638 283 p + 707 283 p + 727 283 p + 757 283 p + 611 282 p + 623 282 p + 654 282 p + 708 282 p + 719 282 p + 720 282 p + 721 282 p + 766 282 p + 622 281 p + 654 281 p + 664 281 p + 709 281 p + 749 281 p + 773 281 p + 775 281 p + 625 280 p + 700 280 p + 706 280 p + 710 280 p + 736 280 p + 771 280 p + 773 280 p + 616 279 p + 630 279 p + 671 279 p + 711 279 p + 730 279 p + 738 279 p + 599 278 p + 687 278 p + 702 278 p + 712 278 p + 722 278 p + 774 278 p + 604 277 p + 642 277 p + 682 277 p + 713 277 p + 714 277 p + 731 277 p + 646 276 p + 704 276 p + 713 276 p + 714 276 p + 737 276 p + 790 276 p + 805 276 p + 589 275 p + 668 275 p + 698 275 p + 715 275 p + 729 275 p + 551 274 p + 631 274 p + 689 274 p + 716 274 p + 745 274 p + 786 274 p + 669 273 p + 685 273 p + 691 273 p + 717 273 p + 817 273 p + 870 273 p + 622 272 p + 650 272 p + 681 272 p + 718 272 p + 732 272 p + 775 272 p + 647 271 p + 690 271 p + 708 271 p + 719 271 p + 746 271 p + 749 271 p + 779 271 p + 654 270 p + 687 270 p + 708 270 p + 720 270 p + 782 270 p + 806 270 p + 683 269 p + 701 269 p + 708 269 p + 721 269 p + 766 269 p + 767 269 p + 599 268 p + 687 268 p + 712 268 p + 722 268 p + 766 268 p + 774 268 p + 634 267 p + 636 267 p + 682 267 p + 723 267 p + 724 267 p + 730 267 p + 783 267 p + 634 266 p + 649 266 p + 723 266 p + 724 266 p + 754 266 p + 783 266 p + 785 266 p + 807 266 p + 842 266 p + 656 265 p + 696 265 p + 705 265 p + 725 265 p + 789 265 p + 804 265 p + 808 265 p + 669 264 p + 670 264 p + 696 264 p + 726 264 p + 794 264 p + 817 264 p + 849 264 p + 860 264 p + 647 263 p + 699 263 p + 707 263 p + 727 263 p + 772 263 p + 829 263 p + 852 263 p + 601 262 p + 635 262 p + 667 262 p + 728 262 p + 741 262 p + 756 262 p + 798 262 p + 668 261 p + 699 261 p + 715 261 p + 729 261 p + 742 261 p + 777 261 p + 809 261 p + 829 261 p + 846 261 p + 634 260 p + 711 260 p + 723 260 p + 730 260 p + 755 260 p + 791 260 p + 807 260 p + 825 260 p + 850 260 p + 857 260 p + 679 259 p + 689 259 p + 713 259 p + 731 259 p + 790 259 p + 791 259 p + 650 258 p + 681 258 p + 718 258 p + 732 258 p + 733 258 p + 806 258 p + 816 258 p + 590 257 p + 685 257 p + 732 257 p + 733 257 p + 763 257 p + 800 257 p + 671 256 p + 680 256 p + 697 256 p + 734 256 p + 774 256 p + 778 256 p + 823 256 p + 868 256 p + 882 256 p + 606 255 p + 658 255 p + 705 255 p + 735 255 p + 736 255 p + 810 255 p + 688 254 p + 710 254 p + 735 254 p + 736 254 p + 821 254 p + 822 254 p + 830 254 p + 853 254 p + 682 253 p + 704 253 p + 714 253 p + 737 253 p + 808 253 p + 634 252 p + 671 252 p + 711 252 p + 738 252 p + 831 252 p + 854 252 p + 855 252 p + 588 251 p + 649 251 p + 692 251 p + 739 251 p + 781 251 p + 803 251 p + 809 251 p + 811 251 p + 832 251 p + 591 250 p + 649 250 p + 663 250 p + 740 250 p + 747 250 p + 761 250 p + 785 250 p + 788 250 p + 631 249 p + 666 249 p + 728 249 p + 741 249 p + 786 249 p + 813 249 p + 824 249 p + 833 249 p + 843 249 p + 851 249 p + 866 249 p + 634 248 p + 678 248 p + 729 248 p + 742 248 p + 777 248 p + 787 248 p + 812 248 p + 834 248 p + 601 247 p + 637 247 p + 680 247 p + 743 247 p + 798 247 p + 799 247 p + 644 246 p + 651 246 p + 677 246 p + 744 246 p + 748 246 p + 794 246 p + 814 246 p + 646 245 p + 689 245 p + 716 245 p + 745 245 p + 790 245 p + 793 245 p + 845 245 p + 647 244 p + 694 244 p + 719 244 p + 746 244 p + 770 244 p + 779 244 p + 835 244 p + 841 244 p + 875 244 p + 649 243 p + 688 243 p + 740 243 p + 747 243 p + 781 243 p + 788 243 p + 802 243 p + 844 243 p + 651 242 p + 703 242 p + 744 242 p + 748 242 p + 794 242 p + 812 242 p + 654 241 p + 709 241 p + 719 241 p + 749 241 p + 782 241 p + 796 241 p + 797 241 p + 835 241 p + 658 240 p + 661 240 p + 672 240 p + 750 240 p + 776 240 p + 792 240 p + 819 240 p + 661 239 p + 670 239 p + 703 239 p + 751 239 p + 759 239 p + 795 239 p + 662 238 p + 663 238 p + 705 238 p + 752 238 p + 761 238 p + 808 238 p + 631 237 p + 667 237 p + 673 237 p + 753 237 p + 784 237 p + 649 236 p + 668 236 p + 724 236 p + 754 236 p + 787 236 p + 809 236 p + 846 236 p + 671 235 p + 674 235 p + 730 235 p + 755 235 p + 799 235 p + 825 235 p + 833 235 p + 673 234 p + 692 234 p + 728 234 p + 756 234 p + 784 234 p + 813 234 p + 676 233 p + 680 233 p + 707 233 p + 757 233 p + 836 233 p + 852 233 p + 651 232 p + 677 232 p + 702 232 p + 758 232 p + 814 232 p + 823 232 p + 837 232 p + 678 231 p + 703 231 p + 751 231 p + 759 231 p + 812 231 p + 681 230 p + 684 230 p + 700 230 p + 760 230 p + 682 229 p + 740 229 p + 752 229 p + 761 229 p + 788 229 p + 838 229 p + 658 228 p + 686 228 p + 693 228 p + 762 228 p + 792 228 p + 797 228 p + 821 228 p + 677 227 p + 687 227 p + 733 227 p + 763 227 p + 780 227 p + 806 227 p + 606 226 p + 663 226 p + 688 226 p + 764 226 p + 765 226 p + 663 225 p + 705 225 p + 764 225 p + 765 225 p + 802 225 p + 810 225 p + 828 225 p + 708 224 p + 721 224 p + 722 224 p + 766 224 p + 778 224 p + 796 224 p + 827 224 p + 647 223 p + 683 223 p + 721 223 p + 767 223 p + 779 223 p + 673 222 p + 688 222 p + 692 222 p + 768 222 p + 815 222 p + 822 222 p + 848 222 p + 669 221 p + 677 221 p + 685 221 p + 769 221 p + 780 221 p + 661 220 p + 678 220 p + 746 220 p + 770 220 p + 801 220 p + 673 219 p + 700 219 p + 710 219 p + 771 219 p + 822 219 p + 826 219 p + 676 218 p + 698 218 p + 727 218 p + 772 218 p + 829 218 p + 693 217 p + 709 217 p + 710 217 p + 773 217 p + 797 217 p + 839 217 p + 853 217 p + 869 217 p + 712 216 p + 722 216 p + 734 216 p + 774 216 p + 780 216 p + 827 216 p + 840 216 p + 868 216 p + 700 215 p + 709 215 p + 718 215 p + 775 215 p + 782 215 p + 826 215 p + 839 215 p + 872 215 p + 670 214 p + 672 214 p + 750 214 p + 776 214 p + 795 214 p + 819 214 p + 678 213 p + 729 213 p + 742 213 p + 777 213 p + 834 213 p + 841 213 p + 905 213 p + 680 212 p + 734 212 p + 766 212 p + 778 212 p + 827 212 p + 836 212 p + 868 212 p + 879 212 p + 719 211 p + 746 211 p + 767 211 p + 779 211 p + 796 211 p + 763 210 p + 769 210 p + 774 210 p + 780 210 p + 816 210 p + 823 210 p + 876 210 p + 887 210 p + 911 210 p + 928 210 p + 932 210 p + 688 209 p + 739 209 p + 747 209 p + 781 209 p + 815 209 p + 720 208 p + 749 208 p + 775 208 p + 782 208 p + 880 208 p + 682 207 p + 723 207 p + 724 207 p + 783 207 p + 805 207 p + 807 207 p + 838 207 p + 842 207 p + 850 207 p + 673 206 p + 753 206 p + 756 206 p + 784 206 p + 826 206 p + 843 206 p + 848 206 p + 858 206 p + 649 205 p + 724 205 p + 740 205 p + 785 205 p + 811 205 p + 842 205 p + 844 205 p + 681 204 p + 716 204 p + 741 204 p + 786 204 p + 824 204 p + 843 204 p + 845 204 p + 847 204 p + 634 203 p + 742 203 p + 754 203 p + 787 203 p + 834 203 p + 846 203 p + 863 203 p + 877 203 p + 902 203 p + 740 202 p + 747 202 p + 761 202 p + 788 202 p + 696 201 p + 705 201 p + 725 201 p + 789 201 p + 804 201 p + 810 201 p + 828 201 p + 849 201 p + 862 201 p + 867 201 p + 714 200 p + 731 200 p + 745 200 p + 790 200 p + 791 200 p + 805 200 p + 824 200 p + 856 200 p + 730 199 p + 731 199 p + 790 199 p + 791 199 p + 833 199 p + 864 199 p + 658 198 p + 750 198 p + 762 198 p + 792 198 p + 691 197 p + 704 197 p + 745 197 p + 793 197 p + 818 197 p + 856 197 p + 870 197 p + 726 196 p + 744 196 p + 748 196 p + 794 196 p + 817 196 p + 837 196 p + 860 196 p + 661 195 p + 751 195 p + 776 195 p + 795 195 p + 801 195 p + 819 195 p + 820 195 p + 867 195 p + 894 195 p + 900 195 p + 749 194 p + 766 194 p + 779 194 p + 796 194 p + 879 194 p + 880 194 p + 749 193 p + 762 193 p + 773 193 p + 797 193 p + 835 193 p + 839 193 p + 676 192 p + 728 192 p + 743 192 p + 798 192 p + 813 192 p + 851 192 p + 874 192 p + 881 192 p + 680 191 p + 743 191 p + 755 191 p + 799 191 p + 836 191 p + 874 191 p + 882 191 p + 885 191 p + 681 190 p + 691 190 p + 733 190 p + 800 190 p + 816 190 p + 847 190 p + 870 190 p + 876 190 p + 686 189 p + 770 189 p + 795 189 p + 801 189 p + 820 189 p + 841 189 p + 883 189 p + 688 188 p + 747 188 p + 765 188 p + 802 188 p + 815 188 p + 830 188 p + 676 187 p + 692 187 p + 739 187 p + 803 187 p + 832 187 p + 848 187 p + 881 187 p + 884 187 p + 886 187 p + 696 186 p + 725 186 p + 789 186 p + 804 186 p + 818 186 p + 849 186 p + 714 185 p + 783 185 p + 790 185 p + 805 185 p + 720 184 p + 732 184 p + 763 184 p + 806 184 p + 840 184 p + 724 183 p + 730 183 p + 783 183 p + 807 183 p + 831 183 p + 850 183 p + 861 183 p + 725 182 p + 737 182 p + 752 182 p + 808 182 p + 818 182 p + 838 182 p + 729 181 p + 739 181 p + 754 181 p + 809 181 p + 811 181 p + 832 181 p + 735 180 p + 765 180 p + 789 180 p + 810 180 p + 821 180 p + 828 180 p + 739 179 p + 785 179 p + 809 179 p + 811 179 p + 844 179 p + 742 178 p + 748 178 p + 759 178 p + 812 178 p + 854 178 p + 865 178 p + 741 177 p + 756 177 p + 798 177 p + 813 177 p + 851 177 p + 677 176 p + 744 176 p + 758 176 p + 814 176 p + 837 176 p + 768 175 p + 781 175 p + 802 175 p + 815 175 p + 871 175 p + 884 175 p + 732 174 p + 780 174 p + 800 174 p + 816 174 p + 872 174 p + 888 174 p + 912 174 p + 928 174 p + 934 174 p + 717 173 p + 726 173 p + 794 173 p + 817 173 p + 860 173 p + 909 173 p + 910 173 p + 911 173 p + 793 172 p + 804 172 p + 808 172 p + 818 172 p + 862 172 p + 750 171 p + 776 171 p + 795 171 p + 819 171 p + 820 171 p + 795 170 p + 801 170 p + 819 170 p + 820 170 p + 894 170 p + 899 170 p + 913 170 p + 929 170 p + 736 169 p + 762 169 p + 810 169 p + 821 169 p + 873 169 p + 913 169 p + 930 169 p + 736 168 p + 768 168 p + 771 168 p + 822 168 p + 853 168 p + 914 168 p + 919 168 p + 734 167 p + 758 167 p + 780 167 p + 823 167 p + 859 167 p + 741 166 p + 786 166 p + 790 166 p + 824 166 p + 845 166 p + 856 166 p + 866 166 p + 906 166 p + 915 166 p + 671 165 p + 730 165 p + 755 165 p + 825 165 p + 882 165 p + 890 165 p + 771 164 p + 775 164 p + 784 164 p + 826 164 p + 869 164 p + 872 164 p + 895 164 p + 914 164 p + 917 164 p + 766 163 p + 774 163 p + 778 163 p + 827 163 p + 840 163 p + 765 162 p + 789 162 p + 810 162 p + 828 162 p + 830 162 p + 727 161 p + 729 161 p + 772 161 p + 829 161 p + 852 161 p + 881 161 p + 886 161 p + 889 161 p + 905 161 p + 944 161 p + 736 160 p + 802 160 p + 828 160 p + 830 160 p + 871 160 p + 892 160 p + 896 160 p + 919 160 p + 925 160 p + 930 160 p + 634 159 p + 738 159 p + 807 159 p + 831 159 p + 854 159 p + 857 159 p + 861 159 p + 907 159 p + 739 158 p + 803 158 p + 809 158 p + 832 158 p + 886 158 p + 741 157 p + 755 157 p + 791 157 p + 833 157 p + 885 157 p + 890 157 p + 906 157 p + 920 157 p + 926 157 p + 742 156 p + 777 156 p + 787 156 p + 834 156 p + 863 156 p + 865 156 p + 902 156 p + 746 155 p + 749 155 p + 797 155 p + 835 155 p + 875 155 p + 880 155 p + 883 155 p + 891 155 p + 899 155 p + 901 155 p + 757 154 p + 778 154 p + 799 154 p + 836 154 p + 874 154 p + 893 154 p + 908 154 p + 758 153 p + 794 153 p + 814 153 p + 837 153 p + 855 153 p + 859 153 p + 878 153 p + 761 152 p + 783 152 p + 808 152 p + 838 152 p + 896 152 p + 773 151 p + 775 151 p + 797 151 p + 839 151 p + 869 151 p + 873 151 p + 903 151 p + 774 150 p + 806 150 p + 827 150 p + 840 150 p + 888 150 p + 746 149 p + 777 149 p + 801 149 p + 841 149 p + 875 149 p + 883 149 p + 894 149 p + 901 149 p + 929 149 p + 724 148 p + 783 148 p + 785 148 p + 842 148 p + 877 148 p + 896 148 p + 741 147 p + 784 147 p + 786 147 p + 843 147 p + 866 147 p + 747 146 p + 785 146 p + 811 146 p + 844 146 p + 871 146 p + 745 145 p + 786 145 p + 824 145 p + 845 145 p + 729 144 p + 754 144 p + 787 144 p + 846 144 p + 863 144 p + 877 144 p + 681 143 p + 786 143 p + 800 143 p + 847 143 p + 895 143 p + 912 143 p + 768 142 p + 784 142 p + 803 142 p + 848 142 p + 858 142 p + 884 142 p + 726 141 p + 789 141 p + 804 141 p + 849 141 p + 862 141 p + 730 140 p + 783 140 p + 807 140 p + 850 140 p + 857 140 p + 861 140 p + 864 140 p + 898 140 p + 741 139 p + 798 139 p + 813 139 p + 851 139 p + 858 139 p + 920 139 p + 922 139 p + 727 138 p + 757 138 p + 829 138 p + 852 138 p + 736 137 p + 773 137 p + 822 137 p + 853 137 p + 873 137 p + 738 136 p + 812 136 p + 831 136 p + 854 136 p + 855 136 p + 865 136 p + 878 136 p + 907 136 p + 973 136 p + 738 135 p + 837 135 p + 854 135 p + 855 135 p + 859 135 p + 790 134 p + 793 134 p + 824 134 p + 856 134 p + 864 134 p + 906 134 p + 915 134 p + 730 133 p + 831 133 p + 850 133 p + 857 133 p + 898 133 p + 784 132 p + 848 132 p + 851 132 p + 858 132 p + 914 132 p + 922 132 p + 931 132 p + 823 131 p + 837 131 p + 855 131 p + 859 131 p + 878 131 p + 887 131 p + 897 131 p + 726 130 p + 794 130 p + 817 130 p + 860 130 p + 867 130 p + 909 130 p + 910 130 p + 923 130 p + 807 129 p + 831 129 p + 850 129 p + 861 129 p + 898 129 p + 907 129 p + 924 129 p + 789 128 p + 818 128 p + 849 128 p + 862 128 p + 925 128 p + 787 127 p + 834 127 p + 846 127 p + 863 127 p + 889 127 p + 902 127 p + 905 127 p + 791 126 p + 850 126 p + 856 126 p + 864 126 p + 924 126 p + 926 126 p + 812 125 p + 834 125 p + 854 125 p + 865 125 p + 900 125 p + 927 125 p + 973 125 p + 741 124 p + 824 124 p + 843 124 p + 866 124 p + 895 124 p + 920 124 p + 789 123 p + 795 123 p + 860 123 p + 867 123 p + 909 123 p + 913 123 p + 923 123 p + 734 122 p + 774 122 p + 778 122 p + 868 122 p + 879 122 p + 887 122 p + 897 122 p + 773 121 p + 826 121 p + 839 121 p + 869 121 p + 717 120 p + 793 120 p + 800 120 p + 870 120 p + 876 120 p + 911 120 p + 815 119 p + 830 119 p + 844 119 p + 871 119 p + 892 119 p + 904 119 p + 775 118 p + 816 118 p + 826 118 p + 872 118 p + 903 118 p + 917 118 p + 821 117 p + 839 117 p + 853 117 p + 873 117 p + 899 117 p + 930 117 p + 798 116 p + 799 116 p + 836 116 p + 874 116 p + 885 116 p + 893 116 p + 746 115 p + 835 115 p + 841 115 p + 875 115 p + 901 115 p + 944 115 p + 780 114 p + 800 114 p + 870 114 p + 876 114 p + 912 114 p + 928 114 p + 787 113 p + 842 113 p + 846 113 p + 877 113 p + 889 113 p + 837 112 p + 854 112 p + 859 112 p + 878 112 p + 910 112 p + 927 112 p + 973 112 p + 778 111 p + 796 111 p + 868 111 p + 879 111 p + 891 111 p + 782 110 p + 796 110 p + 835 110 p + 880 110 p + 888 110 p + 891 110 p + 903 110 p + 798 109 p + 803 109 p + 829 109 p + 881 109 p + 922 109 p + 931 109 p + 734 108 p + 799 108 p + 825 108 p + 882 108 p + 890 108 p + 908 108 p + 801 107 p + 835 107 p + 841 107 p + 883 107 p + 803 106 p + 815 106 p + 848 106 p + 884 106 p + 892 106 p + 904 106 p + 799 105 p + 833 105 p + 874 105 p + 885 105 p + 893 105 p + 939 105 p + 803 104 p + 829 104 p + 832 104 p + 886 104 p + 904 104 p + 780 103 p + 859 103 p + 868 103 p + 887 103 p + 897 103 p + 961 103 p + 816 102 p + 840 102 p + 880 102 p + 888 102 p + 829 101 p + 863 101 p + 877 101 p + 889 101 p + 825 100 p + 833 100 p + 882 100 p + 890 100 p + 939 100 p + 835 99 p + 879 99 p + 880 99 p + 891 99 p + 830 98 p + 871 98 p + 884 98 p + 892 98 p + 919 98 p + 836 97 p + 874 97 p + 885 97 p + 893 97 p + 908 97 p + 939 97 p + 795 96 p + 820 96 p + 841 96 p + 894 96 p + 900 96 p + 826 95 p + 847 95 p + 866 95 p + 895 95 p + 830 94 p + 838 94 p + 842 94 p + 896 94 p + 924 94 p + 859 93 p + 868 93 p + 887 93 p + 897 93 p + 850 92 p + 857 92 p + 861 92 p + 898 92 p + 926 92 p + 820 91 p + 835 91 p + 873 91 p + 899 91 p + 795 90 p + 865 90 p + 894 90 p + 900 90 p + 923 90 p + 835 89 p + 841 89 p + 875 89 p + 901 89 p + 929 89 p + 787 88 p + 834 88 p + 863 88 p + 902 88 p + 839 87 p + 872 87 p + 880 87 p + 903 87 p + 871 86 p + 884 86 p + 886 86 p + 904 86 p + 931 86 p + 777 85 p + 829 85 p + 863 85 p + 905 85 p + 824 84 p + 833 84 p + 856 84 p + 906 84 p + 915 84 p + 831 83 p + 854 83 p + 861 83 p + 907 83 p + 836 82 p + 882 82 p + 893 82 p + 908 82 p + 817 81 p + 860 81 p + 867 81 p + 909 81 p + 817 80 p + 860 80 p + 878 80 p + 910 80 p + 932 80 p + 961 80 p + 780 79 p + 817 79 p + 870 79 p + 911 79 p + 932 79 p + 816 78 p + 847 78 p + 876 78 p + 912 78 p + 917 78 p + 934 78 p + 820 77 p + 821 77 p + 867 77 p + 913 77 p + 925 77 p + 822 76 p + 826 76 p + 858 76 p + 914 76 p + 824 75 p + 856 75 p + 906 75 p + 915 75 p + 825 74 p + 859 74 p + 890 74 p + 916 74 p + 826 73 p + 872 73 p + 912 73 p + 917 73 p + 934 73 p + 829 72 p + 836 72 p + 881 72 p + 918 72 p + 822 71 p + 830 71 p + 892 71 p + 919 71 p + 833 70 p + 851 70 p + 866 70 p + 920 70 p + 856 69 p + 864 69 p + 870 69 p + 921 69 p + 851 68 p + 858 68 p + 881 68 p + 922 68 p + 860 67 p + 867 67 p + 900 67 p + 923 67 p + 927 67 p + 861 66 p + 864 66 p + 896 66 p + 924 66 p + 830 65 p + 862 65 p + 913 65 p + 925 65 p + 833 64 p + 864 64 p + 898 64 p + 926 64 p + 865 63 p + 878 63 p + 923 63 p + 927 63 p + 780 62 p + 816 62 p + 876 62 p + 928 62 p + 820 61 p + 841 61 p + 901 61 p + 929 61 p + 821 60 p + 830 60 p + 873 60 p + 930 60 p + 858 59 p + 881 59 p + 904 59 p + 931 59 p + 780 58 p + 910 58 p + 911 58 p + 932 58 p + 961 58 p + 868 57 p + 887 57 p + 897 57 p + 933 57 p + 816 56 p + 912 56 p + 917 56 p + 934 56 p + 780 55 p + 911 55 p + 928 55 p + 935 55 p + 865 54 p + 900 54 p + 905 54 p + 936 54 p + 912 53 p + 928 53 p + 937 53 p + 830 52 p + 871 52 p + 896 52 p + 938 52 p + 885 51 p + 890 51 p + 893 51 p + 939 51 p + 881 50 p + 886 50 p + 931 50 p + 940 50 p + 875 49 p + 879 49 p + 901 49 p + 941 49 p + 944 49 p + 879 48 p + 888 48 p + 942 48 p + 882 47 p + 890 47 p + 908 47 p + 943 47 p + 829 46 p + 875 46 p + 944 46 p + 880 45 p + 899 45 p + 901 45 p + 945 45 p + 826 44 p + 858 44 p + 895 44 p + 946 44 p + 898 43 p + 907 43 p + 947 43 p + 893 42 p + 922 42 p + 948 42 p + 864 41 p + 898 41 p + 926 41 p + 949 41 p + 904 40 p + 914 40 p + 931 40 p + 950 40 p + 895 39 p + 906 39 p + 920 39 p + 951 39 p + 826 38 p + 873 38 p + 903 38 p + 952 38 p + 920 37 p + 939 37 p + 953 37 p + 829 36 p + 889 36 p + 954 36 p + 889 35 p + 896 35 p + 924 35 p + 955 35 p + 841 34 p + 901 34 p + 944 34 p + 956 34 p + 892 33 p + 919 33 p + 957 33 p + 820 32 p + 867 32 p + 913 32 p + 958 32 p + 894 31 p + 900 31 p + 959 31 p + 861 30 p + 902 30 p + 960 30 p + 887 29 p + 910 29 p + 932 29 p + 961 29 p + 870 28 p + 915 28 p + 962 28 p + 820 27 p + 873 27 p + 913 27 p + 963 27 p + 829 26 p + 889 26 p + 964 26 p + 833 25 p + 906 25 p + 926 25 p + 965 25 p + 858 24 p + 895 24 p + 920 24 p + 966 24 p + 859 23 p + 878 23 p + 961 23 p + 967 23 p + 862 22 p + 867 22 p + 909 22 p + 968 22 p + 865 21 p + 902 21 p + 905 21 p + 969 21 p + 862 20 p + 870 20 p + 911 20 p + 970 20 p + 871 19 p + 904 19 p + 971 19 p + 873 18 p + 903 18 p + 972 18 p + 854 17 p + 865 17 p + 878 17 p + 973 17 p + 879 16 p + 880 16 p + 974 16 p + 880 15 p + 888 15 p + 903 15 p + 975 15 p + 895 14 p + 917 14 p + 976 14 p + 862 13 p + 896 13 p + 925 13 p + 977 13 p + 899 12 p + 929 12 p + 978 12 p + 900 11 p + 927 11 p + 979 11 p + 903 10 p + 917 10 p + 980 10 p + 910 9 p + 981 9 p + 870 8 p + 911 8 p + 982 8 p + 895 7 p + 912 7 p + 983 7 p + 922 6 p + 931 6 p + 984 6 p + 910 5 p + 911 5 p + 932 5 p + 985 5 p + 833 4 p + 986 4 p + 858 3 p + 922 3 p + 987 3 p + 862 2 p + 925 2 p + 988 2 p + 858 1 p + 914 1 p + 989 1 p + 862 0 p + 990 0 p +showpage +%%EndDocument + + endTexFig + 60 1513 a Fk(5)83 b(Basic)26 b(algebraic)h(op)r(erations)60 +1622 y Fl(The)14 b(usual)g(algebraic)f(op)q(erations)i(in)o(v)o(olving)d(t)o +(w)o(o)i(matrices,)e(suc)o(h)h(as)h Fj(C)k Fl(=)c Fj(A)6 b +Fl(+)g Fj(B)s Fl(,)12 b Fj(C)18 b Fl(=)13 b Fj(A)6 b Fl(+)g +Fj(\014)s(B)s Fl(,)60 1683 y Fj(C)21 b Fl(=)c Fj(AB)s Fl(,)h(etc..,)f(are)h +(fairly)g(common)e(in)i(sparse)h(matrix)e(computations.)27 +b(These)18 b(basic)h(matrix)60 1743 y(op)q(erations)25 b(are)e(included)f(in) +i(the)f(mo)q(dule)f(called)h(BLASSM.)f(In)h(addition)h(there)f(is)g(a)h +(large)60 1803 y(n)o(um)o(b)q(er)10 b(of)i(basic)g(op)q(erations,)i(in)o(v)o +(olving)c(a)i(sparse)h(matrix)d(and)i(a)h(v)o(ector,)e(suc)o(h)h(as)g +(matrix-v)o(ector)60 1863 y(pro)q(ducts)18 b(and)g(triangular)g(system)e +(solutions)i(that)g(are)g(v)o(ery)e(commonly)e(used.)25 b(Some)17 +b(of)g(these)60 1923 y(are)c(included)f(in)h(the)g(mo)q(dule)f(MA)l(TVEC.)g +(Sometimes)e(it)j(is)g(desirable)f(to)i(compute)e(the)h(patterns)60 +1984 y(of)i(the)g(matrices)e Fj(A)8 b Fl(+)g Fj(B)18 b Fl(and)d +Fj(AB)s Fl(,)f(or)h(in)g(fact)g(of)g(an)o(y)g(result)f(of)h(the)g(basic)g +(algebraic)f(op)q(erations.)60 2044 y(This)j(can)g(b)q(e)h(implem)o(e)o(n)o +(ted)c(b)o(y)j(w)o(a)o(y)f(of)i(job)f(options)h(whic)o(h)e(will)g(determine)f +(whether)h(to)i(\014ll-in)60 2104 y(the)e(real)h(v)m(alues)f(or)h(not)h +(during)f(the)f(computation.)22 b(W)l(e)16 b(no)o(w)h(brie\015y)f(describ)q +(e)g(the)h(con)o(ten)o(ts)f(of)60 2164 y(eac)o(h)g(of)g(the)g(t)o(w)o(o)g(mo) +q(dules)g(BLASSM)f(and)i(MA)l(TVEC.)60 2308 y Fi(5.1)70 b(The)22 +b(BLASSM)i(mo)r(dule)60 2401 y Fl(Curren)o(tly)l(,)12 b(the)h(mo)q(dule)g +(BLASSM)f(\(Basic)h(Linear)h(Algebra)f(Subroutines)g(for)h(Sparse)g +(Matrices\))60 2461 y(con)o(tains)i(the)g(follo)o(wing)g(nine)g(subroutines:) +120 2611 y Fh(AMUB)212 b Fl(P)o(erforms)19 b(the)i(pro)q(duct)g(of)g(t)o(w)o +(o)g(matrices,)e(i.e.,)h(computes)f Fj(C)25 b Fl(=)c Fj(AB)s +Fl(,)510 2671 y(where)16 b Fj(A)g Fl(and)h Fj(B)h Fl(are)f(b)q(oth)g(in)f +(CSR)g(format.)p eop +%%Page: 19 19 +19 18 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(19)120 +132 y Fh(APLB)236 b Fl(P)o(erforms)13 b(the)i(addition)g(of)g(t)o(w)o(o)g +(matrices,)d(i.e.,)h(computes)h Fj(C)j Fl(=)d Fj(A)8 b Fl(+)g +Fj(B)s Fl(,)510 192 y(where)16 b Fj(A)g Fl(and)h Fj(B)h Fl(are)f(b)q(oth)g +(in)f(CSR)g(format.)120 290 y Fh(APLSB)205 b Fl(P)o(erforms)12 +b(the)g(op)q(eration)i Fj(C)k Fl(=)13 b Fj(A)5 b Fl(+)g Fj(\033)r(B)s +Fl(,)11 b(where)i Fj(\033)i Fl(is)d(a)i(scalar,)f(and)h Fj(A;)8 +b(B)510 351 y Fl(are)16 b(t)o(w)o(o)g(matrices)f(in)h(CSR)g(format.)120 +456 y Fh(APMBT)178 b Fl(P)o(erforms)23 b(either)g(the)h(addition)h +Fj(C)31 b Fl(=)d Fj(A)16 b Fl(+)g Fj(B)1443 437 y Ff(T)1495 +456 y Fl(or)24 b(the)h(subtraction)510 516 y Fj(C)17 b Fl(=)d +Fj(A)d Fg(\000)g Fj(B)752 498 y Ff(T)779 516 y Fl(.)120 625 +y Fh(APLSBT)166 b Fl(P)o(erforms)15 b(the)h(op)q(eration)h +Fj(C)g Fl(=)d Fj(A)d Fl(+)g Fj(sB)1283 607 y Ff(T)1310 625 +y Fl(.)120 745 y Fh(DIAMUA)146 b Fl(Computes)22 b(the)h(pro)q(duct)g(of)g +(diagonal)h(matrix)d(\(from)g(the)i(left\))e(b)o(y)i(a)510 +805 y(sparse)g(matrix,)e(i.e.,)h(computes)f Fj(C)27 b Fl(=)d +Fj(D)q(A)p Fl(,)g(where)e Fj(D)i Fl(is)e(a)g(diagonal)510 865 +y(matrix)15 b(and)h Fj(A)g Fl(is)g(a)h(general)f(sparse)h(matrix)d(stored)j +(in)f(CSR)g(format.)120 974 y Fh(AMUDIA)146 b Fl(Computes)20 +b(the)g(pro)q(duct)h(of)g(a)f(sparse)h(matrix)e(b)o(y)h(a)h(diagonal)g +(matrix)510 1034 y(from)f(the)h(righ)o(t,)g(i.e.,)f(computes)g +Fj(C)25 b Fl(=)d Fj(AD)q Fl(,)g(where)e Fj(D)j Fl(is)e(a)g(diagonal)510 +1094 y(matrix)15 b(and)h Fj(A)g Fl(is)g(a)h(general)f(sparse)h(matrix)d +(stored)j(in)f(CSR)g(format.)120 1203 y Fh(APLDIA)170 b Fl(Computes)24 +b(the)g(sum)f(of)h(a)h(sparse)g(matrix)e(and)h(a)h(diagonal)g(matrix,)510 +1263 y Fj(C)17 b Fl(=)d Fj(A)d Fl(+)g Fj(D)q Fl(.)120 1365 +y Fh(APLSCA)163 b Fl(P)o(erforms)17 b(an)i(in-place)f(addition)h(of)g(a)g +(scalar)g(to)g(the)g(diagonal)g(en)o(tries)510 1426 y(of)e(a)f(sparse)h +(matrix,)d(i.e.,)g(p)q(erforms)i(the)g(op)q(eration)h Fj(A)c +Fl(:=)h Fj(A)c Fl(+)h Fj(\033)r(I)t Fl(.)120 1624 y(Missing)j(from)f(this)h +(list)g(are)g(the)g(routines)g Fh(AMUBT)h Fl(whic)o(h)e(m)o(ultiplies)e +Fj(A)j Fl(b)o(y)g(the)g(transp)q(ose)60 1684 y(of)j Fj(B)s +Fl(,)e Fj(C)i Fl(=)d Fj(AB)366 1666 y Ff(T)393 1684 y Fl(,)h(and)i +Fh(A)-5 b(TMUB)36 b Fl(whic)o(h)15 b(m)o(ultiplies)e(the)j(transp)q(ose)i(of) +f Fj(A)e Fl(b)o(y)h Fj(B)s Fl(,)f Fj(C)j Fl(=)c Fj(A)1818 1666 +y Ff(T)1845 1684 y Fj(B)s Fl(.)120 1834 y(These)j(are)h(v)o(ery)e(di\016cult) +f(to)j(implem)o(en)o(t)c(and)k(w)o(e)f(found)g(it)g(b)q(etter)g(to)h(p)q +(erform)e(it)h(with)g(t)o(w)o(o)60 1895 y(passes.)22 b(Op)q(erations)16 +b(of)g(the)g(form)e Fj(tA)9 b Fl(+)h Fj(sB)18 b Fl(ha)o(v)o(e)d(b)q(een)h(a)o +(v)o(oided)f(as)h(their)f(o)q(ccurrence)g(do)q(es)i(not)60 +1955 y(w)o(arran)o(t)22 b(additional)f(subroutines.)37 b(Sev)o(eral)21 +b(other)g(op)q(erations)i(similar)c(to)j(those)g(de\014ned)f(for)60 +2015 y(v)o(ectors)15 b(ha)o(v)o(e)g(not)h(b)q(een)g(included.)k(F)l(or)c +(example)e(the)h(scaling)h(of)g(a)g(matrix)e(in)i(sparse)g(format)f(is)60 +2075 y(simply)i(a)i(scaling)g(of)g(its)g(real)f(arra)o(y)h +Fj(A)p Fl(,)g(whic)o(h)f(can)h(b)q(e)g(done)g(with)g(the)g(usual)g(BLAS1)g +(scaling)60 2135 y(routine,)d(on)g(the)g(arra)o(y)h Fj(A)p +Fl(.)60 2280 y Fi(5.2)70 b(The)22 b(MA)-6 b(TVEC)23 b(mo)r(dule)60 +2372 y Fl(In)14 b(its)h(curren)o(t)e(status,)j(this)e(mo)q(dule)f(con)o +(tains)i(matrix)e(b)o(y)h(v)o(ector)g(pro)q(ducts)h(and)g(v)m(arious)g +(sparse)60 2432 y(triangular)i(solution)f(metho)q(ds.)21 b(The)16 +b(con)o(ten)o(ts)g(are)g(as)h(follo)o(ws.)120 2582 y Fh(AMUX)210 +b Fl(P)o(erforms)17 b(the)i(pro)q(duct)h(of)f(a)g(matrix)e(b)o(y)i(a)g(v)o +(ector.)28 b(Matrix)18 b(stored)h(in)510 2643 y(Compressed)d(Sparse)g(Ro)o(w) +h(\(CSR\))f(format.)p eop +%%Page: 20 20 +20 19 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(20)120 +132 y Fh(A)-5 b(TMUX)176 b Fl(P)o(erforms)19 b(the)h(pro)q(duct)i(of)f(the)f +(transp)q(ose)i(of)f(a)g(matrix)d(b)o(y)i(a)h(v)o(ector.)510 +192 y(Matrix)h Fj(A)g Fl(stored)h(in)f(Compressed)g(Sparse)g(Ro)o(w)h +(format.)39 b(Can)23 b(also)510 252 y(b)q(e)c(view)o(ed)e(as)j(the)e(pro)q +(duct)h(of)h(a)f(matrix)e(in)h(the)h(Compressed)f(Sparse)510 +312 y(Column)d(format)h(b)o(y)g(a)g(v)o(ector.)120 421 y Fh(AMUXE)173 +b Fl(P)o(erforms)17 b(the)i(pro)q(duct)h(of)f(a)g(matrix)e(b)o(y)i(a)g(v)o +(ector.)28 b(Matrix)18 b(stored)h(in)510 481 y(Ellpac)o(k/Itpac)o(k)c +(\(ELL\))i(format.)120 592 y Fh(AMUXD)167 b Fl(P)o(erforms)17 +b(the)i(pro)q(duct)h(of)f(a)g(matrix)e(b)o(y)i(a)g(v)o(ector.)28 +b(Matrix)18 b(stored)h(in)510 652 y(Diagonal)e(\(DIA\))f(format.)120 +763 y Fh(AMUXJ)181 b Fl(P)o(erforms)17 b(the)i(pro)q(duct)h(of)f(a)g(matrix)e +(b)o(y)i(a)g(v)o(ector.)28 b(Matrix)18 b(stored)h(in)510 823 +y(Jagged)e(Diagonal)h(\(JAD\))e(format.)120 935 y Fh(VBRMV)171 +b Fl(Sparse)17 b(matrix)d(-)j(full)e(v)o(ector)g(pro)q(duct)i(in)f(VBR)g +(format.)120 1055 y Fh(LSOL)265 b Fl(Unit)23 b(lo)o(w)o(er)f(triangular)i +(system)e(solution.)42 b(Matrix)23 b(stored)h(in)f(Com-)526 +1115 y(pressed)17 b(Sparse)f(Ro)o(w)h(\(CSR\))f(format.)120 +1226 y Fh(LDSOL)206 b Fl(Lo)o(w)o(er)27 b(triangular)g(system)f(solution.)53 +b(Matrix)26 b(stored)h(in)g(Mo)q(di\014ed)510 1286 y(Sparse)17 +b(Ro)o(w)f(\(MSR\))g(format.)21 b(Diagonal)c(elemen)o(ts)c(in)o(v)o(erted.) +120 1398 y Fh(LSOLC)209 b Fl(Unit)23 b(lo)o(w)o(er)f(triangular)i(system)d +(solution.)43 b(Matrix)23 b(stored)h(in)e(Com-)510 1458 y(pressed)16 +b(Sparse)h(Column)e(\(CSC\))i(format.)120 1569 y Fh(LDSOLC)166 +b Fl(Lo)o(w)o(er)27 b(triangular)g(system)f(solution.)53 b(Matrix)26 +b(stored)h(in)g(Mo)q(di\014ed)510 1629 y(Sparse)17 b(Column)e(\(MSC\))h +(format)g(with)g(diagonal)h(elemen)o(ts)c(in)o(v)o(erted.)120 +1740 y Fh(LDSOLL)172 b Fl(Unit)21 b(lo)o(w)o(er)g(triangular)h(system)f +(solution)h(with)g(the)f(lev)o(el)f(sc)o(heduling)510 1801 +y(approac)o(h.)38 b(Matrix)21 b(stored)h(in)g(Mo)q(di\014ed)f(Sparse)h(Ro)o +(w)g(format,)g(with)510 1861 y(diagonal)17 b(elemen)o(ts)d(in)o(v)o(erted.) +120 1969 y Fh(USOL)240 b Fl(Unit)21 b(upp)q(er)i(triangular)f(system)f +(solution.)39 b(Matrix)21 b(stored)i(in)e(Com-)510 2029 y(pressed)16 +b(Sparse)h(Ro)o(w)f(\(CSR\))h(format.)120 2141 y Fh(UDSOL)197 +b Fl(Upp)q(er)26 b(triangular)h(system)e(solution.)52 b(Matrix)25 +b(stored)i(in)f(Mo)q(di\014ed)510 2201 y(Sparse)17 b(Ro)o(w)f(\(MSR\))g +(format.)21 b(Diagonal)c(elemen)o(ts)c(in)o(v)o(erted.)120 +2312 y Fh(USOLC)200 b Fl(Unit)21 b(upp)q(er)i(triangular)f(system)f +(solution.)39 b(Matrix)21 b(stored)i(in)e(Com-)510 2372 y(pressed)16 +b(Sparse)h(Column)e(\(CSC\))i(format.)120 2483 y Fh(UDSOLC)157 +b Fl(Upp)q(er)26 b(triangular)h(system)e(solution.)52 b(Matrix)25 +b(stored)i(in)f(Mo)q(di\014ed)510 2544 y(Sparse)17 b(Column)e(\(MSC\))h +(format)g(with)g(diagonal)h(elemen)o(ts)c(in)o(v)o(erted.)p +eop +%%Page: 21 21 +21 20 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(21)120 +132 y(Most)21 b(of)f(the)g(ab)q(o)o(v)o(e)h(routines)f(are)h(short)g(and)g +(rather)f(straigh)o(tforw)o(ard.)34 b(A)20 b(long)h(test)f(pro-)60 +192 y(gram)e(is)h(pro)o(vided)f(to)h(run)g(all)g(of)g(the)g(subroutines)g(on) +g(a)h(large)e(n)o(um)o(b)q(er)f(of)j(matrices)d(that)i(are)60 +252 y(dynamically)14 b(generated)i(using)h(the)f(MA)l(TGEN)f(mo)q(dule.)60 +416 y Fk(6)83 b(The)27 b(basic)g(statistics)f(and)h(information)h(routines)60 +526 y Fl(It)14 b(is)h(sometimes)d(v)o(ery)i(informativ)o(e)e(when)j +(analyzing)g(solution)g(metho)q(ds,)f(to)h(b)q(e)g(able)g(in)f(a)h(short)60 +586 y(amoun)o(t)23 b(of)h(time)e(to)i(obtain)h(some)d(statistical)i +(information)f(ab)q(out)i(a)f(sparse)h(matrix.)42 b(The)60 +646 y(purp)q(ose)22 b(of)f(the)g(subroutine)h(info1,)g(is)f(to)g(prin)o(t)g +(out)g(suc)o(h)g(information.)35 b(The)21 b(\014rst)g(question)60 +706 y(w)o(e)i(had)i(to)f(address)h(w)o(as)f(to)g(determine)e(the)h(t)o(yp)q +(e)h(of)g(information)f(that)h(is)g(inexp)q(ensiv)o(e)e(to)60 +766 y(obtain)i(and)f(y)o(et)f(practical)h(and)g(useful.)42 +b(The)23 b(simplest)e(and)i(most)g(common)e(statistics)h(are:)60 +826 y(total)d(n)o(um)o(b)q(er)f(of)h(nonzero)g(elemen)o(ts,)e(a)o(v)o(erage)h +(n)o(um)o(b)q(er)g(of)h(nonzero)g(elemen)o(ts)e(p)q(er)i(ro)o(w)g(\(with)60 +887 y(standard)c(deviation\),)f(band)h(size.)20 b(Our)14 b(preliminary)d(pac) +o(k)m(age)k(Info1)f(con)o(tains)h(the)f(ab)q(o)o(v)o(e)g(and)h(a)60 +947 y(n)o(um)o(b)q(er)e(of)j(other)f(features.)21 b(F)l(or)16 +b(example)d(it)h(answ)o(ers)i(the)f(follo)o(wing)g(questions:)21 +b(Is)15 b(the)g(matrix)60 1007 y(lo)o(w)o(er)21 b(triangular,)i(upp)q(er)f +(triangular?)38 b(do)q(es)23 b(it)e(ha)o(v)o(e)g(a)h(symmetri)o(c)d +(structure?)37 b(If)21 b(not)i(ho)o(w)60 1067 y(close)f(is)f(it)h(from)f(ha)o +(ving)h(this)g(prop)q(ert)o(y?)39 b(Is)21 b(it)h(w)o(eakly)f(ro)o +(w-diagonally)i(dominan)o(t?)37 b(What)60 1127 y(p)q(ercen)o(tage)21 +b(of)h(the)f(ro)o(ws)h(are)g(w)o(eakly)e(diagonally)i(dominan)o(t?)36 +b(Same)20 b(questions)i(for)g(column)60 1188 y(diagonal)f(dominance.)30 +b(A)19 b(sample)f(output)j(from)d(info1)i(is)g(listed)e(in)i(Figure3.)31 +b(This)20 b(prin)o(t-out)60 1248 y(w)o(as)d(generated)f(b)o(y)g(t)o(yping)763 +1336 y Fa(info1.ex)23 b(<)i(pores)p 1178 1336 16 2 v 16 w(2)60 +1425 y Fl(where)16 b Fa(pores)p 334 1425 V 17 w(2)f Fl(is)h(a)h(\014le)f(con) +o(taining)g(a)g(matrix)f(in)h(H/B)g(format.)120 1485 y(If)g(the)g(Harw)o +(ell-Bo)q(eing)f(matrix)f(is)i(symmetri)o(c)d(then)j(Info1)h(tak)o(es)f(this) +g(information)f(in)o(to)h(ac-)60 1545 y(coun)o(t)c(to)g(obtain)g(the)f +(correct)g(information)g(instead)h(of)g(the)f(information)g(on)h(the)g(lo)o +(w)o(er)f(triangular)60 1606 y(part)18 b(only)l(.)24 b(Moreo)o(v)o(er,)15 +b(in)i(cases)h(where)f(only)g(the)g(pattern)g(is)g(pro)o(vided)g(\(no)g(real) +g(v)m(alues\),)g(then)60 1666 y(info1)d(will)e(prin)o(t)h(a)h(message)f(to)g +(this)h(e\013ect)f(and)h(will)e(then)h(giv)o(e)g(information)f(related)h +(only)g(to)h(the)60 1726 y(structure)k(of)g(the)g(matrix.)25 +b(The)19 b(output)f(for)h(an)g(example)d(of)i(this)g(t)o(yp)q(e)g(is)g(sho)o +(wn)h(in)e(Figure)h(4.)60 1786 y(W)l(e)d(should)h(p)q(oin)o(t)g(out)g(that)g +(the)g(runs)g(for)g(these)f(t)o(w)o(o)h(tests)f(w)o(ere)g(basically)g(instan) +o(taneous)h(on)h(a)60 1846 y(Sun-4)g(w)o(orkstation.)120 1906 +y(Curren)o(tly)l(,)e(this)h(mo)q(dule)f(con)o(tains)h(the)g(follo)o(wing)g +(subroutines:)120 2057 y Fh(N)p 167 2057 17 2 v 20 w(IMP)p +299 2057 V 20 w(DIA)n(G)46 b Fl(Computes)16 b(the)g(most)f(imp)q(ortan)o(t)g +(diagonals.)120 2177 y Fh(DIA)n(G)p 271 2177 V 21 w(DOMI)62 +b Fl(Computes)45 b(the)g(p)q(ercen)o(tage)g(of)g(w)o(eakly)g(diagonally)g +(dominan)o(t)510 2237 y(ro)o(ws/columns.)120 2348 y Fh(BAND)n(WIDTH)18 +b Fl(Computes)e(the)g(lo)o(w)o(er,)f(upp)q(er,)h(maxim)n(um)o(,)d(and)k(a)o +(v)o(erage)e(bandwidths.)120 2468 y Fh(NONZ)226 b Fl(Computes)35 +b(maxim)n(um)c(n)o(um)o(b)q(ers)j(of)i(nonzero)f(elemen)o(ts)e(p)q(er)i(col-) +510 2529 y(umn/ro)o(w,)13 b(min)f(n)o(um)o(b)q(ers)g(of)i(nonzero)f(elemen)o +(ts)e(p)q(er)j(column/ro)o(w,)e(and)510 2589 y(n)o(um)o(b)q(ers)j(of)h(zero)g +(columns/ro)o(ws.)120 2700 y Fh(FR)n(OBNORM)52 b Fl(Computes)16 +b(the)g(F)l(rob)q(enius)g(norm)f(of)i(A.)p eop +%%Page: 22 22 +22 21 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(22)120 +132 y Fh(ANSYM)178 b Fl(Computes)35 b(the)g(F)l(rob)q(enius)g(norm)g(of)h +(the)f(symmetri)o(c)d(and)k(non-)510 192 y(symmetri)o(c)10 +b(parts)k(of)f(A,)g(computes)f(the)g(n)o(um)o(b)q(er)g(of)h(matc)o(hing)f +(elemen)o(ts)510 252 y(in)k(symme)o(try)d(and)j(the)g(relativ)o(e)e(symmetry) +f(matc)o(h.)19 b(The)d(routine)g(AN-)510 312 y(SYM)22 b(pro)o(vides)g(some)f +(information)h(on)h(the)f(degree)g(of)h(symmetr)o(y)d(of)510 +372 y(A.)120 474 y Fh(DIST)-5 b(AIJ)169 b Fl(Computes)19 b(the)g(a)o(v)o +(erage)g(distance)g(of)g(a\(i,j\))g(from)f(diag)i(and)g(standard)510 +534 y(deviation)c(for)g(this)g(a)o(v)o(erage.)120 642 y Fh(SKYLINE)137 +b Fl(Computes)16 b(the)g(n)o(um)o(b)q(er)e(of)j(nonzeros)f(in)g(the)g +(skyline)f(storage.)120 763 y Fh(DISTDIA)n(G)108 b Fl(Computes)16 +b(the)g(n)o(um)o(b)q(ers)e(of)j(elemen)o(ts)c(in)j(eac)o(h)g(diagonal.)120 +883 y Fh(BANDP)-5 b(AR)g(T)70 b Fl(Computes)19 b(the)h(bandwidth)h(of)f(the)g +(banded)g(matrix,)f(whic)o(h)g(con)o(tains)510 943 y('np)q(er')d(p)q(ercen)o +(t)f(of)i(the)f(original)g(matrix.)120 1051 y Fh(NONZ)p 287 +1051 17 2 v 20 w(LUD)86 b Fl(Computes)20 b(the)h(n)o(um)o(b)q(er)e(of)j +(nonzero)f(elemen)o(ts)d(in)j(strict)f(lo)o(w)o(er)g(part,)510 +1112 y(strict)c(upp)q(er)g(part,)g(and)h(main)e(diagonal.)120 +1223 y Fh(A)-6 b(VNZ)p 279 1223 V 21 w(COL)97 b Fl(Computes)14 +b(a)o(v)o(erage)g(n)o(um)o(b)q(er)e(of)j(nonzero)g(elemen)o(ts/colum)o(n)c +(and)k(stan-)510 1283 y(dard)i(deviation)f(for)g(the)g(a)o(v)o(erage.)120 +1391 y Fh(VBRINF)n(O)126 b Fl(Prin)o(ts)16 b(information)f(ab)q(out)j +(matrices)c(in)i(v)m(ariable)g(blo)q(c)o(k)g(ro)o(w)g(format.)60 +1618 y Fk(7)83 b(Matrix)27 b(generation)g(routines)60 1727 +y Fl(One)c(of)h(the)g(di\016culties)d(encoun)o(tered)i(when)h(testing)f(and)h +(comparing)f(n)o(umerical)e(metho)q(ds,)60 1788 y(is)h(that)h(it)g(is)f +(sometimes)e(di\016cult)h(to)i(guaran)o(tee)g(that)g(the)f(matrices)f +(compared)g(are)i(indeed)60 1848 y(iden)o(tical.)28 b(Ev)o(en)18 +b(though)i(a)g(pap)q(er)f(ma)o(y)f(giv)o(e)g(full)g(details)g(on)i(the)e +(test)h(problems)f(considered,)60 1908 y(programming)d(errors)h(or)g +(di\013erences)f(in)h(co)q(ding)h(ma)o(y)d(lead)i(to)h(the)e(incorrect)g +(matrices)g(and)h(the)60 1968 y(incorrect)h(conclusions.)28 +b(This)18 b(has)h(often)g(happ)q(ened)g(in)f(the)g(past)h(and)g(is)f(lik)o +(ely)e(to)i(b)q(e)h(a)o(v)o(oided)60 2028 y(if)f(the)h(matrices)d(w)o(ere)i +(generated)h(with)f(exactly)g(the)g(same)g(co)q(de.)28 b(The)19 +b(mo)q(dule)f(MA)l(TGEN)g(of)60 2088 y(SP)l(ARSKIT)e(includes)f(sev)o(eral)g +(matrix)g(generation)h(routines.)60 2233 y Fi(7.1)70 b(Finite)20 +b(Di\013erence)h(Matrices)120 2325 y Fl(1.)j(Scalar)16 b(5-p)q(oin)o(t)h(and) +g(7-p)q(oin)o(t)g(matrices)d(arising)i(from)f(discretization)g(of)i(the)f +(elliptic)e(t)o(yp)q(e)182 2385 y(equation:)182 2517 y Fj(Lu)g +Fl(=)327 2484 y Fj(@)p 313 2506 57 2 v 313 2552 a(@)s(x)375 +2517 y Fl(\()p Fj(a)438 2484 y(@)p 425 2506 V 425 2552 a(@)s(x)485 +2517 y(u)p Fl(\))8 b(+)603 2484 y Fj(@)p 590 2506 55 2 v 590 +2552 a(@)s(y)649 2517 y Fl(\()p Fj(b)707 2484 y(@)p 694 2506 +V 694 2552 a(@)s(y)753 2517 y(u)p Fl(\))g(+)870 2484 y Fj(@)p +857 2506 54 2 v 857 2552 a(@)s(z)916 2517 y Fl(\()p Fj(c)973 +2484 y(@)p 961 2506 V 961 2552 a(@)s(z)1019 2517 y(u)p Fl(\))g(+)1138 +2484 y Fj(@)p 1124 2506 57 2 v 1124 2552 a(@)s(x)1185 2517 +y Fl(\()p Fj(du)p Fl(\))g(+)1347 2484 y Fj(@)p 1334 2506 55 +2 v 1334 2552 a(@)s(y)1393 2517 y Fl(\()p Fj(eu)p Fl(\))g(+)1552 +2484 y Fj(@)p 1539 2506 54 2 v 1539 2552 a(@)s(z)1598 2517 +y Fl(\()p Fj(f)d(u)p Fl(\))j(+)g Fj(g)r(u)k Fl(=)i Fj(hu)1858 +2603 y Fl(\(1\))p eop +%%Page: 23 23 +23 22 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(23)60 +204 y Fa(*)25 b(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g +(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)h(*)f(*)g(*)g +(*)h(*)f(*)60 264 y(*)g(UNSYMMETRIC)d(MATRIX)h(FROM)h(PORES)1101 +b(*)60 325 y(*)512 b(Key)25 b(=)g(PORES)f(2)51 b(,)25 b(Type)f(=)h(RUA)666 +b(*)60 385 y(*)25 b(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f +(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)h(*)f(*)g +(*)g(*)h(*)f(*)163 445 y(*)50 b(Dimension)23 b(N)973 b(=)180 +b(1224)49 b(*)163 505 y(*)h(Number)24 b(of)h(nonzero)e(elements)586 +b(=)180 b(9613)49 b(*)163 565 y(*)h(Average)23 b(number)h(of)h(nonzero)e +(elements/C)o(ol)o(umn)201 b(=)128 b(7.8538)49 b(*)163 625 +y(*)h(Standard)23 b(deviation)f(for)j(above)f(average)330 b(=)128 +b(5.4337)49 b(*)163 686 y(*)h(Nonzero)23 b(elements)g(in)i(strict)f(lower)f +(part)306 b(=)180 b(4384)49 b(*)163 746 y(*)h(Nonzero)23 b(elements)g(in)i +(strict)f(upper)f(part)306 b(=)180 b(4005)49 b(*)163 806 y(*)h(Nonzero)23 +b(elements)g(in)i(main)f(diagonal)407 b(=)180 b(1224)49 b(*)163 +866 y(*)h(Weight)24 b(of)h(longest)e(column)638 b(=)231 b(30)50 +b(*)163 926 y(*)g(Weight)24 b(of)h(shortest)d(column)613 b(=)256 +b(2)51 b(*)163 987 y(*)f(Weight)24 b(of)h(longest)e(row)716 +b(=)231 b(16)50 b(*)163 1047 y(*)g(Weight)24 b(of)h(shortest)d(row)691 +b(=)256 b(5)51 b(*)163 1107 y(*)f(Matching)23 b(elements)g(in)i(symmetry)509 +b(=)180 b(6358)49 b(*)163 1167 y(*)h(Relative)23 b(Symmetry)g(Match)h +(\(symmetry)o(=1\))329 b(=)128 b(0.6614)49 b(*)163 1227 y(*)h(Average)23 +b(distance)g(of)i(a\(i,j\))49 b(from)24 b(diag.)280 b(=)51 +b(0.615E+02)d(*)163 1288 y(*)i(Standard)23 b(deviation)f(for)j(above)f +(average)330 b(=)51 b(0.103E+03)d(*)163 1348 y(*--------)o(--)o(---)o(---)o +(---)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o +(---)o(---)o(---)o(--)o(---)o(*)163 1408 y(*)i(Frobenius)23 +b(norm)h(of)h(A)768 b(=)51 b(0.150E+09)d(*)163 1468 y(*)i(Frobenius)23 +b(norm)h(of)h(symmetric)d(part)434 b(=)51 b(0.103E+09)d(*)163 +1528 y(*)i(Frobenius)23 b(norm)h(of)h(nonsymmetr)o(ic)d(part)357 +b(=)51 b(0.980E+08)d(*)163 1589 y(*)i(Maximum)23 b(element)h(in)g(A)743 +b(=)51 b(0.378E+08)d(*)163 1649 y(*)i(Percentage)22 b(of)j(weakly)f +(diagonall)o(y)f(dominant)f(rows)101 b(=)51 b(0.490E-02)d(*)163 +1709 y(*)i(Percentage)22 b(of)j(weakly)f(diagonall)o(y)f(dominant)f(columns)h +(=)51 b(0.481E+00)d(*)163 1769 y(*--------)o(--)o(---)o(---)o(---)o(--)o(---) +o(---)o(---)o(--)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(---)o +(--)o(---)o(*)163 1829 y(*)i(Lower)24 b(bandwidth)48 b(\(max:)24 +b(i-j,)g(a\(i,j\))g(.ne.)g(0\))178 b(=)205 b(470)50 b(*)163 +1890 y(*)g(Upper)24 b(bandwidth)48 b(\(max:)24 b(j-i,)g(a\(i,j\))g(.ne.)g +(0\))178 b(=)205 b(471)50 b(*)163 1950 y(*)g(Maximum)23 b(Bandwidth)817 +b(=)205 b(736)50 b(*)163 2010 y(*)g(Average)23 b(Bandwidth)817 +b(=)51 b(0.190E+03)d(*)163 2070 y(*)i(Number)24 b(of)h(nonzeros)d(in)j +(skyline)e(storage)305 b(=)128 b(342833)49 b(*)163 2130 y(*)h(90\045)25 +b(of)g(matrix)e(is)i(in)g(the)g(band)f(of)h(width)305 b(=)205 +b(527)50 b(*)163 2190 y(*)g(80\045)25 b(of)g(matrix)e(is)i(in)g(the)g(band)f +(of)h(width)305 b(=)205 b(145)50 b(*)163 2251 y(*)g(The)25 +b(total)f(number)f(of)i(nonvoid)e(diagonals)f(is)230 b(=)205 +b(367)50 b(*)163 2311 y(*)g(The)25 b(10)g(most)f(important)e(diagonals)h(are) +h(\(offsets\))99 b(:)333 b(*)163 2371 y(*)127 b(0)102 b(-1)128 +b(1)g(2)102 b(-2)127 b(3)102 b(32)77 b(264)50 b(-264)75 b(-32)127 +b(*)163 2431 y(*)50 b(The)25 b(accumulate)o(d)e(percentag)o(es)f(they)i +(represent)f(are)75 b(:)333 b(*)163 2491 y(*)50 b(12.7)g(24.6)g(31.7)g(37.9)g +(43.6)f(49.0)h(52.4)g(55.7)g(58.6)g(61.4)126 b(*)163 2552 y(*--------)o(--)o +(---)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(--)o(---)o(---)o +(---)o(--)o(---)o(---)o(---)o(--)o(---)o(*)163 2612 y(*)50 +b(The)25 b(matrix)e(does)i(not)f(have)g(a)i(block)d(structure)535 +b(*)163 2672 y(*--------)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o +(---)o(---)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o(---)o(*)568 +2828 y Fl(Figure)15 b(3:)22 b(Sample)15 b(output)i(from)e(Info1.ex)p +eop +%%Page: 24 24 +24 23 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(24)60 +376 y Fa(*)25 b(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g +(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)h(*)f(*)g(*)g +(*)h(*)f(*)60 436 y(*)g(SYMMETRIC)e(PATTERN)g(FROM)h(CANNES,LUC)o(IE)o(N)f +(MARRO,JUN)o(E)g(1981.)485 b(*)60 497 y(*)512 b(Key)25 b(=)g(CAN)g(1072)f(,)h +(Type)f(=)h(PSA)666 b(*)60 557 y(*)25 b(No)g(values)f(provided)e(-)k +(Informati)o(on)c(on)j(pattern)e(only)614 b(*)60 617 y(*)25 +b(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)h(*)f(*)g(*)g +(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)g(*)h(*)f(*)g(*)g(*)h(*)f(*)163 +677 y(*)50 b(Dimension)23 b(N)973 b(=)180 b(1072)49 b(*)163 +737 y(*)h(Number)24 b(of)h(nonzero)e(elements)586 b(=)180 b(6758)49 +b(*)163 798 y(*)h(Average)23 b(number)h(of)h(nonzero)e(elements/C)o(ol)o(umn) +201 b(=)128 b(6.3041)49 b(*)163 858 y(*)h(Standard)23 b(deviation)f(for)j +(above)f(average)330 b(=)128 b(6.2777)49 b(*)163 918 y(*)h(Nonzero)23 +b(elements)g(in)i(strict)f(lower)f(part)306 b(=)180 b(5686)49 +b(*)163 978 y(*)h(Nonzero)23 b(elements)g(in)i(strict)f(upper)f(part)306 +b(=)180 b(5686)49 b(*)163 1038 y(*)h(Nonzero)23 b(elements)g(in)i(main)f +(diagonal)407 b(=)180 b(1072)49 b(*)163 1099 y(*)h(Weight)24 +b(of)h(longest)e(column)638 b(=)231 b(39)50 b(*)163 1159 y(*)g(Weight)24 +b(of)h(shortest)d(column)613 b(=)256 b(4)51 b(*)163 1219 y(*)f(Matching)23 +b(elements)g(in)i(symmetry)509 b(=)180 b(6758)49 b(*)163 1279 +y(*)h(Relative)23 b(Symmetry)g(Match)h(\(symmetry)o(=1\))329 +b(=)128 b(1.0000)49 b(*)163 1339 y(*)h(Average)23 b(distance)g(of)i(a\(i,j\)) +49 b(from)24 b(diag.)280 b(=)51 b(0.110E+03)d(*)163 1399 y(*)i(Standard)23 +b(deviation)f(for)j(above)f(average)330 b(=)51 b(0.174E+03)d(*)163 +1460 y(*--------)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o(---)o +(---)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o(---)o(*)163 +1520 y(*)i(Lower)24 b(bandwidth)48 b(\(max:)24 b(i-j,)g(a\(i,j\))g(.ne.)g +(0\))178 b(=)256 b(0)51 b(*)163 1580 y(*)f(Upper)24 b(bandwidth)48 +b(\(max:)24 b(j-i,)g(a\(i,j\))g(.ne.)g(0\))178 b(=)i(1048)49 +b(*)163 1640 y(*)h(Maximum)23 b(Bandwidth)817 b(=)180 b(1049)49 +b(*)163 1700 y(*)h(Average)23 b(Bandwidth)817 b(=)51 b(0.117E+03)d(*)163 +1761 y(*)i(Number)24 b(of)h(nonzeros)d(in)j(skyline)e(storage)305 +b(=)128 b(278320)49 b(*)163 1821 y(*)h(90\045)25 b(of)g(matrix)e(is)i(in)g +(the)g(band)f(of)h(width)305 b(=)205 b(639)50 b(*)163 1881 +y(*)g(80\045)25 b(of)g(matrix)e(is)i(in)g(the)g(band)f(of)h(width)305 +b(=)205 b(343)50 b(*)163 1941 y(*)g(The)25 b(total)f(number)f(of)i(nonvoid)e +(diagonals)f(is)230 b(=)205 b(627)50 b(*)163 2001 y(*)g(The)h(5)25 +b(most)f(important)e(diagonals)h(are)h(\(offsets\))99 b(:)333 +b(*)163 2062 y(*)127 b(0)h(1)g(2)g(3)g(4)896 b(*)163 2122 y(*)50 +b(The)25 b(accumulate)o(d)e(percentag)o(es)f(they)i(represent)f(are)75 +b(:)333 b(*)163 2182 y(*)50 b(15.9)g(24.7)g(29.7)g(33.9)g(36.3)895 +b(*)163 2242 y(*--------)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o +(---)o(---)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o(---)o(*)163 +2302 y(*)50 b(The)25 b(matrix)e(does)i(not)f(have)g(a)i(block)d(structure)535 +b(*)163 2363 y(*--------)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o +(---)o(---)o(--)o(---)o(---)o(---)o(--)o(---)o(---)o(---)o(--)o(---)o(*)255 +2518 y Fl(Figure)16 b(4:)22 b(Sample)14 b(output)j(from)e(Info1.ex)h(for)h +(matrix)d(with)i(pattern)h(only)p eop +%%Page: 25 25 +25 24 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(25)182 +132 y(on)15 b(rectangular)g(regions)f(with)h(general)f(mixed)e(t)o(yp)q(e)i +(b)q(oundary)i(conditions)e(of)h(the)f(follo)o(w-)182 192 y(ing)i(form)896 +274 y Fj(\013)933 240 y(@)s(u)p 932 262 58 2 v 932 308 a(@)s(n)1006 +274 y Fl(+)11 b Fj(\014)s(u)h Fl(=)i Fj(\015)182 374 y Fl(The)e(user)g(pro)o +(vides)f(the)h(functions)g Fj(a;)c(b;)g(c;)g(:::;)g(h)p Fl(,)i +Fj(\014)s(;)e(\015)14 b Fl(and)f Fj(\013)f Fl(is)g(a)g(constan)o(t)h(on)f +(eac)o(h)g(b)q(ound-)182 434 y(ary)18 b(surface.)25 b(The)18 +b(resulting)f(matrix)f(is)h(in)g(general)h(sparse)g(format,)f(p)q(ossibly)h +(prin)o(ted)e(in)182 494 y(a)h(\014le)e(in)h(the)g(H/B)g(format.)182 +575 y(There)i(is)g(a)h(switc)o(h)e(in)h(the)h(subroutine)f(whic)o(h)g(mak)o +(es)e(it)i(p)q(ossible)h(to)f(c)o(ho)q(ose)h(b)q(et)o(w)o(een)f(a)182 +635 y(strict)e(cen)o(tered)g(di\013erence)g(t)o(yp)q(e)g(of)i +(discretization,)d(or)j(an)f(up)o(wind)g(sc)o(heme)e(for)i(the)g(\014rst)182 +695 y(order)f(deriv)m(ativ)o(es.)120 797 y(2.)24 b(Blo)q(c)o(k)16 +b(5-p)q(oin)o(t)i(and)f(7-p)q(oin)o(t)h(matrices)d(arising)j(from)e +(discretization)g(of)h(the)g(elliptic)e(t)o(yp)q(e)182 857 +y(equation)h(\(1\))h(in)g(whic)o(h)e Fj(u)i Fl(is)f(no)o(w)h(a)g(v)o(ector)f +(of)h Fj(nf)5 b(r)q(ee)16 b Fl(comp)q(onen)o(ts,)g(and)h Fj(a;)8 +b(b;)g(c;)g(:::;)g(g)16 b Fl(are)182 918 y Fj(nf)5 b(r)q(ee)11 +b Fg(\002)g Fj(nf)5 b(r)q(ee)16 b Fl(matrices)e(pro)o(vided)i(b)o(y)g(the)g +(user.)60 1062 y Fi(7.2)70 b(Finite)20 b(Elemen)n(t)h(Matrices)60 +1154 y Fl(Finite)15 b(elemen)o(t)e(matrices)h(created)i(from)f(the)h(con)o(v) +o(ection-di\013usion)g(t)o(yp)q(e)g(problem)736 1264 y Fg(\000)10 +b(r)p Fj(:)p Fl(\()p Fj(K)t Fg(r)p Fj(u)o Fl(\))h(+)g Fj(C)t +Fg(r)p Fj(u)h Fl(=)i Fj(f)608 b Fl(\(2\))60 1374 y(on)15 b(a)f(domain)f +Fj(D)j Fl(with)e(Diric)o(hlet)e(b)q(oundary)k(conditions.)k(A)14 +b(coarse)h(initial)d(domain)i(is)g(describ)q(ed)60 1435 y(b)o(y)j(the)g(user) +g(and)h(the)f(co)q(de)g(do)q(es)h(an)g(arbitrary)f(user-sp)q(eci\014ed)g(n)o +(um)o(b)q(er)e(of)j(re\014nemen)o(ts)d(of)i(the)60 1495 y(grid)g(and)h(assem) +o(bles)d(the)i(matrix,)e(in)i(CSR)g(format.)23 b(Linear)18 +b(triangular)f(elemen)o(ts)d(are)k(used.)23 b(If)60 1555 y(only)17 +b(the)f(matrix)f(is)i(desired)f(the)g(heat)h(source)g Fj(f)22 +b Fl(can)17 b(b)q(e)g(zero.)22 b(Arbitrary)16 b(grids)h(can)g(b)q(e)g(input,) +60 1615 y(but)i(the)f(user)h(ma)o(y)e(also)j(tak)o(e)e(adv)m(an)o(tage)i(of)f +(nine)f(initial)g(grids)h(supplied)f(b)o(y)g(the)h(pac)o(k)m(age)g(for)60 +1675 y(simple)14 b(test)i(problems.)120 1735 y(Tw)o(o)i(examples)d(of)j +(meshes)e(and)i(the)g(corresp)q(onding)g(assem)o(ble)e(matrices)f(are)j(sho)o +(wn)g(in)f(the)60 1796 y(follo)o(wing)c(t)o(w)o(o)h(pairs)g(of)f(\014gures:) +21 b(the)13 b(\014rst)h(pair)g(of)f(\014gures)i(are)e(the)g(mesh)g(and)h +(assem)o(bled)e(matrix)60 1856 y(with)22 b(mesh)f(n)o(um)o(b)q(er)g(8)i(and)g +(re\014nemen)o(t)d(1;)26 b(the)c(second)g(pair)h(of)g(\014gures)g(are)f(the)g +(mesh)f(and)60 1916 y(assem)o(bled)15 b(matrix)f(with)i(mesh)f(n)o(um)o(b)q +(er)g(9)h(and)h(re\014nemen)o(t)d(1.)60 1974 y @beginspecial +40 @vscale 40 @hscale -20 @hoffset -220 @voffset @setspecial +%%BeginDocument: msh.ps.8 +%! +%%Creator: PSPLTM routine +%%BoundingBox: 214.79 10.19 1339.69 1151.29 +%%EndComments +/cm {72 mul 2.54 div} def +/mc {72 div 2.54 mul} def +/pnum { 72 div 2.54 mul 20 string +cvs print ( ) print} def +/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def +gsave + /Helvetica findfont 8.33333E-02 cm scalefont setfont + 10.7950 cm 0.500000 cm moveto +(Finite element mesh) Cshow + 3.17500 cm 0.333333 cm translate + 15.2400 cm 6.00000 div dup scale + 0.01 setlinewidth + 0.00 0.00 moveto + 0.00 0.29 lineto +closepath stroke + 0.00 0.00 moveto + 0.39 0.44 lineto +closepath stroke + 0.00 0.00 moveto + 0.63 0.00 lineto +closepath stroke + 6.00 0.00 moveto + 5.80 0.00 lineto +closepath stroke + 6.00 0.00 moveto + 5.80 0.23 lineto +closepath stroke + 6.00 0.00 moveto + 6.00 0.61 lineto +closepath stroke + 6.00 6.00 moveto + 6.00 5.39 lineto +closepath stroke + 6.00 6.00 moveto + 5.80 5.77 lineto +closepath stroke + 6.00 6.00 moveto + 5.80 6.00 lineto +closepath stroke + 0.00 6.00 moveto + 0.63 6.00 lineto +closepath stroke + 0.00 6.00 moveto + 0.39 5.56 lineto +closepath stroke + 0.00 6.00 moveto + 0.00 5.71 lineto +closepath stroke + 4.60 3.00 moveto + 4.66 3.05 lineto +closepath stroke + 4.60 3.00 moveto + 4.68 3.00 lineto +closepath stroke + 4.60 3.00 moveto + 4.59 3.03 lineto +closepath stroke + 4.60 3.00 moveto + 4.66 2.95 lineto +closepath stroke + 4.60 3.00 moveto + 4.59 2.97 lineto +closepath stroke + 4.75 3.00 moveto + 4.68 3.00 lineto +closepath stroke + 4.75 3.00 moveto + 4.74 3.05 lineto +closepath stroke + 4.75 3.00 moveto + 4.82 3.06 lineto +closepath stroke + 4.75 3.00 moveto + 4.83 3.00 lineto +closepath stroke + 4.75 3.00 moveto + 4.82 2.94 lineto +closepath stroke + 4.75 3.00 moveto + 4.74 2.95 lineto +closepath stroke + 4.91 3.00 moveto + 4.83 3.00 lineto +closepath stroke + 4.91 3.00 moveto + 4.90 3.06 lineto +closepath stroke + 4.91 3.00 moveto + 4.99 3.08 lineto +closepath stroke + 4.91 3.00 moveto + 5.01 3.00 lineto +closepath stroke + 4.91 3.00 moveto + 4.99 2.92 lineto +closepath stroke + 4.91 3.00 moveto + 4.90 2.94 lineto +closepath stroke + 5.10 3.00 moveto + 5.01 3.00 lineto +closepath stroke + 5.10 3.00 moveto + 5.08 3.08 lineto +closepath stroke + 5.10 3.00 moveto + 5.18 3.10 lineto +closepath stroke + 5.10 3.00 moveto + 5.20 3.00 lineto +closepath stroke + 5.10 3.00 moveto + 5.18 2.90 lineto +closepath stroke + 5.10 3.00 moveto + 5.08 2.92 lineto +closepath stroke + 5.30 3.00 moveto + 5.20 3.00 lineto +closepath stroke + 5.30 3.00 moveto + 5.28 3.10 lineto +closepath stroke + 5.30 3.00 moveto + 5.38 3.13 lineto +closepath stroke + 5.30 3.00 moveto + 5.41 3.00 lineto +closepath stroke + 5.30 3.00 moveto + 5.38 2.87 lineto +closepath stroke + 5.30 3.00 moveto + 5.28 2.90 lineto +closepath stroke + 5.52 3.00 moveto + 5.41 3.00 lineto +closepath stroke + 5.52 3.00 moveto + 5.49 3.13 lineto +closepath stroke + 5.52 3.00 moveto + 5.61 3.15 lineto +closepath stroke + 5.52 3.00 moveto + 5.76 3.00 lineto +closepath stroke + 5.52 3.00 moveto + 5.61 2.85 lineto +closepath stroke + 5.52 3.00 moveto + 5.49 2.87 lineto +closepath stroke + 6.00 3.00 moveto + 5.76 3.00 lineto +closepath stroke + 6.00 3.00 moveto + 5.85 3.15 lineto +closepath stroke + 6.00 3.00 moveto + 6.00 3.15 lineto +closepath stroke + 6.00 3.00 moveto + 6.00 2.85 lineto +closepath stroke + 6.00 3.00 moveto + 5.85 2.85 lineto +closepath stroke + 4.58 3.06 moveto + 4.65 3.08 lineto +closepath stroke + 4.58 3.06 moveto + 4.59 3.03 lineto +closepath stroke + 4.58 3.06 moveto + 4.62 3.12 lineto +closepath stroke + 4.58 3.06 moveto + 4.56 3.09 lineto +closepath stroke + 4.73 3.09 moveto + 4.74 3.05 lineto +closepath stroke + 4.73 3.09 moveto + 4.66 3.05 lineto +closepath stroke + 4.73 3.09 moveto + 4.65 3.08 lineto +closepath stroke + 4.73 3.09 moveto + 4.81 3.11 lineto +closepath stroke + 4.73 3.09 moveto + 4.70 3.13 lineto +closepath stroke + 4.73 3.09 moveto + 4.77 3.17 lineto +closepath stroke + 4.89 3.13 moveto + 4.90 3.06 lineto +closepath stroke + 4.89 3.13 moveto + 4.82 3.06 lineto +closepath stroke + 4.89 3.13 moveto + 4.81 3.11 lineto +closepath stroke + 4.89 3.13 moveto + 4.98 3.15 lineto +closepath stroke + 4.89 3.13 moveto + 4.85 3.18 lineto +closepath stroke + 4.89 3.13 moveto + 4.93 3.22 lineto +closepath stroke + 5.06 3.16 moveto + 5.08 3.08 lineto +closepath stroke + 5.06 3.16 moveto + 4.99 3.08 lineto +closepath stroke + 5.06 3.16 moveto + 4.98 3.15 lineto +closepath stroke + 5.06 3.16 moveto + 5.16 3.18 lineto +closepath stroke + 5.06 3.16 moveto + 5.02 3.24 lineto +closepath stroke + 5.06 3.16 moveto + 5.10 3.28 lineto +closepath stroke + 5.26 3.21 moveto + 5.28 3.10 lineto +closepath stroke + 5.26 3.21 moveto + 5.18 3.10 lineto +closepath stroke + 5.26 3.21 moveto + 5.16 3.18 lineto +closepath stroke + 5.26 3.21 moveto + 5.36 3.23 lineto +closepath stroke + 5.26 3.21 moveto + 5.20 3.30 lineto +closepath stroke + 5.26 3.21 moveto + 5.30 3.34 lineto +closepath stroke + 5.47 3.25 moveto + 5.49 3.13 lineto +closepath stroke + 5.47 3.25 moveto + 5.38 3.13 lineto +closepath stroke + 5.47 3.25 moveto + 5.36 3.23 lineto +closepath stroke + 5.47 3.25 moveto + 5.59 3.28 lineto +closepath stroke + 5.47 3.25 moveto + 5.41 3.36 lineto +closepath stroke + 5.47 3.25 moveto + 5.51 3.41 lineto +closepath stroke + 5.70 3.30 moveto + 5.85 3.15 lineto +closepath stroke + 5.70 3.30 moveto + 5.61 3.15 lineto +closepath stroke + 5.70 3.30 moveto + 5.59 3.28 lineto +closepath stroke + 5.70 3.30 moveto + 5.85 3.30 lineto +closepath stroke + 5.70 3.30 moveto + 5.63 3.44 lineto +closepath stroke + 5.70 3.30 moveto + 5.85 3.49 lineto +closepath stroke + 6.00 3.30 moveto + 6.00 3.15 lineto +closepath stroke + 6.00 3.30 moveto + 5.85 3.30 lineto +closepath stroke + 6.00 3.30 moveto + 6.00 3.49 lineto +closepath stroke + 4.53 3.12 moveto + 4.60 3.15 lineto +closepath stroke + 4.53 3.12 moveto + 4.56 3.09 lineto +closepath stroke + 4.53 3.12 moveto + 4.55 3.18 lineto +closepath stroke + 4.53 3.12 moveto + 4.49 3.14 lineto +closepath stroke + 4.66 3.18 moveto + 4.70 3.13 lineto +closepath stroke + 4.66 3.18 moveto + 4.62 3.12 lineto +closepath stroke + 4.66 3.18 moveto + 4.60 3.15 lineto +closepath stroke + 4.66 3.18 moveto + 4.74 3.21 lineto +closepath stroke + 4.66 3.18 moveto + 4.61 3.21 lineto +closepath stroke + 4.66 3.18 moveto + 4.68 3.26 lineto +closepath stroke + 4.81 3.24 moveto + 4.85 3.18 lineto +closepath stroke + 4.81 3.24 moveto + 4.77 3.17 lineto +closepath stroke + 4.81 3.24 moveto + 4.74 3.21 lineto +closepath stroke + 4.81 3.24 moveto + 4.89 3.28 lineto +closepath stroke + 4.81 3.24 moveto + 4.75 3.29 lineto +closepath stroke + 4.81 3.24 moveto + 4.82 3.34 lineto +closepath stroke + 4.97 3.31 moveto + 5.02 3.24 lineto +closepath stroke + 4.97 3.31 moveto + 4.93 3.22 lineto +closepath stroke + 4.97 3.31 moveto + 4.89 3.28 lineto +closepath stroke + 4.97 3.31 moveto + 5.06 3.35 lineto +closepath stroke + 4.97 3.31 moveto + 4.90 3.37 lineto +closepath stroke + 4.97 3.31 moveto + 4.97 3.43 lineto +closepath stroke + 5.15 3.39 moveto + 5.20 3.30 lineto +closepath stroke + 5.15 3.39 moveto + 5.10 3.28 lineto +closepath stroke + 5.15 3.39 moveto + 5.06 3.35 lineto +closepath stroke + 5.15 3.39 moveto + 5.24 3.44 lineto +closepath stroke + 5.15 3.39 moveto + 5.06 3.47 lineto +closepath stroke + 5.15 3.39 moveto + 5.14 3.53 lineto +closepath stroke + 5.34 3.48 moveto + 5.41 3.36 lineto +closepath stroke + 5.34 3.48 moveto + 5.30 3.34 lineto +closepath stroke + 5.34 3.48 moveto + 5.24 3.44 lineto +closepath stroke + 5.34 3.48 moveto + 5.45 3.53 lineto +closepath stroke + 5.34 3.48 moveto + 5.24 3.57 lineto +closepath stroke + 5.34 3.48 moveto + 5.33 3.64 lineto +closepath stroke + 5.55 3.57 moveto + 5.63 3.44 lineto +closepath stroke + 5.55 3.57 moveto + 5.51 3.41 lineto +closepath stroke + 5.55 3.57 moveto + 5.45 3.53 lineto +closepath stroke + 5.55 3.57 moveto + 5.78 3.63 lineto +closepath stroke + 5.55 3.57 moveto + 5.44 3.69 lineto +closepath stroke + 5.55 3.57 moveto + 5.54 3.76 lineto +closepath stroke + 6.00 3.68 moveto + 6.00 3.49 lineto +closepath stroke + 6.00 3.68 moveto + 5.85 3.49 lineto +closepath stroke + 6.00 3.68 moveto + 5.78 3.63 lineto +closepath stroke + 6.00 3.68 moveto + 5.76 3.81 lineto +closepath stroke + 6.00 3.68 moveto + 5.87 3.89 lineto +closepath stroke + 6.00 3.68 moveto + 6.00 3.89 lineto +closepath stroke + 4.45 3.16 moveto + 4.51 3.21 lineto +closepath stroke + 4.45 3.16 moveto + 4.49 3.14 lineto +closepath stroke + 4.45 3.16 moveto + 4.45 3.23 lineto +closepath stroke + 4.45 3.16 moveto + 4.40 3.18 lineto +closepath stroke + 4.57 3.25 moveto + 4.61 3.21 lineto +closepath stroke + 4.57 3.25 moveto + 4.55 3.18 lineto +closepath stroke + 4.57 3.25 moveto + 4.51 3.21 lineto +closepath stroke + 4.57 3.25 moveto + 4.63 3.29 lineto +closepath stroke + 4.57 3.25 moveto + 4.50 3.27 lineto +closepath stroke + 4.57 3.25 moveto + 4.55 3.33 lineto +closepath stroke + 4.69 3.34 moveto + 4.75 3.29 lineto +closepath stroke + 4.69 3.34 moveto + 4.68 3.26 lineto +closepath stroke + 4.69 3.34 moveto + 4.63 3.29 lineto +closepath stroke + 4.69 3.34 moveto + 4.76 3.39 lineto +closepath stroke + 4.69 3.34 moveto + 4.62 3.37 lineto +closepath stroke + 4.69 3.34 moveto + 4.67 3.43 lineto +closepath stroke + 4.83 3.44 moveto + 4.90 3.37 lineto +closepath stroke + 4.83 3.44 moveto + 4.82 3.34 lineto +closepath stroke + 4.83 3.44 moveto + 4.76 3.39 lineto +closepath stroke + 4.83 3.44 moveto + 4.90 3.49 lineto +closepath stroke + 4.83 3.44 moveto + 4.74 3.48 lineto +closepath stroke + 4.83 3.44 moveto + 4.80 3.55 lineto +closepath stroke + 4.98 3.55 moveto + 5.06 3.47 lineto +closepath stroke + 4.98 3.55 moveto + 4.97 3.43 lineto +closepath stroke + 4.98 3.55 moveto + 4.90 3.49 lineto +closepath stroke + 4.98 3.55 moveto + 5.06 3.61 lineto +closepath stroke + 4.98 3.55 moveto + 4.87 3.60 lineto +closepath stroke + 4.98 3.55 moveto + 4.94 3.67 lineto +closepath stroke + 5.14 3.67 moveto + 5.24 3.57 lineto +closepath stroke + 5.14 3.67 moveto + 5.14 3.53 lineto +closepath stroke + 5.14 3.67 moveto + 5.06 3.61 lineto +closepath stroke + 5.14 3.67 moveto + 5.23 3.73 lineto +closepath stroke + 5.14 3.67 moveto + 5.02 3.73 lineto +closepath stroke + 5.14 3.67 moveto + 5.09 3.81 lineto +closepath stroke + 5.32 3.80 moveto + 5.44 3.69 lineto +closepath stroke + 5.32 3.80 moveto + 5.33 3.64 lineto +closepath stroke + 5.32 3.80 moveto + 5.23 3.73 lineto +closepath stroke + 5.32 3.80 moveto + 5.42 3.87 lineto +closepath stroke + 5.32 3.80 moveto + 5.18 3.88 lineto +closepath stroke + 5.32 3.80 moveto + 5.26 3.97 lineto +closepath stroke + 5.52 3.94 moveto + 5.76 3.81 lineto +closepath stroke + 5.52 3.94 moveto + 5.54 3.76 lineto +closepath stroke + 5.52 3.94 moveto + 5.42 3.87 lineto +closepath stroke + 5.52 3.94 moveto + 5.63 4.02 lineto +closepath stroke + 5.52 3.94 moveto + 5.36 4.04 lineto +closepath stroke + 5.52 3.94 moveto + 5.45 4.14 lineto +closepath stroke + 5.74 4.10 moveto + 5.87 3.89 lineto +closepath stroke + 5.74 4.10 moveto + 5.63 4.02 lineto +closepath stroke + 5.74 4.10 moveto + 5.87 4.10 lineto +closepath stroke + 5.74 4.10 moveto + 5.56 4.22 lineto +closepath stroke + 5.74 4.10 moveto + 5.65 4.32 lineto +closepath stroke + 6.00 4.10 moveto + 6.00 3.89 lineto +closepath stroke + 6.00 4.10 moveto + 5.87 4.10 lineto +closepath stroke + 6.00 4.10 moveto + 5.78 4.32 lineto +closepath stroke + 6.00 4.10 moveto + 6.00 4.44 lineto +closepath stroke + 4.36 3.20 moveto + 4.40 3.25 lineto +closepath stroke + 4.36 3.20 moveto + 4.40 3.18 lineto +closepath stroke + 4.36 3.20 moveto + 4.34 3.26 lineto +closepath stroke + 4.36 3.20 moveto + 4.30 3.21 lineto +closepath stroke + 4.44 3.30 moveto + 4.50 3.27 lineto +closepath stroke + 4.44 3.30 moveto + 4.45 3.23 lineto +closepath stroke + 4.44 3.30 moveto + 4.40 3.25 lineto +closepath stroke + 4.44 3.30 moveto + 4.49 3.35 lineto +closepath stroke + 4.44 3.30 moveto + 4.38 3.31 lineto +closepath stroke + 4.44 3.30 moveto + 4.41 3.37 lineto +closepath stroke + 4.54 3.40 moveto + 4.62 3.37 lineto +closepath stroke + 4.54 3.40 moveto + 4.55 3.33 lineto +closepath stroke + 4.54 3.40 moveto + 4.49 3.35 lineto +closepath stroke + 4.54 3.40 moveto + 4.60 3.46 lineto +closepath stroke + 4.54 3.40 moveto + 4.46 3.43 lineto +closepath stroke + 4.54 3.40 moveto + 4.50 3.49 lineto +closepath stroke + 4.65 3.52 moveto + 4.74 3.48 lineto +closepath stroke + 4.65 3.52 moveto + 4.67 3.43 lineto +closepath stroke + 4.65 3.52 moveto + 4.60 3.46 lineto +closepath stroke + 4.65 3.52 moveto + 4.71 3.59 lineto +closepath stroke + 4.65 3.52 moveto + 4.55 3.55 lineto +closepath stroke + 4.65 3.52 moveto + 4.60 3.62 lineto +closepath stroke + 4.77 3.66 moveto + 4.87 3.60 lineto +closepath stroke + 4.77 3.66 moveto + 4.80 3.55 lineto +closepath stroke + 4.77 3.66 moveto + 4.71 3.59 lineto +closepath stroke + 4.77 3.66 moveto + 4.83 3.73 lineto +closepath stroke + 4.77 3.66 moveto + 4.66 3.69 lineto +closepath stroke + 4.77 3.66 moveto + 4.70 3.77 lineto +closepath stroke + 4.90 3.80 moveto + 5.02 3.73 lineto +closepath stroke + 4.90 3.80 moveto + 4.94 3.67 lineto +closepath stroke + 4.90 3.80 moveto + 4.83 3.73 lineto +closepath stroke + 4.90 3.80 moveto + 4.97 3.88 lineto +closepath stroke + 4.90 3.80 moveto + 4.77 3.84 lineto +closepath stroke + 4.90 3.80 moveto + 4.82 3.93 lineto +closepath stroke + 5.04 3.96 moveto + 5.18 3.88 lineto +closepath stroke + 5.04 3.96 moveto + 5.09 3.81 lineto +closepath stroke + 5.04 3.96 moveto + 4.97 3.88 lineto +closepath stroke + 5.04 3.96 moveto + 5.12 4.05 lineto +closepath stroke + 5.04 3.96 moveto + 4.89 4.01 lineto +closepath stroke + 5.04 3.96 moveto + 4.95 4.11 lineto +closepath stroke + 5.20 4.13 moveto + 5.36 4.04 lineto +closepath stroke + 5.20 4.13 moveto + 5.26 3.97 lineto +closepath stroke + 5.20 4.13 moveto + 5.12 4.05 lineto +closepath stroke + 5.20 4.13 moveto + 5.29 4.23 lineto +closepath stroke + 5.20 4.13 moveto + 5.02 4.19 lineto +closepath stroke + 5.20 4.13 moveto + 5.09 4.30 lineto +closepath stroke + 5.37 4.33 moveto + 5.56 4.22 lineto +closepath stroke + 5.37 4.33 moveto + 5.45 4.14 lineto +closepath stroke + 5.37 4.33 moveto + 5.29 4.23 lineto +closepath stroke + 5.37 4.33 moveto + 5.47 4.43 lineto +closepath stroke + 5.37 4.33 moveto + 5.17 4.40 lineto +closepath stroke + 5.37 4.33 moveto + 5.24 4.51 lineto +closepath stroke + 5.56 4.54 moveto + 5.78 4.32 lineto +closepath stroke + 5.56 4.54 moveto + 5.65 4.32 lineto +closepath stroke + 5.56 4.54 moveto + 5.47 4.43 lineto +closepath stroke + 5.56 4.54 moveto + 5.78 4.66 lineto +closepath stroke + 5.56 4.54 moveto + 5.33 4.62 lineto +closepath stroke + 5.56 4.54 moveto + 5.41 4.75 lineto +closepath stroke + 5.56 4.54 moveto + 5.49 4.89 lineto +closepath stroke + 6.00 4.77 moveto + 6.00 4.44 lineto +closepath stroke + 6.00 4.77 moveto + 5.78 4.66 lineto +closepath stroke + 6.00 4.77 moveto + 5.71 5.00 lineto +closepath stroke + 6.00 4.77 moveto + 5.80 5.16 lineto +closepath stroke + 6.00 4.77 moveto + 6.00 5.39 lineto +closepath stroke + 4.25 3.22 moveto + 4.28 3.27 lineto +closepath stroke + 4.25 3.22 moveto + 4.30 3.21 lineto +closepath stroke + 4.25 3.22 moveto + 4.22 3.28 lineto +closepath stroke + 4.25 3.22 moveto + 4.20 3.22 lineto +closepath stroke + 4.31 3.33 moveto + 4.38 3.31 lineto +closepath stroke + 4.31 3.33 moveto + 4.34 3.26 lineto +closepath stroke + 4.31 3.33 moveto + 4.28 3.27 lineto +closepath stroke + 4.31 3.33 moveto + 4.35 3.39 lineto +closepath stroke + 4.31 3.33 moveto + 4.25 3.33 lineto +closepath stroke + 4.31 3.33 moveto + 4.27 3.40 lineto +closepath stroke + 4.38 3.45 moveto + 4.46 3.43 lineto +closepath stroke + 4.38 3.45 moveto + 4.41 3.37 lineto +closepath stroke + 4.38 3.45 moveto + 4.35 3.39 lineto +closepath stroke + 4.38 3.45 moveto + 4.42 3.51 lineto +closepath stroke + 4.38 3.45 moveto + 4.30 3.46 lineto +closepath stroke + 4.38 3.45 moveto + 4.33 3.53 lineto +closepath stroke + 4.46 3.58 moveto + 4.55 3.55 lineto +closepath stroke + 4.46 3.58 moveto + 4.50 3.49 lineto +closepath stroke + 4.46 3.58 moveto + 4.42 3.51 lineto +closepath stroke + 4.46 3.58 moveto + 4.50 3.65 lineto +closepath stroke + 4.46 3.58 moveto + 4.36 3.59 lineto +closepath stroke + 4.46 3.58 moveto + 4.39 3.67 lineto +closepath stroke + 4.54 3.72 moveto + 4.66 3.69 lineto +closepath stroke + 4.54 3.72 moveto + 4.60 3.62 lineto +closepath stroke + 4.54 3.72 moveto + 4.50 3.65 lineto +closepath stroke + 4.54 3.72 moveto + 4.59 3.80 lineto +closepath stroke + 4.54 3.72 moveto + 4.43 3.74 lineto +closepath stroke + 4.54 3.72 moveto + 4.46 3.82 lineto +closepath stroke + 4.64 3.88 moveto + 4.77 3.84 lineto +closepath stroke + 4.64 3.88 moveto + 4.70 3.77 lineto +closepath stroke + 4.64 3.88 moveto + 4.59 3.80 lineto +closepath stroke + 4.64 3.88 moveto + 4.69 3.97 lineto +closepath stroke + 4.64 3.88 moveto + 4.50 3.90 lineto +closepath stroke + 4.64 3.88 moveto + 4.53 3.99 lineto +closepath stroke + 4.74 4.06 moveto + 4.89 4.01 lineto +closepath stroke + 4.74 4.06 moveto + 4.82 3.93 lineto +closepath stroke + 4.74 4.06 moveto + 4.69 3.97 lineto +closepath stroke + 4.74 4.06 moveto + 4.79 4.15 lineto +closepath stroke + 4.74 4.06 moveto + 4.58 4.08 lineto +closepath stroke + 4.74 4.06 moveto + 4.62 4.18 lineto +closepath stroke + 4.85 4.25 moveto + 5.02 4.19 lineto +closepath stroke + 4.85 4.25 moveto + 4.95 4.11 lineto +closepath stroke + 4.85 4.25 moveto + 4.79 4.15 lineto +closepath stroke + 4.85 4.25 moveto + 4.91 4.36 lineto +closepath stroke + 4.85 4.25 moveto + 4.67 4.28 lineto +closepath stroke + 4.85 4.25 moveto + 4.71 4.39 lineto +closepath stroke + 4.97 4.46 moveto + 5.17 4.40 lineto +closepath stroke + 4.97 4.46 moveto + 5.09 4.30 lineto +closepath stroke + 4.97 4.46 moveto + 4.91 4.36 lineto +closepath stroke + 4.97 4.46 moveto + 5.04 4.58 lineto +closepath stroke + 4.97 4.46 moveto + 4.77 4.50 lineto +closepath stroke + 4.97 4.46 moveto + 4.81 4.62 lineto +closepath stroke + 5.11 4.70 moveto + 5.33 4.62 lineto +closepath stroke + 5.11 4.70 moveto + 5.24 4.51 lineto +closepath stroke + 5.11 4.70 moveto + 5.04 4.58 lineto +closepath stroke + 5.11 4.70 moveto + 5.18 4.83 lineto +closepath stroke + 5.11 4.70 moveto + 4.88 4.73 lineto +closepath stroke + 5.11 4.70 moveto + 4.92 4.87 lineto +closepath stroke + 5.25 4.95 moveto + 5.41 4.75 lineto +closepath stroke + 5.25 4.95 moveto + 5.18 4.83 lineto +closepath stroke + 5.25 4.95 moveto + 5.34 5.10 lineto +closepath stroke + 5.25 4.95 moveto + 5.00 5.00 lineto +closepath stroke + 5.25 4.95 moveto + 5.04 5.14 lineto +closepath stroke + 5.42 5.24 moveto + 5.71 5.00 lineto +closepath stroke + 5.42 5.24 moveto + 5.49 4.89 lineto +closepath stroke + 5.42 5.24 moveto + 5.34 5.10 lineto +closepath stroke + 5.42 5.24 moveto + 5.51 5.39 lineto +closepath stroke + 5.42 5.24 moveto + 5.12 5.29 lineto +closepath stroke + 5.60 5.55 moveto + 5.80 5.77 lineto +closepath stroke + 5.60 5.55 moveto + 5.80 5.16 lineto +closepath stroke + 5.60 5.55 moveto + 5.51 5.39 lineto +closepath stroke + 5.60 5.55 moveto + 5.60 5.77 lineto +closepath stroke + 5.60 5.55 moveto + 5.21 5.44 lineto +closepath stroke + 5.60 5.55 moveto + 5.27 5.77 lineto +closepath stroke + 5.60 6.00 moveto + 5.80 6.00 lineto +closepath stroke + 5.60 6.00 moveto + 5.60 5.77 lineto +closepath stroke + 5.60 6.00 moveto + 5.27 6.00 lineto +closepath stroke + 4.15 3.23 moveto + 4.17 3.28 lineto +closepath stroke + 4.15 3.23 moveto + 4.20 3.22 lineto +closepath stroke + 4.15 3.23 moveto + 4.10 3.29 lineto +closepath stroke + 4.15 3.23 moveto + 4.10 3.23 lineto +closepath stroke + 4.18 3.34 moveto + 4.25 3.33 lineto +closepath stroke + 4.18 3.34 moveto + 4.22 3.28 lineto +closepath stroke + 4.18 3.34 moveto + 4.17 3.28 lineto +closepath stroke + 4.18 3.34 moveto + 4.21 3.40 lineto +closepath stroke + 4.18 3.34 moveto + 4.12 3.34 lineto +closepath stroke + 4.18 3.34 moveto + 4.13 3.41 lineto +closepath stroke + 4.23 3.47 moveto + 4.30 3.46 lineto +closepath stroke + 4.23 3.47 moveto + 4.27 3.40 lineto +closepath stroke + 4.23 3.47 moveto + 4.21 3.40 lineto +closepath stroke + 4.23 3.47 moveto + 4.25 3.53 lineto +closepath stroke + 4.23 3.47 moveto + 4.15 3.47 lineto +closepath stroke + 4.23 3.47 moveto + 4.16 3.54 lineto +closepath stroke + 4.27 3.60 moveto + 4.36 3.59 lineto +closepath stroke + 4.27 3.60 moveto + 4.33 3.53 lineto +closepath stroke + 4.27 3.60 moveto + 4.25 3.53 lineto +closepath stroke + 4.27 3.60 moveto + 4.29 3.68 lineto +closepath stroke + 4.27 3.60 moveto + 4.18 3.61 lineto +closepath stroke + 4.27 3.60 moveto + 4.19 3.68 lineto +closepath stroke + 4.32 3.75 moveto + 4.43 3.74 lineto +closepath stroke + 4.32 3.75 moveto + 4.39 3.67 lineto +closepath stroke + 4.32 3.75 moveto + 4.29 3.68 lineto +closepath stroke + 4.32 3.75 moveto + 4.35 3.84 lineto +closepath stroke + 4.32 3.75 moveto + 4.21 3.76 lineto +closepath stroke + 4.32 3.75 moveto + 4.22 3.84 lineto +closepath stroke + 4.37 3.92 moveto + 4.50 3.90 lineto +closepath stroke + 4.37 3.92 moveto + 4.46 3.82 lineto +closepath stroke + 4.37 3.92 moveto + 4.35 3.84 lineto +closepath stroke + 4.37 3.92 moveto + 4.40 4.01 lineto +closepath stroke + 4.37 3.92 moveto + 4.25 3.93 lineto +closepath stroke + 4.37 3.92 moveto + 4.26 4.02 lineto +closepath stroke + 4.43 4.10 moveto + 4.58 4.08 lineto +closepath stroke + 4.43 4.10 moveto + 4.53 3.99 lineto +closepath stroke + 4.43 4.10 moveto + 4.40 4.01 lineto +closepath stroke + 4.43 4.10 moveto + 4.47 4.21 lineto +closepath stroke + 4.43 4.10 moveto + 4.29 4.11 lineto +closepath stroke + 4.43 4.10 moveto + 4.30 4.21 lineto +closepath stroke + 4.50 4.31 moveto + 4.67 4.28 lineto +closepath stroke + 4.50 4.31 moveto + 4.62 4.18 lineto +closepath stroke + 4.50 4.31 moveto + 4.47 4.21 lineto +closepath stroke + 4.50 4.31 moveto + 4.53 4.42 lineto +closepath stroke + 4.50 4.31 moveto + 4.33 4.31 lineto +closepath stroke + 4.50 4.31 moveto + 4.34 4.43 lineto +closepath stroke + 4.57 4.53 moveto + 4.77 4.50 lineto +closepath stroke + 4.57 4.53 moveto + 4.71 4.39 lineto +closepath stroke + 4.57 4.53 moveto + 4.53 4.42 lineto +closepath stroke + 4.57 4.53 moveto + 4.61 4.65 lineto +closepath stroke + 4.57 4.53 moveto + 4.38 4.54 lineto +closepath stroke + 4.57 4.53 moveto + 4.39 4.66 lineto +closepath stroke + 4.65 4.77 moveto + 4.88 4.73 lineto +closepath stroke + 4.65 4.77 moveto + 4.81 4.62 lineto +closepath stroke + 4.65 4.77 moveto + 4.61 4.65 lineto +closepath stroke + 4.65 4.77 moveto + 4.69 4.91 lineto +closepath stroke + 4.65 4.77 moveto + 4.43 4.78 lineto +closepath stroke + 4.65 4.77 moveto + 4.45 4.92 lineto +closepath stroke + 4.74 5.04 moveto + 5.00 5.00 lineto +closepath stroke + 4.74 5.04 moveto + 4.92 4.87 lineto +closepath stroke + 4.74 5.04 moveto + 4.69 4.91 lineto +closepath stroke + 4.74 5.04 moveto + 4.78 5.19 lineto +closepath stroke + 4.74 5.04 moveto + 4.49 5.05 lineto +closepath stroke + 4.74 5.04 moveto + 4.50 5.20 lineto +closepath stroke + 4.83 5.33 moveto + 5.21 5.44 lineto +closepath stroke + 4.83 5.33 moveto + 5.12 5.29 lineto +closepath stroke + 4.83 5.33 moveto + 5.04 5.14 lineto +closepath stroke + 4.83 5.33 moveto + 4.78 5.19 lineto +closepath stroke + 4.83 5.33 moveto + 4.88 5.67 lineto +closepath stroke + 4.83 5.33 moveto + 4.55 5.35 lineto +closepath stroke + 4.83 5.33 moveto + 4.57 5.67 lineto +closepath stroke + 4.94 6.00 moveto + 5.27 5.77 lineto +closepath stroke + 4.94 6.00 moveto + 4.88 5.67 lineto +closepath stroke + 4.94 6.00 moveto + 5.27 6.00 lineto +closepath stroke + 4.94 6.00 moveto + 4.62 6.00 lineto +closepath stroke + 4.05 3.23 moveto + 4.05 3.29 lineto +closepath stroke + 4.05 3.23 moveto + 4.10 3.23 lineto +closepath stroke + 4.05 3.23 moveto + 4.00 3.23 lineto +closepath stroke + 4.06 3.34 moveto + 4.12 3.34 lineto +closepath stroke + 4.06 3.34 moveto + 4.10 3.29 lineto +closepath stroke + 4.06 3.34 moveto + 4.05 3.29 lineto +closepath stroke + 4.06 3.34 moveto + 4.07 3.41 lineto +closepath stroke + 4.06 3.34 moveto + 4.01 3.29 lineto +closepath stroke + 4.06 3.34 moveto + 4.00 3.34 lineto +closepath stroke + 4.07 3.47 moveto + 4.15 3.47 lineto +closepath stroke + 4.07 3.47 moveto + 4.13 3.41 lineto +closepath stroke + 4.07 3.47 moveto + 4.07 3.41 lineto +closepath stroke + 4.07 3.47 moveto + 4.08 3.54 lineto +closepath stroke + 4.07 3.47 moveto + 4.01 3.41 lineto +closepath stroke + 4.07 3.47 moveto + 4.00 3.47 lineto +closepath stroke + 4.09 3.61 moveto + 4.18 3.61 lineto +closepath stroke + 4.09 3.61 moveto + 4.16 3.54 lineto +closepath stroke + 4.09 3.61 moveto + 4.08 3.54 lineto +closepath stroke + 4.09 3.61 moveto + 4.10 3.69 lineto +closepath stroke + 4.09 3.61 moveto + 4.01 3.54 lineto +closepath stroke + 4.09 3.61 moveto + 4.00 3.61 lineto +closepath stroke + 4.10 3.76 moveto + 4.21 3.76 lineto +closepath stroke + 4.10 3.76 moveto + 4.19 3.68 lineto +closepath stroke + 4.10 3.76 moveto + 4.10 3.69 lineto +closepath stroke + 4.10 3.76 moveto + 4.11 3.85 lineto +closepath stroke + 4.10 3.76 moveto + 4.01 3.69 lineto +closepath stroke + 4.10 3.76 moveto + 4.00 3.76 lineto +closepath stroke + 4.12 3.93 moveto + 4.25 3.93 lineto +closepath stroke + 4.12 3.93 moveto + 4.22 3.84 lineto +closepath stroke + 4.12 3.93 moveto + 4.11 3.85 lineto +closepath stroke + 4.12 3.93 moveto + 4.13 4.02 lineto +closepath stroke + 4.12 3.93 moveto + 4.01 3.85 lineto +closepath stroke + 4.12 3.93 moveto + 4.00 3.93 lineto +closepath stroke + 4.14 4.12 moveto + 4.29 4.11 lineto +closepath stroke + 4.14 4.12 moveto + 4.26 4.02 lineto +closepath stroke + 4.14 4.12 moveto + 4.13 4.02 lineto +closepath stroke + 4.14 4.12 moveto + 4.15 4.22 lineto +closepath stroke + 4.14 4.12 moveto + 4.01 4.02 lineto +closepath stroke + 4.14 4.12 moveto + 4.00 4.12 lineto +closepath stroke + 4.16 4.32 moveto + 4.33 4.31 lineto +closepath stroke + 4.16 4.32 moveto + 4.30 4.21 lineto +closepath stroke + 4.16 4.32 moveto + 4.15 4.22 lineto +closepath stroke + 4.16 4.32 moveto + 4.17 4.43 lineto +closepath stroke + 4.16 4.32 moveto + 4.01 4.22 lineto +closepath stroke + 4.16 4.32 moveto + 4.00 4.32 lineto +closepath stroke + 4.19 4.54 moveto + 4.38 4.54 lineto +closepath stroke + 4.19 4.54 moveto + 4.34 4.43 lineto +closepath stroke + 4.19 4.54 moveto + 4.17 4.43 lineto +closepath stroke + 4.19 4.54 moveto + 4.20 4.67 lineto +closepath stroke + 4.19 4.54 moveto + 4.01 4.43 lineto +closepath stroke + 4.19 4.54 moveto + 4.00 4.54 lineto +closepath stroke + 4.21 4.79 moveto + 4.43 4.78 lineto +closepath stroke + 4.21 4.79 moveto + 4.39 4.66 lineto +closepath stroke + 4.21 4.79 moveto + 4.20 4.67 lineto +closepath stroke + 4.21 4.79 moveto + 4.23 4.93 lineto +closepath stroke + 4.21 4.79 moveto + 4.01 4.67 lineto +closepath stroke + 4.21 4.79 moveto + 4.00 4.79 lineto +closepath stroke + 4.24 5.06 moveto + 4.49 5.05 lineto +closepath stroke + 4.24 5.06 moveto + 4.45 4.92 lineto +closepath stroke + 4.24 5.06 moveto + 4.23 4.93 lineto +closepath stroke + 4.24 5.06 moveto + 4.26 5.21 lineto +closepath stroke + 4.24 5.06 moveto + 4.01 4.93 lineto +closepath stroke + 4.24 5.06 moveto + 4.00 5.06 lineto +closepath stroke + 4.27 5.36 moveto + 4.55 5.35 lineto +closepath stroke + 4.27 5.36 moveto + 4.50 5.20 lineto +closepath stroke + 4.27 5.36 moveto + 4.26 5.21 lineto +closepath stroke + 4.27 5.36 moveto + 4.29 5.68 lineto +closepath stroke + 4.27 5.36 moveto + 4.02 5.21 lineto +closepath stroke + 4.27 5.36 moveto + 4.00 5.36 lineto +closepath stroke + 4.31 6.00 moveto + 4.62 6.00 lineto +closepath stroke + 4.31 6.00 moveto + 4.57 5.67 lineto +closepath stroke + 4.31 6.00 moveto + 4.29 5.68 lineto +closepath stroke + 4.31 6.00 moveto + 4.02 5.68 lineto +closepath stroke + 4.31 6.00 moveto + 4.00 6.00 lineto +closepath stroke + 3.95 3.23 moveto + 4.01 3.29 lineto +closepath stroke + 3.95 3.23 moveto + 4.00 3.23 lineto +closepath stroke + 3.95 3.23 moveto + 3.95 3.29 lineto +closepath stroke + 3.95 3.23 moveto + 3.90 3.23 lineto +closepath stroke + 3.94 3.35 moveto + 4.01 3.41 lineto +closepath stroke + 3.94 3.35 moveto + 4.00 3.34 lineto +closepath stroke + 3.94 3.35 moveto + 3.95 3.29 lineto +closepath stroke + 3.94 3.35 moveto + 3.93 3.41 lineto +closepath stroke + 3.94 3.35 moveto + 3.89 3.29 lineto +closepath stroke + 3.94 3.35 moveto + 3.88 3.35 lineto +closepath stroke + 3.93 3.47 moveto + 4.01 3.54 lineto +closepath stroke + 3.93 3.47 moveto + 4.00 3.47 lineto +closepath stroke + 3.93 3.47 moveto + 3.93 3.41 lineto +closepath stroke + 3.93 3.47 moveto + 3.92 3.54 lineto +closepath stroke + 3.93 3.47 moveto + 3.87 3.41 lineto +closepath stroke + 3.93 3.47 moveto + 3.85 3.47 lineto +closepath stroke + 3.91 3.61 moveto + 4.01 3.69 lineto +closepath stroke + 3.91 3.61 moveto + 4.00 3.61 lineto +closepath stroke + 3.91 3.61 moveto + 3.92 3.54 lineto +closepath stroke + 3.91 3.61 moveto + 3.90 3.69 lineto +closepath stroke + 3.91 3.61 moveto + 3.84 3.54 lineto +closepath stroke + 3.91 3.61 moveto + 3.82 3.61 lineto +closepath stroke + 3.90 3.76 moveto + 4.01 3.85 lineto +closepath stroke + 3.90 3.76 moveto + 4.00 3.76 lineto +closepath stroke + 3.90 3.76 moveto + 3.90 3.69 lineto +closepath stroke + 3.90 3.76 moveto + 3.89 3.85 lineto +closepath stroke + 3.90 3.76 moveto + 3.81 3.69 lineto +closepath stroke + 3.90 3.76 moveto + 3.79 3.77 lineto +closepath stroke + 3.88 3.93 moveto + 4.01 4.02 lineto +closepath stroke + 3.88 3.93 moveto + 4.00 3.93 lineto +closepath stroke + 3.88 3.93 moveto + 3.89 3.85 lineto +closepath stroke + 3.88 3.93 moveto + 3.87 4.02 lineto +closepath stroke + 3.88 3.93 moveto + 3.78 3.85 lineto +closepath stroke + 3.88 3.93 moveto + 3.75 3.94 lineto +closepath stroke + 3.86 4.12 moveto + 4.01 4.22 lineto +closepath stroke + 3.86 4.12 moveto + 4.00 4.12 lineto +closepath stroke + 3.86 4.12 moveto + 3.87 4.02 lineto +closepath stroke + 3.86 4.12 moveto + 3.85 4.22 lineto +closepath stroke + 3.86 4.12 moveto + 3.74 4.03 lineto +closepath stroke + 3.86 4.12 moveto + 3.71 4.12 lineto +closepath stroke + 3.84 4.32 moveto + 4.01 4.43 lineto +closepath stroke + 3.84 4.32 moveto + 4.00 4.32 lineto +closepath stroke + 3.84 4.32 moveto + 3.85 4.22 lineto +closepath stroke + 3.84 4.32 moveto + 3.83 4.43 lineto +closepath stroke + 3.84 4.32 moveto + 3.70 4.22 lineto +closepath stroke + 3.84 4.32 moveto + 3.66 4.33 lineto +closepath stroke + 3.81 4.55 moveto + 4.01 4.67 lineto +closepath stroke + 3.81 4.55 moveto + 4.00 4.54 lineto +closepath stroke + 3.81 4.55 moveto + 3.83 4.43 lineto +closepath stroke + 3.81 4.55 moveto + 3.80 4.67 lineto +closepath stroke + 3.81 4.55 moveto + 3.65 4.44 lineto +closepath stroke + 3.81 4.55 moveto + 3.62 4.55 lineto +closepath stroke + 3.79 4.79 moveto + 4.01 4.93 lineto +closepath stroke + 3.79 4.79 moveto + 4.00 4.79 lineto +closepath stroke + 3.79 4.79 moveto + 3.80 4.67 lineto +closepath stroke + 3.79 4.79 moveto + 3.77 4.93 lineto +closepath stroke + 3.79 4.79 moveto + 3.60 4.67 lineto +closepath stroke + 3.79 4.79 moveto + 3.56 4.80 lineto +closepath stroke + 3.76 5.06 moveto + 4.02 5.21 lineto +closepath stroke + 3.76 5.06 moveto + 4.00 5.06 lineto +closepath stroke + 3.76 5.06 moveto + 3.77 4.93 lineto +closepath stroke + 3.76 5.06 moveto + 3.74 5.21 lineto +closepath stroke + 3.76 5.06 moveto + 3.55 4.93 lineto +closepath stroke + 3.76 5.06 moveto + 3.50 5.07 lineto +closepath stroke + 3.73 5.36 moveto + 4.02 5.68 lineto +closepath stroke + 3.73 5.36 moveto + 4.00 5.36 lineto +closepath stroke + 3.73 5.36 moveto + 3.74 5.21 lineto +closepath stroke + 3.73 5.36 moveto + 3.71 5.68 lineto +closepath stroke + 3.73 5.36 moveto + 3.49 5.22 lineto +closepath stroke + 3.73 5.36 moveto + 3.44 5.37 lineto +closepath stroke + 3.69 6.00 moveto + 4.00 6.00 lineto +closepath stroke + 3.69 6.00 moveto + 3.71 5.68 lineto +closepath stroke + 3.69 6.00 moveto + 3.42 5.69 lineto +closepath stroke + 3.69 6.00 moveto + 3.37 6.00 lineto +closepath stroke + 3.85 3.23 moveto + 3.89 3.29 lineto +closepath stroke + 3.85 3.23 moveto + 3.90 3.23 lineto +closepath stroke + 3.85 3.23 moveto + 3.83 3.29 lineto +closepath stroke + 3.85 3.23 moveto + 3.79 3.23 lineto +closepath stroke + 3.81 3.35 moveto + 3.87 3.41 lineto +closepath stroke + 3.81 3.35 moveto + 3.88 3.35 lineto +closepath stroke + 3.81 3.35 moveto + 3.83 3.29 lineto +closepath stroke + 3.81 3.35 moveto + 3.79 3.41 lineto +closepath stroke + 3.81 3.35 moveto + 3.77 3.29 lineto +closepath stroke + 3.81 3.35 moveto + 3.74 3.35 lineto +closepath stroke + 3.77 3.47 moveto + 3.84 3.54 lineto +closepath stroke + 3.77 3.47 moveto + 3.85 3.47 lineto +closepath stroke + 3.77 3.47 moveto + 3.79 3.41 lineto +closepath stroke + 3.77 3.47 moveto + 3.75 3.54 lineto +closepath stroke + 3.77 3.47 moveto + 3.72 3.41 lineto +closepath stroke + 3.77 3.47 moveto + 3.68 3.48 lineto +closepath stroke + 3.72 3.61 moveto + 3.81 3.69 lineto +closepath stroke + 3.72 3.61 moveto + 3.82 3.61 lineto +closepath stroke + 3.72 3.61 moveto + 3.75 3.54 lineto +closepath stroke + 3.72 3.61 moveto + 3.70 3.69 lineto +closepath stroke + 3.72 3.61 moveto + 3.65 3.55 lineto +closepath stroke + 3.72 3.61 moveto + 3.61 3.62 lineto +closepath stroke + 3.67 3.77 moveto + 3.78 3.85 lineto +closepath stroke + 3.67 3.77 moveto + 3.79 3.77 lineto +closepath stroke + 3.67 3.77 moveto + 3.70 3.69 lineto +closepath stroke + 3.67 3.77 moveto + 3.65 3.85 lineto +closepath stroke + 3.67 3.77 moveto + 3.59 3.70 lineto +closepath stroke + 3.67 3.77 moveto + 3.54 3.78 lineto +closepath stroke + 3.62 3.94 moveto + 3.74 4.03 lineto +closepath stroke + 3.62 3.94 moveto + 3.75 3.94 lineto +closepath stroke + 3.62 3.94 moveto + 3.65 3.85 lineto +closepath stroke + 3.62 3.94 moveto + 3.59 4.03 lineto +closepath stroke + 3.62 3.94 moveto + 3.52 3.86 lineto +closepath stroke + 3.62 3.94 moveto + 3.47 3.95 lineto +closepath stroke + 3.56 4.13 moveto + 3.70 4.22 lineto +closepath stroke + 3.56 4.13 moveto + 3.71 4.12 lineto +closepath stroke + 3.56 4.13 moveto + 3.59 4.03 lineto +closepath stroke + 3.56 4.13 moveto + 3.53 4.23 lineto +closepath stroke + 3.56 4.13 moveto + 3.44 4.04 lineto +closepath stroke + 3.56 4.13 moveto + 3.38 4.14 lineto +closepath stroke + 3.49 4.33 moveto + 3.65 4.44 lineto +closepath stroke + 3.49 4.33 moveto + 3.66 4.33 lineto +closepath stroke + 3.49 4.33 moveto + 3.53 4.23 lineto +closepath stroke + 3.49 4.33 moveto + 3.46 4.44 lineto +closepath stroke + 3.49 4.33 moveto + 3.35 4.24 lineto +closepath stroke + 3.49 4.33 moveto + 3.29 4.34 lineto +closepath stroke + 3.42 4.56 moveto + 3.60 4.67 lineto +closepath stroke + 3.42 4.56 moveto + 3.62 4.55 lineto +closepath stroke + 3.42 4.56 moveto + 3.46 4.44 lineto +closepath stroke + 3.42 4.56 moveto + 3.38 4.68 lineto +closepath stroke + 3.42 4.56 moveto + 3.25 4.46 lineto +closepath stroke + 3.42 4.56 moveto + 3.18 4.57 lineto +closepath stroke + 3.34 4.80 moveto + 3.55 4.93 lineto +closepath stroke + 3.34 4.80 moveto + 3.56 4.80 lineto +closepath stroke + 3.34 4.80 moveto + 3.38 4.68 lineto +closepath stroke + 3.34 4.80 moveto + 3.29 4.94 lineto +closepath stroke + 3.34 4.80 moveto + 3.14 4.69 lineto +closepath stroke + 3.34 4.80 moveto + 3.07 4.82 lineto +closepath stroke + 3.25 5.08 moveto + 3.49 5.22 lineto +closepath stroke + 3.25 5.08 moveto + 3.50 5.07 lineto +closepath stroke + 3.25 5.08 moveto + 3.29 4.94 lineto +closepath stroke + 3.25 5.08 moveto + 3.20 5.23 lineto +closepath stroke + 3.25 5.08 moveto + 3.03 4.96 lineto +closepath stroke + 3.25 5.08 moveto + 2.95 5.10 lineto +closepath stroke + 3.15 5.38 moveto + 3.42 5.69 lineto +closepath stroke + 3.15 5.38 moveto + 3.44 5.37 lineto +closepath stroke + 3.15 5.38 moveto + 3.20 5.23 lineto +closepath stroke + 3.15 5.38 moveto + 3.10 5.69 lineto +closepath stroke + 3.15 5.38 moveto + 2.90 5.25 lineto +closepath stroke + 3.15 5.38 moveto + 2.81 5.40 lineto +closepath stroke + 3.04 6.00 moveto + 3.37 6.00 lineto +closepath stroke + 3.04 6.00 moveto + 3.10 5.69 lineto +closepath stroke + 3.04 6.00 moveto + 2.76 5.71 lineto +closepath stroke + 3.04 6.00 moveto + 2.66 6.00 lineto +closepath stroke + 3.73 3.24 moveto + 3.77 3.29 lineto +closepath stroke + 3.73 3.24 moveto + 3.79 3.23 lineto +closepath stroke + 3.73 3.24 moveto + 3.69 3.29 lineto +closepath stroke + 3.73 3.24 moveto + 3.65 3.24 lineto +closepath stroke + 3.66 3.35 moveto + 3.72 3.41 lineto +closepath stroke + 3.66 3.35 moveto + 3.74 3.35 lineto +closepath stroke + 3.66 3.35 moveto + 3.69 3.29 lineto +closepath stroke + 3.66 3.35 moveto + 3.62 3.42 lineto +closepath stroke + 3.66 3.35 moveto + 3.61 3.30 lineto +closepath stroke + 3.66 3.35 moveto + 3.56 3.36 lineto +closepath stroke + 3.58 3.48 moveto + 3.65 3.55 lineto +closepath stroke + 3.58 3.48 moveto + 3.68 3.48 lineto +closepath stroke + 3.58 3.48 moveto + 3.62 3.42 lineto +closepath stroke + 3.58 3.48 moveto + 3.54 3.55 lineto +closepath stroke + 3.58 3.48 moveto + 3.52 3.42 lineto +closepath stroke + 3.58 3.48 moveto + 3.46 3.49 lineto +closepath stroke + 3.50 3.63 moveto + 3.59 3.70 lineto +closepath stroke + 3.50 3.63 moveto + 3.61 3.62 lineto +closepath stroke + 3.50 3.63 moveto + 3.54 3.55 lineto +closepath stroke + 3.50 3.63 moveto + 3.46 3.70 lineto +closepath stroke + 3.50 3.63 moveto + 3.42 3.56 lineto +closepath stroke + 3.50 3.63 moveto + 3.36 3.63 lineto +closepath stroke + 3.41 3.78 moveto + 3.52 3.86 lineto +closepath stroke + 3.41 3.78 moveto + 3.54 3.78 lineto +closepath stroke + 3.41 3.78 moveto + 3.46 3.70 lineto +closepath stroke + 3.41 3.78 moveto + 3.36 3.87 lineto +closepath stroke + 3.41 3.78 moveto + 3.31 3.71 lineto +closepath stroke + 3.31 3.96 moveto + 3.44 4.04 lineto +closepath stroke + 3.31 3.96 moveto + 3.47 3.95 lineto +closepath stroke + 3.31 3.96 moveto + 3.36 3.87 lineto +closepath stroke + 3.31 3.96 moveto + 3.26 4.05 lineto +closepath stroke + 3.31 3.96 moveto + 3.26 3.80 lineto +closepath stroke + 3.31 3.96 moveto + 3.19 3.88 lineto +closepath stroke + 3.20 4.15 moveto + 3.35 4.24 lineto +closepath stroke + 3.20 4.15 moveto + 3.38 4.14 lineto +closepath stroke + 3.20 4.15 moveto + 3.26 4.05 lineto +closepath stroke + 3.20 4.15 moveto + 3.14 4.25 lineto +closepath stroke + 3.20 4.15 moveto + 3.13 3.97 lineto +closepath stroke + 3.20 4.15 moveto + 3.06 4.06 lineto +closepath stroke + 3.08 4.35 moveto + 3.25 4.46 lineto +closepath stroke + 3.08 4.35 moveto + 3.29 4.34 lineto +closepath stroke + 3.08 4.35 moveto + 3.14 4.25 lineto +closepath stroke + 3.08 4.35 moveto + 3.02 4.47 lineto +closepath stroke + 3.08 4.35 moveto + 3.00 4.16 lineto +closepath stroke + 3.08 4.35 moveto + 2.91 4.26 lineto +closepath stroke + 2.95 4.58 moveto + 3.14 4.69 lineto +closepath stroke + 2.95 4.58 moveto + 3.18 4.57 lineto +closepath stroke + 2.95 4.58 moveto + 3.02 4.47 lineto +closepath stroke + 2.95 4.58 moveto + 2.88 4.71 lineto +closepath stroke + 2.95 4.58 moveto + 2.84 4.37 lineto +closepath stroke + 2.95 4.58 moveto + 2.75 4.48 lineto +closepath stroke + 2.80 4.84 moveto + 3.03 4.96 lineto +closepath stroke + 2.80 4.84 moveto + 3.07 4.82 lineto +closepath stroke + 2.80 4.84 moveto + 2.88 4.71 lineto +closepath stroke + 2.80 4.84 moveto + 2.72 4.98 lineto +closepath stroke + 2.80 4.84 moveto + 2.67 4.61 lineto +closepath stroke + 2.80 4.84 moveto + 2.57 4.72 lineto +closepath stroke + 2.64 5.12 moveto + 2.90 5.25 lineto +closepath stroke + 2.64 5.12 moveto + 2.95 5.10 lineto +closepath stroke + 2.64 5.12 moveto + 2.72 4.98 lineto +closepath stroke + 2.64 5.12 moveto + 2.55 5.27 lineto +closepath stroke + 2.64 5.12 moveto + 2.49 4.86 lineto +closepath stroke + 2.64 5.12 moveto + 2.37 4.99 lineto +closepath stroke + 2.47 5.42 moveto + 2.76 5.71 lineto +closepath stroke + 2.47 5.42 moveto + 2.81 5.40 lineto +closepath stroke + 2.47 5.42 moveto + 2.55 5.27 lineto +closepath stroke + 2.47 5.42 moveto + 2.37 5.71 lineto +closepath stroke + 2.47 5.42 moveto + 2.28 5.14 lineto +closepath stroke + 2.47 5.42 moveto + 2.16 5.29 lineto +closepath stroke + 2.47 5.42 moveto + 2.02 5.44 lineto +closepath stroke + 2.27 6.00 moveto + 2.66 6.00 lineto +closepath stroke + 2.27 6.00 moveto + 2.37 5.71 lineto +closepath stroke + 2.27 6.00 moveto + 1.92 5.73 lineto +closepath stroke + 2.27 6.00 moveto + 1.77 6.00 lineto +closepath stroke + 3.57 3.24 moveto + 3.61 3.30 lineto +closepath stroke + 3.57 3.24 moveto + 3.65 3.24 lineto +closepath stroke + 3.57 3.24 moveto + 3.51 3.30 lineto +closepath stroke + 3.57 3.24 moveto + 3.46 3.24 lineto +closepath stroke + 3.46 3.36 moveto + 3.52 3.42 lineto +closepath stroke + 3.46 3.36 moveto + 3.56 3.36 lineto +closepath stroke + 3.46 3.36 moveto + 3.51 3.30 lineto +closepath stroke + 3.46 3.36 moveto + 3.40 3.43 lineto +closepath stroke + 3.46 3.36 moveto + 3.41 3.30 lineto +closepath stroke + 3.34 3.49 moveto + 3.42 3.56 lineto +closepath stroke + 3.34 3.49 moveto + 3.46 3.49 lineto +closepath stroke + 3.34 3.49 moveto + 3.40 3.43 lineto +closepath stroke + 3.34 3.49 moveto + 3.28 3.56 lineto +closepath stroke + 3.34 3.49 moveto + 3.35 3.36 lineto +closepath stroke + 3.34 3.49 moveto + 3.27 3.42 lineto +closepath stroke + 3.21 3.64 moveto + 3.31 3.71 lineto +closepath stroke + 3.21 3.64 moveto + 3.36 3.63 lineto +closepath stroke + 3.21 3.64 moveto + 3.28 3.56 lineto +closepath stroke + 3.21 3.64 moveto + 3.26 3.80 lineto +closepath stroke + 3.21 3.64 moveto + 3.14 3.72 lineto +closepath stroke + 3.21 3.64 moveto + 3.20 3.49 lineto +closepath stroke + 3.21 3.64 moveto + 3.11 3.56 lineto +closepath stroke + 3.07 3.80 moveto + 3.13 3.97 lineto +closepath stroke + 3.07 3.80 moveto + 3.19 3.88 lineto +closepath stroke + 3.07 3.80 moveto + 3.14 3.72 lineto +closepath stroke + 3.07 3.80 moveto + 2.99 3.88 lineto +closepath stroke + 3.07 3.80 moveto + 3.04 3.64 lineto +closepath stroke + 3.07 3.80 moveto + 2.94 3.71 lineto +closepath stroke + 2.91 3.97 moveto + 3.00 4.16 lineto +closepath stroke + 2.91 3.97 moveto + 3.06 4.06 lineto +closepath stroke + 2.91 3.97 moveto + 2.99 3.88 lineto +closepath stroke + 2.91 3.97 moveto + 2.82 4.07 lineto +closepath stroke + 2.91 3.97 moveto + 2.86 3.80 lineto +closepath stroke + 2.91 3.97 moveto + 2.75 3.88 lineto +closepath stroke + 2.73 4.17 moveto + 2.84 4.37 lineto +closepath stroke + 2.73 4.17 moveto + 2.91 4.26 lineto +closepath stroke + 2.73 4.17 moveto + 2.82 4.07 lineto +closepath stroke + 2.73 4.17 moveto + 2.64 4.27 lineto +closepath stroke + 2.73 4.17 moveto + 2.67 3.97 lineto +closepath stroke + 2.73 4.17 moveto + 2.55 4.06 lineto +closepath stroke + 2.54 4.38 moveto + 2.67 4.61 lineto +closepath stroke + 2.54 4.38 moveto + 2.75 4.48 lineto +closepath stroke + 2.54 4.38 moveto + 2.64 4.27 lineto +closepath stroke + 2.54 4.38 moveto + 2.44 4.49 lineto +closepath stroke + 2.54 4.38 moveto + 2.45 4.17 lineto +closepath stroke + 2.54 4.38 moveto + 2.32 4.26 lineto +closepath stroke + 2.33 4.61 moveto + 2.49 4.86 lineto +closepath stroke + 2.33 4.61 moveto + 2.57 4.72 lineto +closepath stroke + 2.33 4.61 moveto + 2.44 4.49 lineto +closepath stroke + 2.33 4.61 moveto + 2.22 4.74 lineto +closepath stroke + 2.33 4.61 moveto + 2.22 4.38 lineto +closepath stroke + 2.33 4.61 moveto + 2.07 4.48 lineto +closepath stroke + 2.10 4.87 moveto + 2.28 5.14 lineto +closepath stroke + 2.10 4.87 moveto + 2.37 4.99 lineto +closepath stroke + 2.10 4.87 moveto + 2.22 4.74 lineto +closepath stroke + 2.10 4.87 moveto + 1.97 5.01 lineto +closepath stroke + 2.10 4.87 moveto + 1.96 4.61 lineto +closepath stroke + 2.10 4.87 moveto + 1.80 4.72 lineto +closepath stroke + 1.85 5.15 moveto + 2.16 5.29 lineto +closepath stroke + 1.85 5.15 moveto + 1.97 5.01 lineto +closepath stroke + 1.85 5.15 moveto + 1.71 5.31 lineto +closepath stroke + 1.85 5.15 moveto + 1.67 4.87 lineto +closepath stroke + 1.85 5.15 moveto + 1.50 4.99 lineto +closepath stroke + 1.57 5.46 moveto + 1.92 5.73 lineto +closepath stroke + 1.57 5.46 moveto + 2.02 5.44 lineto +closepath stroke + 1.57 5.46 moveto + 1.71 5.31 lineto +closepath stroke + 1.57 5.46 moveto + 1.41 5.73 lineto +closepath stroke + 1.57 5.46 moveto + 1.36 5.15 lineto +closepath stroke + 1.57 5.46 moveto + 1.17 5.29 lineto +closepath stroke + 1.26 6.00 moveto + 1.77 6.00 lineto +closepath stroke + 1.26 6.00 moveto + 1.41 5.73 lineto +closepath stroke + 1.26 6.00 moveto + 1.02 5.56 lineto +closepath stroke + 1.26 6.00 moveto + 0.63 6.00 lineto +closepath stroke + 3.35 3.24 moveto + 3.41 3.30 lineto +closepath stroke + 3.35 3.24 moveto + 3.46 3.24 lineto +closepath stroke + 3.35 3.24 moveto + 3.35 3.36 lineto +closepath stroke + 3.35 3.24 moveto + 3.27 3.29 lineto +closepath stroke + 3.35 3.24 moveto + 3.21 3.22 lineto +closepath stroke + 3.19 3.35 moveto + 3.20 3.49 lineto +closepath stroke + 3.19 3.35 moveto + 3.27 3.42 lineto +closepath stroke + 3.19 3.35 moveto + 3.27 3.29 lineto +closepath stroke + 3.19 3.35 moveto + 3.10 3.42 lineto +closepath stroke + 3.19 3.35 moveto + 3.13 3.28 lineto +closepath stroke + 3.01 3.48 moveto + 3.04 3.64 lineto +closepath stroke + 3.01 3.48 moveto + 3.11 3.56 lineto +closepath stroke + 3.01 3.48 moveto + 3.10 3.42 lineto +closepath stroke + 3.01 3.48 moveto + 2.91 3.55 lineto +closepath stroke + 3.01 3.48 moveto + 3.04 3.35 lineto +closepath stroke + 3.01 3.48 moveto + 2.92 3.40 lineto +closepath stroke + 2.82 3.62 moveto + 2.86 3.80 lineto +closepath stroke + 2.82 3.62 moveto + 2.94 3.71 lineto +closepath stroke + 2.82 3.62 moveto + 2.91 3.55 lineto +closepath stroke + 2.82 3.62 moveto + 2.71 3.70 lineto +closepath stroke + 2.82 3.62 moveto + 2.82 3.47 lineto +closepath stroke + 2.82 3.62 moveto + 2.70 3.53 lineto +closepath stroke + 2.60 3.78 moveto + 2.67 3.97 lineto +closepath stroke + 2.60 3.78 moveto + 2.75 3.88 lineto +closepath stroke + 2.60 3.78 moveto + 2.71 3.70 lineto +closepath stroke + 2.60 3.78 moveto + 2.48 3.87 lineto +closepath stroke + 2.60 3.78 moveto + 2.59 3.60 lineto +closepath stroke + 2.60 3.78 moveto + 2.45 3.67 lineto +closepath stroke + 2.36 3.95 moveto + 2.45 4.17 lineto +closepath stroke + 2.36 3.95 moveto + 2.55 4.06 lineto +closepath stroke + 2.36 3.95 moveto + 2.48 3.87 lineto +closepath stroke + 2.36 3.95 moveto + 2.23 4.05 lineto +closepath stroke + 2.36 3.95 moveto + 2.33 3.75 lineto +closepath stroke + 2.36 3.95 moveto + 2.17 3.82 lineto +closepath stroke + 2.10 4.14 moveto + 2.22 4.38 lineto +closepath stroke + 2.10 4.14 moveto + 2.32 4.26 lineto +closepath stroke + 2.10 4.14 moveto + 2.23 4.05 lineto +closepath stroke + 2.10 4.14 moveto + 1.96 4.25 lineto +closepath stroke + 2.10 4.14 moveto + 2.04 3.92 lineto +closepath stroke + 2.10 4.14 moveto + 1.87 3.99 lineto +closepath stroke + 1.82 4.35 moveto + 1.96 4.61 lineto +closepath stroke + 1.82 4.35 moveto + 2.07 4.48 lineto +closepath stroke + 1.82 4.35 moveto + 1.96 4.25 lineto +closepath stroke + 1.82 4.35 moveto + 1.66 4.47 lineto +closepath stroke + 1.82 4.35 moveto + 1.73 4.10 lineto +closepath stroke + 1.82 4.35 moveto + 1.54 4.18 lineto +closepath stroke + 1.50 4.58 moveto + 1.67 4.87 lineto +closepath stroke + 1.50 4.58 moveto + 1.80 4.72 lineto +closepath stroke + 1.50 4.58 moveto + 1.66 4.47 lineto +closepath stroke + 1.50 4.58 moveto + 1.33 4.71 lineto +closepath stroke + 1.50 4.58 moveto + 1.38 4.30 lineto +closepath stroke + 1.50 4.58 moveto + 1.18 4.39 lineto +closepath stroke + 1.15 4.83 moveto + 1.36 5.15 lineto +closepath stroke + 1.15 4.83 moveto + 1.50 4.99 lineto +closepath stroke + 1.15 4.83 moveto + 1.33 4.71 lineto +closepath stroke + 1.15 4.83 moveto + 0.96 4.97 lineto +closepath stroke + 1.15 4.83 moveto + 1.00 4.51 lineto +closepath stroke + 0.77 5.11 moveto + 1.02 5.56 lineto +closepath stroke + 0.77 5.11 moveto + 1.17 5.29 lineto +closepath stroke + 0.77 5.11 moveto + 0.96 4.97 lineto +closepath stroke + 0.77 5.11 moveto + 0.39 5.56 lineto +closepath stroke + 0.77 5.11 moveto + 0.39 5.26 lineto +closepath stroke + 0.77 5.11 moveto + 0.81 4.65 lineto +closepath stroke + 0.77 5.11 moveto + 0.39 4.75 lineto +closepath stroke + 0.00 5.42 moveto + 0.00 5.71 lineto +closepath stroke + 0.00 5.42 moveto + 0.39 5.26 lineto +closepath stroke + 0.00 5.42 moveto + 0.00 4.91 lineto +closepath stroke + 3.07 3.21 moveto + 3.13 3.28 lineto +closepath stroke + 3.07 3.21 moveto + 3.21 3.22 lineto +closepath stroke + 3.07 3.21 moveto + 3.04 3.35 lineto +closepath stroke + 3.07 3.21 moveto + 2.95 3.26 lineto +closepath stroke + 3.07 3.21 moveto + 2.89 3.17 lineto +closepath stroke + 2.83 3.31 moveto + 2.82 3.47 lineto +closepath stroke + 2.83 3.31 moveto + 2.92 3.40 lineto +closepath stroke + 2.83 3.31 moveto + 2.95 3.26 lineto +closepath stroke + 2.83 3.31 moveto + 2.70 3.37 lineto +closepath stroke + 2.83 3.31 moveto + 2.77 3.22 lineto +closepath stroke + 2.58 3.43 moveto + 2.59 3.60 lineto +closepath stroke + 2.58 3.43 moveto + 2.70 3.53 lineto +closepath stroke + 2.58 3.43 moveto + 2.70 3.37 lineto +closepath stroke + 2.58 3.43 moveto + 2.43 3.49 lineto +closepath stroke + 2.58 3.43 moveto + 2.64 3.28 lineto +closepath stroke + 2.58 3.43 moveto + 2.48 3.32 lineto +closepath stroke + 2.29 3.55 moveto + 2.33 3.75 lineto +closepath stroke + 2.29 3.55 moveto + 2.45 3.67 lineto +closepath stroke + 2.29 3.55 moveto + 2.43 3.49 lineto +closepath stroke + 2.29 3.55 moveto + 2.14 3.62 lineto +closepath stroke + 2.29 3.55 moveto + 2.34 3.38 lineto +closepath stroke + 2.29 3.55 moveto + 2.16 3.42 lineto +closepath stroke + 1.98 3.69 moveto + 2.04 3.92 lineto +closepath stroke + 1.98 3.69 moveto + 2.17 3.82 lineto +closepath stroke + 1.98 3.69 moveto + 2.14 3.62 lineto +closepath stroke + 1.98 3.69 moveto + 1.81 3.77 lineto +closepath stroke + 1.98 3.69 moveto + 2.00 3.49 lineto +closepath stroke + 1.98 3.69 moveto + 1.81 3.53 lineto +closepath stroke + 1.64 3.84 moveto + 1.73 4.10 lineto +closepath stroke + 1.64 3.84 moveto + 1.87 3.99 lineto +closepath stroke + 1.64 3.84 moveto + 1.81 3.77 lineto +closepath stroke + 1.64 3.84 moveto + 1.45 3.93 lineto +closepath stroke + 1.64 3.84 moveto + 1.64 3.60 lineto +closepath stroke + 1.64 3.84 moveto + 1.42 3.65 lineto +closepath stroke + 1.26 4.01 moveto + 1.38 4.30 lineto +closepath stroke + 1.26 4.01 moveto + 1.54 4.18 lineto +closepath stroke + 1.26 4.01 moveto + 1.45 3.93 lineto +closepath stroke + 1.26 4.01 moveto + 1.06 4.10 lineto +closepath stroke + 1.26 4.01 moveto + 1.23 3.73 lineto +closepath stroke + 1.26 4.01 moveto + 1.00 3.78 lineto +closepath stroke + 0.85 4.19 moveto + 0.81 4.65 lineto +closepath stroke + 0.85 4.19 moveto + 1.00 4.51 lineto +closepath stroke + 0.85 4.19 moveto + 1.18 4.39 lineto +closepath stroke + 0.85 4.19 moveto + 1.06 4.10 lineto +closepath stroke + 0.85 4.19 moveto + 0.43 4.30 lineto +closepath stroke + 0.85 4.19 moveto + 0.79 3.88 lineto +closepath stroke + 0.85 4.19 moveto + 0.43 3.93 lineto +closepath stroke + 0.00 4.40 moveto + 0.39 4.75 lineto +closepath stroke + 0.00 4.40 moveto + 0.43 4.30 lineto +closepath stroke + 0.00 4.40 moveto + 0.00 4.91 lineto +closepath stroke + 0.00 4.40 moveto + 0.00 4.03 lineto +closepath stroke + 2.70 3.14 moveto + 2.77 3.22 lineto +closepath stroke + 2.70 3.14 moveto + 2.89 3.17 lineto +closepath stroke + 2.70 3.14 moveto + 2.64 3.28 lineto +closepath stroke + 2.70 3.14 moveto + 2.54 3.17 lineto +closepath stroke + 2.70 3.14 moveto + 2.49 3.07 lineto +closepath stroke + 2.38 3.21 moveto + 2.34 3.38 lineto +closepath stroke + 2.38 3.21 moveto + 2.48 3.32 lineto +closepath stroke + 2.38 3.21 moveto + 2.54 3.17 lineto +closepath stroke + 2.38 3.21 moveto + 2.20 3.24 lineto +closepath stroke + 2.38 3.21 moveto + 2.33 3.10 lineto +closepath stroke + 2.02 3.28 moveto + 2.00 3.49 lineto +closepath stroke + 2.02 3.28 moveto + 2.16 3.42 lineto +closepath stroke + 2.02 3.28 moveto + 2.20 3.24 lineto +closepath stroke + 2.02 3.28 moveto + 1.83 3.32 lineto +closepath stroke + 2.02 3.28 moveto + 2.15 3.14 lineto +closepath stroke + 2.02 3.28 moveto + 1.94 3.14 lineto +closepath stroke + 1.63 3.37 moveto + 1.64 3.60 lineto +closepath stroke + 1.63 3.37 moveto + 1.81 3.53 lineto +closepath stroke + 1.63 3.37 moveto + 1.83 3.32 lineto +closepath stroke + 1.63 3.37 moveto + 1.42 3.41 lineto +closepath stroke + 1.63 3.37 moveto + 1.74 3.18 lineto +closepath stroke + 1.63 3.37 moveto + 1.50 3.18 lineto +closepath stroke + 1.20 3.46 moveto + 1.23 3.73 lineto +closepath stroke + 1.20 3.46 moveto + 1.42 3.65 lineto +closepath stroke + 1.20 3.46 moveto + 1.42 3.41 lineto +closepath stroke + 1.20 3.46 moveto + 0.96 3.51 lineto +closepath stroke + 1.20 3.46 moveto + 1.29 3.23 lineto +closepath stroke + 1.20 3.46 moveto + 1.03 3.23 lineto +closepath stroke + 0.73 3.56 moveto + 0.79 3.88 lineto +closepath stroke + 0.73 3.56 moveto + 1.00 3.78 lineto +closepath stroke + 0.73 3.56 moveto + 0.96 3.51 lineto +closepath stroke + 0.73 3.56 moveto + 0.36 3.61 lineto +closepath stroke + 0.73 3.56 moveto + 0.79 3.28 lineto +closepath stroke + 0.73 3.56 moveto + 0.36 3.28 lineto +closepath stroke + 0.00 3.67 moveto + 0.00 4.03 lineto +closepath stroke + 0.00 3.67 moveto + 0.43 3.93 lineto +closepath stroke + 0.00 3.67 moveto + 0.36 3.61 lineto +closepath stroke + 0.00 3.67 moveto + 0.00 3.33 lineto +closepath stroke + 2.28 3.00 moveto + 2.33 3.10 lineto +closepath stroke + 2.28 3.00 moveto + 2.49 3.07 lineto +closepath stroke + 2.28 3.00 moveto + 2.15 3.14 lineto +closepath stroke + 2.28 3.00 moveto + 2.06 3.00 lineto +closepath stroke + 2.28 3.00 moveto + 2.49 2.93 lineto +closepath stroke + 2.28 3.00 moveto + 2.33 2.90 lineto +closepath stroke + 2.28 3.00 moveto + 2.15 2.86 lineto +closepath stroke + 1.85 3.00 moveto + 1.74 3.18 lineto +closepath stroke + 1.85 3.00 moveto + 1.94 3.14 lineto +closepath stroke + 1.85 3.00 moveto + 2.06 3.00 lineto +closepath stroke + 1.85 3.00 moveto + 1.61 3.00 lineto +closepath stroke + 1.85 3.00 moveto + 1.94 2.86 lineto +closepath stroke + 1.85 3.00 moveto + 1.74 2.82 lineto +closepath stroke + 1.38 3.00 moveto + 1.29 3.23 lineto +closepath stroke + 1.38 3.00 moveto + 1.50 3.18 lineto +closepath stroke + 1.38 3.00 moveto + 1.61 3.00 lineto +closepath stroke + 1.38 3.00 moveto + 1.12 3.00 lineto +closepath stroke + 1.38 3.00 moveto + 1.50 2.82 lineto +closepath stroke + 1.38 3.00 moveto + 1.29 2.77 lineto +closepath stroke + 0.86 3.00 moveto + 0.79 3.28 lineto +closepath stroke + 0.86 3.00 moveto + 1.03 3.23 lineto +closepath stroke + 0.86 3.00 moveto + 1.12 3.00 lineto +closepath stroke + 0.86 3.00 moveto + 0.43 3.00 lineto +closepath stroke + 0.86 3.00 moveto + 1.03 2.77 lineto +closepath stroke + 0.86 3.00 moveto + 0.79 2.72 lineto +closepath stroke + 0.00 3.00 moveto + 0.00 3.33 lineto +closepath stroke + 0.00 3.00 moveto + 0.36 3.28 lineto +closepath stroke + 0.00 3.00 moveto + 0.43 3.00 lineto +closepath stroke + 0.00 3.00 moveto + 0.36 2.72 lineto +closepath stroke + 0.00 3.00 moveto + 0.00 2.67 lineto +closepath stroke + 2.70 2.86 moveto + 2.54 2.83 lineto +closepath stroke + 2.70 2.86 moveto + 2.49 2.93 lineto +closepath stroke + 2.70 2.86 moveto + 2.89 2.83 lineto +closepath stroke + 2.70 2.86 moveto + 2.77 2.78 lineto +closepath stroke + 2.70 2.86 moveto + 2.64 2.72 lineto +closepath stroke + 2.38 2.79 moveto + 2.33 2.90 lineto +closepath stroke + 2.38 2.79 moveto + 2.54 2.83 lineto +closepath stroke + 2.38 2.79 moveto + 2.20 2.76 lineto +closepath stroke + 2.38 2.79 moveto + 2.48 2.68 lineto +closepath stroke + 2.38 2.79 moveto + 2.34 2.62 lineto +closepath stroke + 2.02 2.72 moveto + 1.94 2.86 lineto +closepath stroke + 2.02 2.72 moveto + 2.15 2.86 lineto +closepath stroke + 2.02 2.72 moveto + 2.20 2.76 lineto +closepath stroke + 2.02 2.72 moveto + 1.83 2.68 lineto +closepath stroke + 2.02 2.72 moveto + 2.16 2.58 lineto +closepath stroke + 2.02 2.72 moveto + 2.00 2.51 lineto +closepath stroke + 1.63 2.63 moveto + 1.50 2.82 lineto +closepath stroke + 1.63 2.63 moveto + 1.74 2.82 lineto +closepath stroke + 1.63 2.63 moveto + 1.83 2.68 lineto +closepath stroke + 1.63 2.63 moveto + 1.42 2.59 lineto +closepath stroke + 1.63 2.63 moveto + 1.81 2.47 lineto +closepath stroke + 1.63 2.63 moveto + 1.64 2.40 lineto +closepath stroke + 1.20 2.54 moveto + 1.03 2.77 lineto +closepath stroke + 1.20 2.54 moveto + 1.29 2.77 lineto +closepath stroke + 1.20 2.54 moveto + 1.42 2.59 lineto +closepath stroke + 1.20 2.54 moveto + 0.96 2.49 lineto +closepath stroke + 1.20 2.54 moveto + 1.42 2.35 lineto +closepath stroke + 1.20 2.54 moveto + 1.23 2.27 lineto +closepath stroke + 0.73 2.44 moveto + 0.36 2.72 lineto +closepath stroke + 0.73 2.44 moveto + 0.79 2.72 lineto +closepath stroke + 0.73 2.44 moveto + 0.96 2.49 lineto +closepath stroke + 0.73 2.44 moveto + 0.36 2.39 lineto +closepath stroke + 0.73 2.44 moveto + 1.00 2.22 lineto +closepath stroke + 0.73 2.44 moveto + 0.79 2.12 lineto +closepath stroke + 0.00 2.33 moveto + 0.00 2.67 lineto +closepath stroke + 0.00 2.33 moveto + 0.36 2.39 lineto +closepath stroke + 0.00 2.33 moveto + 0.43 2.07 lineto +closepath stroke + 0.00 2.33 moveto + 0.00 1.97 lineto +closepath stroke + 3.07 2.79 moveto + 2.95 2.74 lineto +closepath stroke + 3.07 2.79 moveto + 2.89 2.83 lineto +closepath stroke + 3.07 2.79 moveto + 3.21 2.78 lineto +closepath stroke + 3.07 2.79 moveto + 3.13 2.72 lineto +closepath stroke + 3.07 2.79 moveto + 3.04 2.65 lineto +closepath stroke + 2.83 2.69 moveto + 2.77 2.78 lineto +closepath stroke + 2.83 2.69 moveto + 2.95 2.74 lineto +closepath stroke + 2.83 2.69 moveto + 2.70 2.63 lineto +closepath stroke + 2.83 2.69 moveto + 2.92 2.60 lineto +closepath stroke + 2.83 2.69 moveto + 2.82 2.53 lineto +closepath stroke + 2.58 2.57 moveto + 2.64 2.72 lineto +closepath stroke + 2.58 2.57 moveto + 2.70 2.63 lineto +closepath stroke + 2.58 2.57 moveto + 2.48 2.68 lineto +closepath stroke + 2.58 2.57 moveto + 2.43 2.51 lineto +closepath stroke + 2.58 2.57 moveto + 2.70 2.47 lineto +closepath stroke + 2.58 2.57 moveto + 2.59 2.40 lineto +closepath stroke + 2.29 2.45 moveto + 2.16 2.58 lineto +closepath stroke + 2.29 2.45 moveto + 2.34 2.62 lineto +closepath stroke + 2.29 2.45 moveto + 2.43 2.51 lineto +closepath stroke + 2.29 2.45 moveto + 2.14 2.38 lineto +closepath stroke + 2.29 2.45 moveto + 2.45 2.33 lineto +closepath stroke + 2.29 2.45 moveto + 2.33 2.25 lineto +closepath stroke + 1.98 2.31 moveto + 1.81 2.47 lineto +closepath stroke + 1.98 2.31 moveto + 2.00 2.51 lineto +closepath stroke + 1.98 2.31 moveto + 2.14 2.38 lineto +closepath stroke + 1.98 2.31 moveto + 1.81 2.23 lineto +closepath stroke + 1.98 2.31 moveto + 2.17 2.18 lineto +closepath stroke + 1.98 2.31 moveto + 2.04 2.08 lineto +closepath stroke + 1.64 2.16 moveto + 1.42 2.35 lineto +closepath stroke + 1.64 2.16 moveto + 1.64 2.40 lineto +closepath stroke + 1.64 2.16 moveto + 1.81 2.23 lineto +closepath stroke + 1.64 2.16 moveto + 1.45 2.07 lineto +closepath stroke + 1.64 2.16 moveto + 1.87 2.01 lineto +closepath stroke + 1.64 2.16 moveto + 1.73 1.90 lineto +closepath stroke + 1.26 1.99 moveto + 1.00 2.22 lineto +closepath stroke + 1.26 1.99 moveto + 1.23 2.27 lineto +closepath stroke + 1.26 1.99 moveto + 1.45 2.07 lineto +closepath stroke + 1.26 1.99 moveto + 1.06 1.90 lineto +closepath stroke + 1.26 1.99 moveto + 1.54 1.82 lineto +closepath stroke + 1.26 1.99 moveto + 1.38 1.70 lineto +closepath stroke + 0.85 1.81 moveto + 0.43 2.07 lineto +closepath stroke + 0.85 1.81 moveto + 0.79 2.12 lineto +closepath stroke + 0.85 1.81 moveto + 1.06 1.90 lineto +closepath stroke + 0.85 1.81 moveto + 0.43 1.70 lineto +closepath stroke + 0.85 1.81 moveto + 1.18 1.61 lineto +closepath stroke + 0.85 1.81 moveto + 1.00 1.49 lineto +closepath stroke + 0.85 1.81 moveto + 0.81 1.35 lineto +closepath stroke + 0.00 1.60 moveto + 0.00 1.97 lineto +closepath stroke + 0.00 1.60 moveto + 0.43 1.70 lineto +closepath stroke + 0.00 1.60 moveto + 0.39 1.25 lineto +closepath stroke + 0.00 1.60 moveto + 0.00 1.09 lineto +closepath stroke + 3.35 2.76 moveto + 3.27 2.71 lineto +closepath stroke + 3.35 2.76 moveto + 3.21 2.78 lineto +closepath stroke + 3.35 2.76 moveto + 3.46 2.76 lineto +closepath stroke + 3.35 2.76 moveto + 3.41 2.70 lineto +closepath stroke + 3.35 2.76 moveto + 3.35 2.64 lineto +closepath stroke + 3.19 2.65 moveto + 3.13 2.72 lineto +closepath stroke + 3.19 2.65 moveto + 3.27 2.71 lineto +closepath stroke + 3.19 2.65 moveto + 3.10 2.58 lineto +closepath stroke + 3.19 2.65 moveto + 3.27 2.58 lineto +closepath stroke + 3.19 2.65 moveto + 3.20 2.51 lineto +closepath stroke + 3.01 2.52 moveto + 3.04 2.65 lineto +closepath stroke + 3.01 2.52 moveto + 3.10 2.58 lineto +closepath stroke + 3.01 2.52 moveto + 2.92 2.60 lineto +closepath stroke + 3.01 2.52 moveto + 2.91 2.45 lineto +closepath stroke + 3.01 2.52 moveto + 3.11 2.44 lineto +closepath stroke + 3.01 2.52 moveto + 3.04 2.36 lineto +closepath stroke + 2.82 2.38 moveto + 2.82 2.53 lineto +closepath stroke + 2.82 2.38 moveto + 2.91 2.45 lineto +closepath stroke + 2.82 2.38 moveto + 2.70 2.47 lineto +closepath stroke + 2.82 2.38 moveto + 2.71 2.30 lineto +closepath stroke + 2.82 2.38 moveto + 2.94 2.29 lineto +closepath stroke + 2.82 2.38 moveto + 2.86 2.20 lineto +closepath stroke + 2.60 2.22 moveto + 2.59 2.40 lineto +closepath stroke + 2.60 2.22 moveto + 2.71 2.30 lineto +closepath stroke + 2.60 2.22 moveto + 2.45 2.33 lineto +closepath stroke + 2.60 2.22 moveto + 2.48 2.13 lineto +closepath stroke + 2.60 2.22 moveto + 2.75 2.12 lineto +closepath stroke + 2.60 2.22 moveto + 2.67 2.03 lineto +closepath stroke + 2.36 2.05 moveto + 2.33 2.25 lineto +closepath stroke + 2.36 2.05 moveto + 2.48 2.13 lineto +closepath stroke + 2.36 2.05 moveto + 2.17 2.18 lineto +closepath stroke + 2.36 2.05 moveto + 2.23 1.95 lineto +closepath stroke + 2.36 2.05 moveto + 2.55 1.94 lineto +closepath stroke + 2.36 2.05 moveto + 2.45 1.83 lineto +closepath stroke + 2.10 1.86 moveto + 2.04 2.08 lineto +closepath stroke + 2.10 1.86 moveto + 2.23 1.95 lineto +closepath stroke + 2.10 1.86 moveto + 1.87 2.01 lineto +closepath stroke + 2.10 1.86 moveto + 1.96 1.75 lineto +closepath stroke + 2.10 1.86 moveto + 2.32 1.74 lineto +closepath stroke + 2.10 1.86 moveto + 2.22 1.62 lineto +closepath stroke + 1.82 1.65 moveto + 1.54 1.82 lineto +closepath stroke + 1.82 1.65 moveto + 1.73 1.90 lineto +closepath stroke + 1.82 1.65 moveto + 1.96 1.75 lineto +closepath stroke + 1.82 1.65 moveto + 1.66 1.53 lineto +closepath stroke + 1.82 1.65 moveto + 2.07 1.52 lineto +closepath stroke + 1.82 1.65 moveto + 1.96 1.39 lineto +closepath stroke + 1.50 1.42 moveto + 1.18 1.61 lineto +closepath stroke + 1.50 1.42 moveto + 1.38 1.70 lineto +closepath stroke + 1.50 1.42 moveto + 1.66 1.53 lineto +closepath stroke + 1.50 1.42 moveto + 1.33 1.29 lineto +closepath stroke + 1.50 1.42 moveto + 1.80 1.28 lineto +closepath stroke + 1.50 1.42 moveto + 1.67 1.13 lineto +closepath stroke + 1.15 1.17 moveto + 1.00 1.49 lineto +closepath stroke + 1.15 1.17 moveto + 1.33 1.29 lineto +closepath stroke + 1.15 1.17 moveto + 0.96 1.03 lineto +closepath stroke + 1.15 1.17 moveto + 1.50 1.01 lineto +closepath stroke + 1.15 1.17 moveto + 1.36 0.85 lineto +closepath stroke + 0.77 0.89 moveto + 0.39 1.25 lineto +closepath stroke + 0.77 0.89 moveto + 0.81 1.35 lineto +closepath stroke + 0.77 0.89 moveto + 0.96 1.03 lineto +closepath stroke + 0.77 0.89 moveto + 0.39 0.74 lineto +closepath stroke + 0.77 0.89 moveto + 0.39 0.44 lineto +closepath stroke + 0.77 0.89 moveto + 1.17 0.71 lineto +closepath stroke + 0.77 0.89 moveto + 1.02 0.44 lineto +closepath stroke + 0.00 0.58 moveto + 0.00 1.09 lineto +closepath stroke + 0.00 0.58 moveto + 0.39 0.74 lineto +closepath stroke + 0.00 0.58 moveto + 0.00 0.29 lineto +closepath stroke + 3.57 2.76 moveto + 3.51 2.70 lineto +closepath stroke + 3.57 2.76 moveto + 3.46 2.76 lineto +closepath stroke + 3.57 2.76 moveto + 3.61 2.70 lineto +closepath stroke + 3.57 2.76 moveto + 3.65 2.76 lineto +closepath stroke + 3.46 2.64 moveto + 3.41 2.70 lineto +closepath stroke + 3.46 2.64 moveto + 3.51 2.70 lineto +closepath stroke + 3.46 2.64 moveto + 3.40 2.57 lineto +closepath stroke + 3.46 2.64 moveto + 3.56 2.64 lineto +closepath stroke + 3.46 2.64 moveto + 3.52 2.58 lineto +closepath stroke + 3.34 2.51 moveto + 3.27 2.58 lineto +closepath stroke + 3.34 2.51 moveto + 3.35 2.64 lineto +closepath stroke + 3.34 2.51 moveto + 3.40 2.57 lineto +closepath stroke + 3.34 2.51 moveto + 3.28 2.44 lineto +closepath stroke + 3.34 2.51 moveto + 3.46 2.51 lineto +closepath stroke + 3.34 2.51 moveto + 3.42 2.44 lineto +closepath stroke + 3.21 2.36 moveto + 3.20 2.51 lineto +closepath stroke + 3.21 2.36 moveto + 3.28 2.44 lineto +closepath stroke + 3.21 2.36 moveto + 3.11 2.44 lineto +closepath stroke + 3.21 2.36 moveto + 3.14 2.28 lineto +closepath stroke + 3.21 2.36 moveto + 3.36 2.37 lineto +closepath stroke + 3.21 2.36 moveto + 3.31 2.29 lineto +closepath stroke + 3.21 2.36 moveto + 3.26 2.20 lineto +closepath stroke + 3.07 2.20 moveto + 3.04 2.36 lineto +closepath stroke + 3.07 2.20 moveto + 3.14 2.28 lineto +closepath stroke + 3.07 2.20 moveto + 2.94 2.29 lineto +closepath stroke + 3.07 2.20 moveto + 2.99 2.12 lineto +closepath stroke + 3.07 2.20 moveto + 3.19 2.12 lineto +closepath stroke + 3.07 2.20 moveto + 3.13 2.03 lineto +closepath stroke + 2.91 2.03 moveto + 2.86 2.20 lineto +closepath stroke + 2.91 2.03 moveto + 2.99 2.12 lineto +closepath stroke + 2.91 2.03 moveto + 2.75 2.12 lineto +closepath stroke + 2.91 2.03 moveto + 2.82 1.93 lineto +closepath stroke + 2.91 2.03 moveto + 3.06 1.94 lineto +closepath stroke + 2.91 2.03 moveto + 3.00 1.84 lineto +closepath stroke + 2.73 1.83 moveto + 2.67 2.03 lineto +closepath stroke + 2.73 1.83 moveto + 2.82 1.93 lineto +closepath stroke + 2.73 1.83 moveto + 2.55 1.94 lineto +closepath stroke + 2.73 1.83 moveto + 2.64 1.73 lineto +closepath stroke + 2.73 1.83 moveto + 2.91 1.74 lineto +closepath stroke + 2.73 1.83 moveto + 2.84 1.63 lineto +closepath stroke + 2.54 1.62 moveto + 2.45 1.83 lineto +closepath stroke + 2.54 1.62 moveto + 2.64 1.73 lineto +closepath stroke + 2.54 1.62 moveto + 2.32 1.74 lineto +closepath stroke + 2.54 1.62 moveto + 2.44 1.51 lineto +closepath stroke + 2.54 1.62 moveto + 2.75 1.52 lineto +closepath stroke + 2.54 1.62 moveto + 2.67 1.39 lineto +closepath stroke + 2.33 1.39 moveto + 2.22 1.62 lineto +closepath stroke + 2.33 1.39 moveto + 2.44 1.51 lineto +closepath stroke + 2.33 1.39 moveto + 2.07 1.52 lineto +closepath stroke + 2.33 1.39 moveto + 2.22 1.26 lineto +closepath stroke + 2.33 1.39 moveto + 2.57 1.28 lineto +closepath stroke + 2.33 1.39 moveto + 2.49 1.14 lineto +closepath stroke + 2.10 1.13 moveto + 1.96 1.39 lineto +closepath stroke + 2.10 1.13 moveto + 2.22 1.26 lineto +closepath stroke + 2.10 1.13 moveto + 1.80 1.28 lineto +closepath stroke + 2.10 1.13 moveto + 1.97 0.99 lineto +closepath stroke + 2.10 1.13 moveto + 2.37 1.01 lineto +closepath stroke + 2.10 1.13 moveto + 2.28 0.86 lineto +closepath stroke + 1.85 0.85 moveto + 1.67 1.13 lineto +closepath stroke + 1.85 0.85 moveto + 1.97 0.99 lineto +closepath stroke + 1.85 0.85 moveto + 1.50 1.01 lineto +closepath stroke + 1.85 0.85 moveto + 1.71 0.69 lineto +closepath stroke + 1.85 0.85 moveto + 2.16 0.71 lineto +closepath stroke + 1.57 0.54 moveto + 1.36 0.85 lineto +closepath stroke + 1.57 0.54 moveto + 1.71 0.69 lineto +closepath stroke + 1.57 0.54 moveto + 1.17 0.71 lineto +closepath stroke + 1.57 0.54 moveto + 1.41 0.27 lineto +closepath stroke + 1.57 0.54 moveto + 2.02 0.56 lineto +closepath stroke + 1.57 0.54 moveto + 1.92 0.27 lineto +closepath stroke + 1.26 0.00 moveto + 1.02 0.44 lineto +closepath stroke + 1.26 0.00 moveto + 1.41 0.27 lineto +closepath stroke + 1.26 0.00 moveto + 0.63 0.00 lineto +closepath stroke + 1.26 0.00 moveto + 1.77 0.00 lineto +closepath stroke + 3.73 2.76 moveto + 3.69 2.71 lineto +closepath stroke + 3.73 2.76 moveto + 3.65 2.76 lineto +closepath stroke + 3.73 2.76 moveto + 3.77 2.71 lineto +closepath stroke + 3.73 2.76 moveto + 3.79 2.77 lineto +closepath stroke + 3.66 2.65 moveto + 3.56 2.64 lineto +closepath stroke + 3.66 2.65 moveto + 3.61 2.70 lineto +closepath stroke + 3.66 2.65 moveto + 3.69 2.71 lineto +closepath stroke + 3.66 2.65 moveto + 3.62 2.58 lineto +closepath stroke + 3.66 2.65 moveto + 3.74 2.65 lineto +closepath stroke + 3.66 2.65 moveto + 3.72 2.59 lineto +closepath stroke + 3.58 2.52 moveto + 3.46 2.51 lineto +closepath stroke + 3.58 2.52 moveto + 3.52 2.58 lineto +closepath stroke + 3.58 2.52 moveto + 3.62 2.58 lineto +closepath stroke + 3.58 2.52 moveto + 3.54 2.45 lineto +closepath stroke + 3.58 2.52 moveto + 3.68 2.52 lineto +closepath stroke + 3.58 2.52 moveto + 3.65 2.45 lineto +closepath stroke + 3.50 2.37 moveto + 3.36 2.37 lineto +closepath stroke + 3.50 2.37 moveto + 3.42 2.44 lineto +closepath stroke + 3.50 2.37 moveto + 3.54 2.45 lineto +closepath stroke + 3.50 2.37 moveto + 3.46 2.30 lineto +closepath stroke + 3.50 2.37 moveto + 3.61 2.38 lineto +closepath stroke + 3.50 2.37 moveto + 3.59 2.30 lineto +closepath stroke + 3.41 2.22 moveto + 3.31 2.29 lineto +closepath stroke + 3.41 2.22 moveto + 3.46 2.30 lineto +closepath stroke + 3.41 2.22 moveto + 3.36 2.13 lineto +closepath stroke + 3.41 2.22 moveto + 3.54 2.22 lineto +closepath stroke + 3.41 2.22 moveto + 3.52 2.14 lineto +closepath stroke + 3.31 2.04 moveto + 3.26 2.20 lineto +closepath stroke + 3.31 2.04 moveto + 3.36 2.13 lineto +closepath stroke + 3.31 2.04 moveto + 3.19 2.12 lineto +closepath stroke + 3.31 2.04 moveto + 3.26 1.95 lineto +closepath stroke + 3.31 2.04 moveto + 3.47 2.05 lineto +closepath stroke + 3.31 2.04 moveto + 3.44 1.96 lineto +closepath stroke + 3.20 1.85 moveto + 3.13 2.03 lineto +closepath stroke + 3.20 1.85 moveto + 3.26 1.95 lineto +closepath stroke + 3.20 1.85 moveto + 3.06 1.94 lineto +closepath stroke + 3.20 1.85 moveto + 3.14 1.75 lineto +closepath stroke + 3.20 1.85 moveto + 3.38 1.86 lineto +closepath stroke + 3.20 1.85 moveto + 3.35 1.76 lineto +closepath stroke + 3.08 1.65 moveto + 3.00 1.84 lineto +closepath stroke + 3.08 1.65 moveto + 3.14 1.75 lineto +closepath stroke + 3.08 1.65 moveto + 2.91 1.74 lineto +closepath stroke + 3.08 1.65 moveto + 3.02 1.53 lineto +closepath stroke + 3.08 1.65 moveto + 3.29 1.66 lineto +closepath stroke + 3.08 1.65 moveto + 3.25 1.54 lineto +closepath stroke + 2.95 1.42 moveto + 2.84 1.63 lineto +closepath stroke + 2.95 1.42 moveto + 3.02 1.53 lineto +closepath stroke + 2.95 1.42 moveto + 2.75 1.52 lineto +closepath stroke + 2.95 1.42 moveto + 2.88 1.29 lineto +closepath stroke + 2.95 1.42 moveto + 3.18 1.43 lineto +closepath stroke + 2.95 1.42 moveto + 3.14 1.31 lineto +closepath stroke + 2.80 1.16 moveto + 2.67 1.39 lineto +closepath stroke + 2.80 1.16 moveto + 2.88 1.29 lineto +closepath stroke + 2.80 1.16 moveto + 2.57 1.28 lineto +closepath stroke + 2.80 1.16 moveto + 2.72 1.02 lineto +closepath stroke + 2.80 1.16 moveto + 3.07 1.18 lineto +closepath stroke + 2.80 1.16 moveto + 3.03 1.04 lineto +closepath stroke + 2.64 0.88 moveto + 2.49 1.14 lineto +closepath stroke + 2.64 0.88 moveto + 2.72 1.02 lineto +closepath stroke + 2.64 0.88 moveto + 2.37 1.01 lineto +closepath stroke + 2.64 0.88 moveto + 2.55 0.73 lineto +closepath stroke + 2.64 0.88 moveto + 2.95 0.90 lineto +closepath stroke + 2.64 0.88 moveto + 2.90 0.75 lineto +closepath stroke + 2.47 0.58 moveto + 2.02 0.56 lineto +closepath stroke + 2.47 0.58 moveto + 2.16 0.71 lineto +closepath stroke + 2.47 0.58 moveto + 2.28 0.86 lineto +closepath stroke + 2.47 0.58 moveto + 2.55 0.73 lineto +closepath stroke + 2.47 0.58 moveto + 2.37 0.29 lineto +closepath stroke + 2.47 0.58 moveto + 2.81 0.60 lineto +closepath stroke + 2.47 0.58 moveto + 2.76 0.29 lineto +closepath stroke + 2.27 0.00 moveto + 1.77 0.00 lineto +closepath stroke + 2.27 0.00 moveto + 1.92 0.27 lineto +closepath stroke + 2.27 0.00 moveto + 2.37 0.29 lineto +closepath stroke + 2.27 0.00 moveto + 2.66 0.00 lineto +closepath stroke + 3.85 2.77 moveto + 3.83 2.71 lineto +closepath stroke + 3.85 2.77 moveto + 3.79 2.77 lineto +closepath stroke + 3.85 2.77 moveto + 3.89 2.71 lineto +closepath stroke + 3.85 2.77 moveto + 3.90 2.77 lineto +closepath stroke + 3.81 2.65 moveto + 3.74 2.65 lineto +closepath stroke + 3.81 2.65 moveto + 3.77 2.71 lineto +closepath stroke + 3.81 2.65 moveto + 3.83 2.71 lineto +closepath stroke + 3.81 2.65 moveto + 3.79 2.59 lineto +closepath stroke + 3.81 2.65 moveto + 3.88 2.65 lineto +closepath stroke + 3.81 2.65 moveto + 3.87 2.59 lineto +closepath stroke + 3.77 2.53 moveto + 3.68 2.52 lineto +closepath stroke + 3.77 2.53 moveto + 3.72 2.59 lineto +closepath stroke + 3.77 2.53 moveto + 3.79 2.59 lineto +closepath stroke + 3.77 2.53 moveto + 3.75 2.46 lineto +closepath stroke + 3.77 2.53 moveto + 3.85 2.53 lineto +closepath stroke + 3.77 2.53 moveto + 3.84 2.46 lineto +closepath stroke + 3.72 2.39 moveto + 3.61 2.38 lineto +closepath stroke + 3.72 2.39 moveto + 3.65 2.45 lineto +closepath stroke + 3.72 2.39 moveto + 3.75 2.46 lineto +closepath stroke + 3.72 2.39 moveto + 3.70 2.31 lineto +closepath stroke + 3.72 2.39 moveto + 3.82 2.39 lineto +closepath stroke + 3.72 2.39 moveto + 3.81 2.31 lineto +closepath stroke + 3.67 2.23 moveto + 3.54 2.22 lineto +closepath stroke + 3.67 2.23 moveto + 3.59 2.30 lineto +closepath stroke + 3.67 2.23 moveto + 3.70 2.31 lineto +closepath stroke + 3.67 2.23 moveto + 3.65 2.15 lineto +closepath stroke + 3.67 2.23 moveto + 3.79 2.23 lineto +closepath stroke + 3.67 2.23 moveto + 3.78 2.15 lineto +closepath stroke + 3.62 2.06 moveto + 3.52 2.14 lineto +closepath stroke + 3.62 2.06 moveto + 3.65 2.15 lineto +closepath stroke + 3.62 2.06 moveto + 3.47 2.05 lineto +closepath stroke + 3.62 2.06 moveto + 3.59 1.97 lineto +closepath stroke + 3.62 2.06 moveto + 3.75 2.06 lineto +closepath stroke + 3.62 2.06 moveto + 3.74 1.97 lineto +closepath stroke + 3.56 1.87 moveto + 3.44 1.96 lineto +closepath stroke + 3.56 1.87 moveto + 3.59 1.97 lineto +closepath stroke + 3.56 1.87 moveto + 3.38 1.86 lineto +closepath stroke + 3.56 1.87 moveto + 3.53 1.77 lineto +closepath stroke + 3.56 1.87 moveto + 3.71 1.88 lineto +closepath stroke + 3.56 1.87 moveto + 3.70 1.78 lineto +closepath stroke + 3.49 1.67 moveto + 3.35 1.76 lineto +closepath stroke + 3.49 1.67 moveto + 3.53 1.77 lineto +closepath stroke + 3.49 1.67 moveto + 3.29 1.66 lineto +closepath stroke + 3.49 1.67 moveto + 3.46 1.56 lineto +closepath stroke + 3.49 1.67 moveto + 3.66 1.67 lineto +closepath stroke + 3.49 1.67 moveto + 3.65 1.56 lineto +closepath stroke + 3.42 1.44 moveto + 3.25 1.54 lineto +closepath stroke + 3.42 1.44 moveto + 3.46 1.56 lineto +closepath stroke + 3.42 1.44 moveto + 3.18 1.43 lineto +closepath stroke + 3.42 1.44 moveto + 3.38 1.32 lineto +closepath stroke + 3.42 1.44 moveto + 3.62 1.45 lineto +closepath stroke + 3.42 1.44 moveto + 3.60 1.33 lineto +closepath stroke + 3.34 1.20 moveto + 3.14 1.31 lineto +closepath stroke + 3.34 1.20 moveto + 3.38 1.32 lineto +closepath stroke + 3.34 1.20 moveto + 3.07 1.18 lineto +closepath stroke + 3.34 1.20 moveto + 3.29 1.06 lineto +closepath stroke + 3.34 1.20 moveto + 3.56 1.20 lineto +closepath stroke + 3.34 1.20 moveto + 3.55 1.07 lineto +closepath stroke + 3.25 0.92 moveto + 3.03 1.04 lineto +closepath stroke + 3.25 0.92 moveto + 3.29 1.06 lineto +closepath stroke + 3.25 0.92 moveto + 2.95 0.90 lineto +closepath stroke + 3.25 0.92 moveto + 3.20 0.77 lineto +closepath stroke + 3.25 0.92 moveto + 3.50 0.93 lineto +closepath stroke + 3.25 0.92 moveto + 3.49 0.78 lineto +closepath stroke + 3.15 0.62 moveto + 2.90 0.75 lineto +closepath stroke + 3.15 0.62 moveto + 3.20 0.77 lineto +closepath stroke + 3.15 0.62 moveto + 2.81 0.60 lineto +closepath stroke + 3.15 0.62 moveto + 3.10 0.31 lineto +closepath stroke + 3.15 0.62 moveto + 3.44 0.63 lineto +closepath stroke + 3.15 0.62 moveto + 3.42 0.31 lineto +closepath stroke + 3.04 0.00 moveto + 2.76 0.29 lineto +closepath stroke + 3.04 0.00 moveto + 3.10 0.31 lineto +closepath stroke + 3.04 0.00 moveto + 2.66 0.00 lineto +closepath stroke + 3.04 0.00 moveto + 3.37 0.00 lineto +closepath stroke + 3.95 2.77 moveto + 3.95 2.71 lineto +closepath stroke + 3.95 2.77 moveto + 3.90 2.77 lineto +closepath stroke + 3.95 2.77 moveto + 4.01 2.71 lineto +closepath stroke + 3.95 2.77 moveto + 4.00 2.77 lineto +closepath stroke + 3.94 2.65 moveto + 3.88 2.65 lineto +closepath stroke + 3.94 2.65 moveto + 3.89 2.71 lineto +closepath stroke + 3.94 2.65 moveto + 3.95 2.71 lineto +closepath stroke + 3.94 2.65 moveto + 3.93 2.59 lineto +closepath stroke + 3.94 2.65 moveto + 4.00 2.66 lineto +closepath stroke + 3.94 2.65 moveto + 4.01 2.59 lineto +closepath stroke + 3.93 2.53 moveto + 3.85 2.53 lineto +closepath stroke + 3.93 2.53 moveto + 3.87 2.59 lineto +closepath stroke + 3.93 2.53 moveto + 3.93 2.59 lineto +closepath stroke + 3.93 2.53 moveto + 3.92 2.46 lineto +closepath stroke + 3.93 2.53 moveto + 4.00 2.53 lineto +closepath stroke + 3.93 2.53 moveto + 4.01 2.46 lineto +closepath stroke + 3.91 2.39 moveto + 3.82 2.39 lineto +closepath stroke + 3.91 2.39 moveto + 3.84 2.46 lineto +closepath stroke + 3.91 2.39 moveto + 3.92 2.46 lineto +closepath stroke + 3.91 2.39 moveto + 3.90 2.31 lineto +closepath stroke + 3.91 2.39 moveto + 4.00 2.39 lineto +closepath stroke + 3.91 2.39 moveto + 4.01 2.31 lineto +closepath stroke + 3.90 2.24 moveto + 3.79 2.23 lineto +closepath stroke + 3.90 2.24 moveto + 3.81 2.31 lineto +closepath stroke + 3.90 2.24 moveto + 3.90 2.31 lineto +closepath stroke + 3.90 2.24 moveto + 3.89 2.15 lineto +closepath stroke + 3.90 2.24 moveto + 4.00 2.24 lineto +closepath stroke + 3.90 2.24 moveto + 4.01 2.15 lineto +closepath stroke + 3.88 2.07 moveto + 3.75 2.06 lineto +closepath stroke + 3.88 2.07 moveto + 3.78 2.15 lineto +closepath stroke + 3.88 2.07 moveto + 3.89 2.15 lineto +closepath stroke + 3.88 2.07 moveto + 3.87 1.98 lineto +closepath stroke + 3.88 2.07 moveto + 4.00 2.07 lineto +closepath stroke + 3.88 2.07 moveto + 4.01 1.98 lineto +closepath stroke + 3.86 1.88 moveto + 3.71 1.88 lineto +closepath stroke + 3.86 1.88 moveto + 3.74 1.97 lineto +closepath stroke + 3.86 1.88 moveto + 3.87 1.98 lineto +closepath stroke + 3.86 1.88 moveto + 3.85 1.78 lineto +closepath stroke + 3.86 1.88 moveto + 4.00 1.88 lineto +closepath stroke + 3.86 1.88 moveto + 4.01 1.78 lineto +closepath stroke + 3.84 1.68 moveto + 3.70 1.78 lineto +closepath stroke + 3.84 1.68 moveto + 3.85 1.78 lineto +closepath stroke + 3.84 1.68 moveto + 3.66 1.67 lineto +closepath stroke + 3.84 1.68 moveto + 3.83 1.57 lineto +closepath stroke + 3.84 1.68 moveto + 4.00 1.68 lineto +closepath stroke + 3.84 1.68 moveto + 4.01 1.57 lineto +closepath stroke + 3.81 1.45 moveto + 3.65 1.56 lineto +closepath stroke + 3.81 1.45 moveto + 3.83 1.57 lineto +closepath stroke + 3.81 1.45 moveto + 3.62 1.45 lineto +closepath stroke + 3.81 1.45 moveto + 3.80 1.33 lineto +closepath stroke + 3.81 1.45 moveto + 4.00 1.46 lineto +closepath stroke + 3.81 1.45 moveto + 4.01 1.33 lineto +closepath stroke + 3.79 1.21 moveto + 3.60 1.33 lineto +closepath stroke + 3.79 1.21 moveto + 3.80 1.33 lineto +closepath stroke + 3.79 1.21 moveto + 3.56 1.20 lineto +closepath stroke + 3.79 1.21 moveto + 3.77 1.07 lineto +closepath stroke + 3.79 1.21 moveto + 4.00 1.21 lineto +closepath stroke + 3.79 1.21 moveto + 4.01 1.07 lineto +closepath stroke + 3.76 0.94 moveto + 3.55 1.07 lineto +closepath stroke + 3.76 0.94 moveto + 3.77 1.07 lineto +closepath stroke + 3.76 0.94 moveto + 3.50 0.93 lineto +closepath stroke + 3.76 0.94 moveto + 3.74 0.79 lineto +closepath stroke + 3.76 0.94 moveto + 4.00 0.94 lineto +closepath stroke + 3.76 0.94 moveto + 4.02 0.79 lineto +closepath stroke + 3.73 0.64 moveto + 3.49 0.78 lineto +closepath stroke + 3.73 0.64 moveto + 3.74 0.79 lineto +closepath stroke + 3.73 0.64 moveto + 3.44 0.63 lineto +closepath stroke + 3.73 0.64 moveto + 3.71 0.32 lineto +closepath stroke + 3.73 0.64 moveto + 4.00 0.64 lineto +closepath stroke + 3.73 0.64 moveto + 4.02 0.32 lineto +closepath stroke + 3.69 0.00 moveto + 3.42 0.31 lineto +closepath stroke + 3.69 0.00 moveto + 3.71 0.32 lineto +closepath stroke + 3.69 0.00 moveto + 3.37 0.00 lineto +closepath stroke + 3.69 0.00 moveto + 4.00 0.00 lineto +closepath stroke + 4.05 2.77 moveto + 4.05 2.71 lineto +closepath stroke + 4.05 2.77 moveto + 4.00 2.77 lineto +closepath stroke + 4.05 2.77 moveto + 4.10 2.77 lineto +closepath stroke + 4.06 2.66 moveto + 4.00 2.66 lineto +closepath stroke + 4.06 2.66 moveto + 4.01 2.71 lineto +closepath stroke + 4.06 2.66 moveto + 4.05 2.71 lineto +closepath stroke + 4.06 2.66 moveto + 4.07 2.59 lineto +closepath stroke + 4.06 2.66 moveto + 4.10 2.71 lineto +closepath stroke + 4.06 2.66 moveto + 4.12 2.66 lineto +closepath stroke + 4.07 2.53 moveto + 4.00 2.53 lineto +closepath stroke + 4.07 2.53 moveto + 4.01 2.59 lineto +closepath stroke + 4.07 2.53 moveto + 4.07 2.59 lineto +closepath stroke + 4.07 2.53 moveto + 4.08 2.46 lineto +closepath stroke + 4.07 2.53 moveto + 4.13 2.59 lineto +closepath stroke + 4.07 2.53 moveto + 4.15 2.53 lineto +closepath stroke + 4.09 2.39 moveto + 4.00 2.39 lineto +closepath stroke + 4.09 2.39 moveto + 4.01 2.46 lineto +closepath stroke + 4.09 2.39 moveto + 4.08 2.46 lineto +closepath stroke + 4.09 2.39 moveto + 4.10 2.31 lineto +closepath stroke + 4.09 2.39 moveto + 4.16 2.46 lineto +closepath stroke + 4.09 2.39 moveto + 4.18 2.39 lineto +closepath stroke + 4.10 2.24 moveto + 4.00 2.24 lineto +closepath stroke + 4.10 2.24 moveto + 4.01 2.31 lineto +closepath stroke + 4.10 2.24 moveto + 4.10 2.31 lineto +closepath stroke + 4.10 2.24 moveto + 4.11 2.15 lineto +closepath stroke + 4.10 2.24 moveto + 4.19 2.32 lineto +closepath stroke + 4.10 2.24 moveto + 4.21 2.24 lineto +closepath stroke + 4.12 2.07 moveto + 4.00 2.07 lineto +closepath stroke + 4.12 2.07 moveto + 4.01 2.15 lineto +closepath stroke + 4.12 2.07 moveto + 4.11 2.15 lineto +closepath stroke + 4.12 2.07 moveto + 4.13 1.98 lineto +closepath stroke + 4.12 2.07 moveto + 4.22 2.16 lineto +closepath stroke + 4.12 2.07 moveto + 4.25 2.07 lineto +closepath stroke + 4.14 1.88 moveto + 4.00 1.88 lineto +closepath stroke + 4.14 1.88 moveto + 4.01 1.98 lineto +closepath stroke + 4.14 1.88 moveto + 4.13 1.98 lineto +closepath stroke + 4.14 1.88 moveto + 4.15 1.78 lineto +closepath stroke + 4.14 1.88 moveto + 4.26 1.98 lineto +closepath stroke + 4.14 1.88 moveto + 4.29 1.89 lineto +closepath stroke + 4.16 1.68 moveto + 4.00 1.68 lineto +closepath stroke + 4.16 1.68 moveto + 4.01 1.78 lineto +closepath stroke + 4.16 1.68 moveto + 4.15 1.78 lineto +closepath stroke + 4.16 1.68 moveto + 4.17 1.57 lineto +closepath stroke + 4.16 1.68 moveto + 4.30 1.79 lineto +closepath stroke + 4.16 1.68 moveto + 4.33 1.69 lineto +closepath stroke + 4.19 1.46 moveto + 4.01 1.57 lineto +closepath stroke + 4.19 1.46 moveto + 4.17 1.57 lineto +closepath stroke + 4.19 1.46 moveto + 4.00 1.46 lineto +closepath stroke + 4.19 1.46 moveto + 4.20 1.33 lineto +closepath stroke + 4.19 1.46 moveto + 4.34 1.57 lineto +closepath stroke + 4.19 1.46 moveto + 4.38 1.46 lineto +closepath stroke + 4.21 1.21 moveto + 4.01 1.33 lineto +closepath stroke + 4.21 1.21 moveto + 4.20 1.33 lineto +closepath stroke + 4.21 1.21 moveto + 4.00 1.21 lineto +closepath stroke + 4.21 1.21 moveto + 4.23 1.07 lineto +closepath stroke + 4.21 1.21 moveto + 4.39 1.34 lineto +closepath stroke + 4.21 1.21 moveto + 4.43 1.22 lineto +closepath stroke + 4.24 0.94 moveto + 4.01 1.07 lineto +closepath stroke + 4.24 0.94 moveto + 4.23 1.07 lineto +closepath stroke + 4.24 0.94 moveto + 4.00 0.94 lineto +closepath stroke + 4.24 0.94 moveto + 4.26 0.79 lineto +closepath stroke + 4.24 0.94 moveto + 4.45 1.08 lineto +closepath stroke + 4.24 0.94 moveto + 4.49 0.95 lineto +closepath stroke + 4.27 0.64 moveto + 4.02 0.79 lineto +closepath stroke + 4.27 0.64 moveto + 4.26 0.79 lineto +closepath stroke + 4.27 0.64 moveto + 4.00 0.64 lineto +closepath stroke + 4.27 0.64 moveto + 4.29 0.32 lineto +closepath stroke + 4.27 0.64 moveto + 4.50 0.80 lineto +closepath stroke + 4.27 0.64 moveto + 4.55 0.65 lineto +closepath stroke + 4.31 0.00 moveto + 4.02 0.32 lineto +closepath stroke + 4.31 0.00 moveto + 4.29 0.32 lineto +closepath stroke + 4.31 0.00 moveto + 4.00 0.00 lineto +closepath stroke + 4.31 0.00 moveto + 4.57 0.33 lineto +closepath stroke + 4.31 0.00 moveto + 4.62 0.00 lineto +closepath stroke + 4.15 2.77 moveto + 4.10 2.71 lineto +closepath stroke + 4.15 2.77 moveto + 4.10 2.77 lineto +closepath stroke + 4.15 2.77 moveto + 4.17 2.72 lineto +closepath stroke + 4.15 2.77 moveto + 4.20 2.78 lineto +closepath stroke + 4.18 2.66 moveto + 4.13 2.59 lineto +closepath stroke + 4.18 2.66 moveto + 4.12 2.66 lineto +closepath stroke + 4.18 2.66 moveto + 4.17 2.72 lineto +closepath stroke + 4.18 2.66 moveto + 4.21 2.60 lineto +closepath stroke + 4.18 2.66 moveto + 4.22 2.72 lineto +closepath stroke + 4.18 2.66 moveto + 4.25 2.67 lineto +closepath stroke + 4.23 2.53 moveto + 4.16 2.46 lineto +closepath stroke + 4.23 2.53 moveto + 4.15 2.53 lineto +closepath stroke + 4.23 2.53 moveto + 4.21 2.60 lineto +closepath stroke + 4.23 2.53 moveto + 4.25 2.47 lineto +closepath stroke + 4.23 2.53 moveto + 4.27 2.60 lineto +closepath stroke + 4.23 2.53 moveto + 4.30 2.54 lineto +closepath stroke + 4.27 2.40 moveto + 4.19 2.32 lineto +closepath stroke + 4.27 2.40 moveto + 4.18 2.39 lineto +closepath stroke + 4.27 2.40 moveto + 4.25 2.47 lineto +closepath stroke + 4.27 2.40 moveto + 4.29 2.32 lineto +closepath stroke + 4.27 2.40 moveto + 4.33 2.47 lineto +closepath stroke + 4.27 2.40 moveto + 4.36 2.41 lineto +closepath stroke + 4.32 2.25 moveto + 4.22 2.16 lineto +closepath stroke + 4.32 2.25 moveto + 4.21 2.24 lineto +closepath stroke + 4.32 2.25 moveto + 4.29 2.32 lineto +closepath stroke + 4.32 2.25 moveto + 4.35 2.16 lineto +closepath stroke + 4.32 2.25 moveto + 4.39 2.33 lineto +closepath stroke + 4.32 2.25 moveto + 4.43 2.26 lineto +closepath stroke + 4.37 2.08 moveto + 4.26 1.98 lineto +closepath stroke + 4.37 2.08 moveto + 4.25 2.07 lineto +closepath stroke + 4.37 2.08 moveto + 4.35 2.16 lineto +closepath stroke + 4.37 2.08 moveto + 4.40 1.99 lineto +closepath stroke + 4.37 2.08 moveto + 4.46 2.18 lineto +closepath stroke + 4.37 2.08 moveto + 4.50 2.10 lineto +closepath stroke + 4.43 1.90 moveto + 4.30 1.79 lineto +closepath stroke + 4.43 1.90 moveto + 4.29 1.89 lineto +closepath stroke + 4.43 1.90 moveto + 4.40 1.99 lineto +closepath stroke + 4.43 1.90 moveto + 4.47 1.79 lineto +closepath stroke + 4.43 1.90 moveto + 4.53 2.01 lineto +closepath stroke + 4.43 1.90 moveto + 4.58 1.92 lineto +closepath stroke + 4.50 1.69 moveto + 4.34 1.57 lineto +closepath stroke + 4.50 1.69 moveto + 4.33 1.69 lineto +closepath stroke + 4.50 1.69 moveto + 4.47 1.79 lineto +closepath stroke + 4.50 1.69 moveto + 4.53 1.58 lineto +closepath stroke + 4.50 1.69 moveto + 4.62 1.82 lineto +closepath stroke + 4.50 1.69 moveto + 4.67 1.72 lineto +closepath stroke + 4.57 1.47 moveto + 4.38 1.46 lineto +closepath stroke + 4.57 1.47 moveto + 4.53 1.58 lineto +closepath stroke + 4.57 1.47 moveto + 4.39 1.34 lineto +closepath stroke + 4.57 1.47 moveto + 4.61 1.35 lineto +closepath stroke + 4.57 1.47 moveto + 4.71 1.61 lineto +closepath stroke + 4.57 1.47 moveto + 4.77 1.50 lineto +closepath stroke + 4.65 1.23 moveto + 4.43 1.22 lineto +closepath stroke + 4.65 1.23 moveto + 4.61 1.35 lineto +closepath stroke + 4.65 1.23 moveto + 4.45 1.08 lineto +closepath stroke + 4.65 1.23 moveto + 4.69 1.09 lineto +closepath stroke + 4.65 1.23 moveto + 4.81 1.38 lineto +closepath stroke + 4.65 1.23 moveto + 4.88 1.27 lineto +closepath stroke + 4.74 0.96 moveto + 4.49 0.95 lineto +closepath stroke + 4.74 0.96 moveto + 4.69 1.09 lineto +closepath stroke + 4.74 0.96 moveto + 4.50 0.80 lineto +closepath stroke + 4.74 0.96 moveto + 4.78 0.81 lineto +closepath stroke + 4.74 0.96 moveto + 4.92 1.13 lineto +closepath stroke + 4.74 0.96 moveto + 5.00 1.00 lineto +closepath stroke + 4.83 0.67 moveto + 4.55 0.65 lineto +closepath stroke + 4.83 0.67 moveto + 4.78 0.81 lineto +closepath stroke + 4.83 0.67 moveto + 4.57 0.33 lineto +closepath stroke + 4.83 0.67 moveto + 4.88 0.33 lineto +closepath stroke + 4.83 0.67 moveto + 5.04 0.86 lineto +closepath stroke + 4.83 0.67 moveto + 5.12 0.71 lineto +closepath stroke + 4.83 0.67 moveto + 5.21 0.56 lineto +closepath stroke + 4.94 0.00 moveto + 4.62 0.00 lineto +closepath stroke + 4.94 0.00 moveto + 4.88 0.33 lineto +closepath stroke + 4.94 0.00 moveto + 5.27 0.23 lineto +closepath stroke + 4.94 0.00 moveto + 5.27 0.00 lineto +closepath stroke + 4.25 2.78 moveto + 4.22 2.72 lineto +closepath stroke + 4.25 2.78 moveto + 4.20 2.78 lineto +closepath stroke + 4.25 2.78 moveto + 4.28 2.73 lineto +closepath stroke + 4.25 2.78 moveto + 4.30 2.79 lineto +closepath stroke + 4.31 2.67 moveto + 4.27 2.60 lineto +closepath stroke + 4.31 2.67 moveto + 4.25 2.67 lineto +closepath stroke + 4.31 2.67 moveto + 4.28 2.73 lineto +closepath stroke + 4.31 2.67 moveto + 4.35 2.61 lineto +closepath stroke + 4.31 2.67 moveto + 4.34 2.74 lineto +closepath stroke + 4.31 2.67 moveto + 4.38 2.69 lineto +closepath stroke + 4.38 2.55 moveto + 4.33 2.47 lineto +closepath stroke + 4.38 2.55 moveto + 4.30 2.54 lineto +closepath stroke + 4.38 2.55 moveto + 4.35 2.61 lineto +closepath stroke + 4.38 2.55 moveto + 4.42 2.49 lineto +closepath stroke + 4.38 2.55 moveto + 4.41 2.63 lineto +closepath stroke + 4.38 2.55 moveto + 4.46 2.57 lineto +closepath stroke + 4.46 2.42 moveto + 4.39 2.33 lineto +closepath stroke + 4.46 2.42 moveto + 4.36 2.41 lineto +closepath stroke + 4.46 2.42 moveto + 4.42 2.49 lineto +closepath stroke + 4.46 2.42 moveto + 4.50 2.35 lineto +closepath stroke + 4.46 2.42 moveto + 4.50 2.51 lineto +closepath stroke + 4.46 2.42 moveto + 4.55 2.45 lineto +closepath stroke + 4.54 2.28 moveto + 4.46 2.18 lineto +closepath stroke + 4.54 2.28 moveto + 4.43 2.26 lineto +closepath stroke + 4.54 2.28 moveto + 4.50 2.35 lineto +closepath stroke + 4.54 2.28 moveto + 4.59 2.20 lineto +closepath stroke + 4.54 2.28 moveto + 4.60 2.38 lineto +closepath stroke + 4.54 2.28 moveto + 4.66 2.31 lineto +closepath stroke + 4.64 2.12 moveto + 4.53 2.01 lineto +closepath stroke + 4.64 2.12 moveto + 4.50 2.10 lineto +closepath stroke + 4.64 2.12 moveto + 4.59 2.20 lineto +closepath stroke + 4.64 2.12 moveto + 4.69 2.03 lineto +closepath stroke + 4.64 2.12 moveto + 4.70 2.23 lineto +closepath stroke + 4.64 2.12 moveto + 4.77 2.16 lineto +closepath stroke + 4.74 1.94 moveto + 4.62 1.82 lineto +closepath stroke + 4.74 1.94 moveto + 4.58 1.92 lineto +closepath stroke + 4.74 1.94 moveto + 4.69 2.03 lineto +closepath stroke + 4.74 1.94 moveto + 4.79 1.85 lineto +closepath stroke + 4.74 1.94 moveto + 4.82 2.07 lineto +closepath stroke + 4.74 1.94 moveto + 4.89 1.99 lineto +closepath stroke + 4.85 1.75 moveto + 4.71 1.61 lineto +closepath stroke + 4.85 1.75 moveto + 4.67 1.72 lineto +closepath stroke + 4.85 1.75 moveto + 4.79 1.85 lineto +closepath stroke + 4.85 1.75 moveto + 4.91 1.64 lineto +closepath stroke + 4.85 1.75 moveto + 4.95 1.89 lineto +closepath stroke + 4.85 1.75 moveto + 5.02 1.81 lineto +closepath stroke + 4.97 1.54 moveto + 4.81 1.38 lineto +closepath stroke + 4.97 1.54 moveto + 4.77 1.50 lineto +closepath stroke + 4.97 1.54 moveto + 4.91 1.64 lineto +closepath stroke + 4.97 1.54 moveto + 5.04 1.42 lineto +closepath stroke + 4.97 1.54 moveto + 5.09 1.70 lineto +closepath stroke + 4.97 1.54 moveto + 5.17 1.60 lineto +closepath stroke + 5.11 1.30 moveto + 4.92 1.13 lineto +closepath stroke + 5.11 1.30 moveto + 4.88 1.27 lineto +closepath stroke + 5.11 1.30 moveto + 5.04 1.42 lineto +closepath stroke + 5.11 1.30 moveto + 5.18 1.17 lineto +closepath stroke + 5.11 1.30 moveto + 5.24 1.49 lineto +closepath stroke + 5.11 1.30 moveto + 5.33 1.38 lineto +closepath stroke + 5.25 1.05 moveto + 5.00 1.00 lineto +closepath stroke + 5.25 1.05 moveto + 5.18 1.17 lineto +closepath stroke + 5.25 1.05 moveto + 5.04 0.86 lineto +closepath stroke + 5.25 1.05 moveto + 5.34 0.90 lineto +closepath stroke + 5.25 1.05 moveto + 5.41 1.25 lineto +closepath stroke + 5.42 0.76 moveto + 5.12 0.71 lineto +closepath stroke + 5.42 0.76 moveto + 5.34 0.90 lineto +closepath stroke + 5.42 0.76 moveto + 5.51 0.61 lineto +closepath stroke + 5.42 0.76 moveto + 5.49 1.11 lineto +closepath stroke + 5.42 0.76 moveto + 5.71 1.00 lineto +closepath stroke + 5.60 0.45 moveto + 5.21 0.56 lineto +closepath stroke + 5.60 0.45 moveto + 5.51 0.61 lineto +closepath stroke + 5.60 0.45 moveto + 5.27 0.23 lineto +closepath stroke + 5.60 0.45 moveto + 5.80 0.23 lineto +closepath stroke + 5.60 0.45 moveto + 5.60 0.23 lineto +closepath stroke + 5.60 0.45 moveto + 5.80 0.84 lineto +closepath stroke + 5.60 0.00 moveto + 5.60 0.23 lineto +closepath stroke + 5.60 0.00 moveto + 5.80 0.00 lineto +closepath stroke + 5.60 0.00 moveto + 5.27 0.00 lineto +closepath stroke + 4.36 2.80 moveto + 4.34 2.74 lineto +closepath stroke + 4.36 2.80 moveto + 4.30 2.79 lineto +closepath stroke + 4.36 2.80 moveto + 4.40 2.75 lineto +closepath stroke + 4.36 2.80 moveto + 4.40 2.82 lineto +closepath stroke + 4.44 2.70 moveto + 4.41 2.63 lineto +closepath stroke + 4.44 2.70 moveto + 4.38 2.69 lineto +closepath stroke + 4.44 2.70 moveto + 4.40 2.75 lineto +closepath stroke + 4.44 2.70 moveto + 4.49 2.65 lineto +closepath stroke + 4.44 2.70 moveto + 4.45 2.77 lineto +closepath stroke + 4.44 2.70 moveto + 4.50 2.73 lineto +closepath stroke + 4.54 2.60 moveto + 4.50 2.51 lineto +closepath stroke + 4.54 2.60 moveto + 4.46 2.57 lineto +closepath stroke + 4.54 2.60 moveto + 4.49 2.65 lineto +closepath stroke + 4.54 2.60 moveto + 4.60 2.54 lineto +closepath stroke + 4.54 2.60 moveto + 4.55 2.67 lineto +closepath stroke + 4.54 2.60 moveto + 4.62 2.63 lineto +closepath stroke + 4.65 2.48 moveto + 4.60 2.38 lineto +closepath stroke + 4.65 2.48 moveto + 4.55 2.45 lineto +closepath stroke + 4.65 2.48 moveto + 4.60 2.54 lineto +closepath stroke + 4.65 2.48 moveto + 4.71 2.41 lineto +closepath stroke + 4.65 2.48 moveto + 4.67 2.57 lineto +closepath stroke + 4.65 2.48 moveto + 4.74 2.52 lineto +closepath stroke + 4.77 2.34 moveto + 4.70 2.23 lineto +closepath stroke + 4.77 2.34 moveto + 4.66 2.31 lineto +closepath stroke + 4.77 2.34 moveto + 4.71 2.41 lineto +closepath stroke + 4.77 2.34 moveto + 4.83 2.27 lineto +closepath stroke + 4.77 2.34 moveto + 4.80 2.45 lineto +closepath stroke + 4.77 2.34 moveto + 4.87 2.40 lineto +closepath stroke + 4.90 2.20 moveto + 4.82 2.07 lineto +closepath stroke + 4.90 2.20 moveto + 4.77 2.16 lineto +closepath stroke + 4.90 2.20 moveto + 4.83 2.27 lineto +closepath stroke + 4.90 2.20 moveto + 4.97 2.12 lineto +closepath stroke + 4.90 2.20 moveto + 4.94 2.33 lineto +closepath stroke + 4.90 2.20 moveto + 5.02 2.27 lineto +closepath stroke + 5.04 2.04 moveto + 4.95 1.89 lineto +closepath stroke + 5.04 2.04 moveto + 4.89 1.99 lineto +closepath stroke + 5.04 2.04 moveto + 4.97 2.12 lineto +closepath stroke + 5.04 2.04 moveto + 5.12 1.95 lineto +closepath stroke + 5.04 2.04 moveto + 5.09 2.19 lineto +closepath stroke + 5.04 2.04 moveto + 5.18 2.12 lineto +closepath stroke + 5.20 1.87 moveto + 5.09 1.70 lineto +closepath stroke + 5.20 1.87 moveto + 5.02 1.81 lineto +closepath stroke + 5.20 1.87 moveto + 5.12 1.95 lineto +closepath stroke + 5.20 1.87 moveto + 5.29 1.77 lineto +closepath stroke + 5.20 1.87 moveto + 5.26 2.03 lineto +closepath stroke + 5.20 1.87 moveto + 5.36 1.96 lineto +closepath stroke + 5.37 1.67 moveto + 5.24 1.49 lineto +closepath stroke + 5.37 1.67 moveto + 5.17 1.60 lineto +closepath stroke + 5.37 1.67 moveto + 5.29 1.77 lineto +closepath stroke + 5.37 1.67 moveto + 5.47 1.57 lineto +closepath stroke + 5.37 1.67 moveto + 5.45 1.86 lineto +closepath stroke + 5.37 1.67 moveto + 5.56 1.78 lineto +closepath stroke + 5.56 1.46 moveto + 5.49 1.11 lineto +closepath stroke + 5.56 1.46 moveto + 5.41 1.25 lineto +closepath stroke + 5.56 1.46 moveto + 5.33 1.38 lineto +closepath stroke + 5.56 1.46 moveto + 5.47 1.57 lineto +closepath stroke + 5.56 1.46 moveto + 5.78 1.34 lineto +closepath stroke + 5.56 1.46 moveto + 5.65 1.68 lineto +closepath stroke + 5.56 1.46 moveto + 5.78 1.68 lineto +closepath stroke + 6.00 1.23 moveto + 6.00 0.61 lineto +closepath stroke + 6.00 1.23 moveto + 5.80 0.84 lineto +closepath stroke + 6.00 1.23 moveto + 5.71 1.00 lineto +closepath stroke + 6.00 1.23 moveto + 5.78 1.34 lineto +closepath stroke + 6.00 1.23 moveto + 6.00 1.56 lineto +closepath stroke + 4.45 2.84 moveto + 4.45 2.77 lineto +closepath stroke + 4.45 2.84 moveto + 4.40 2.82 lineto +closepath stroke + 4.45 2.84 moveto + 4.51 2.79 lineto +closepath stroke + 4.45 2.84 moveto + 4.49 2.86 lineto +closepath stroke + 4.57 2.75 moveto + 4.55 2.67 lineto +closepath stroke + 4.57 2.75 moveto + 4.50 2.73 lineto +closepath stroke + 4.57 2.75 moveto + 4.51 2.79 lineto +closepath stroke + 4.57 2.75 moveto + 4.63 2.71 lineto +closepath stroke + 4.57 2.75 moveto + 4.55 2.82 lineto +closepath stroke + 4.57 2.75 moveto + 4.61 2.79 lineto +closepath stroke + 4.69 2.66 moveto + 4.67 2.57 lineto +closepath stroke + 4.69 2.66 moveto + 4.62 2.63 lineto +closepath stroke + 4.69 2.66 moveto + 4.63 2.71 lineto +closepath stroke + 4.69 2.66 moveto + 4.76 2.61 lineto +closepath stroke + 4.69 2.66 moveto + 4.68 2.74 lineto +closepath stroke + 4.69 2.66 moveto + 4.75 2.71 lineto +closepath stroke + 4.83 2.56 moveto + 4.80 2.45 lineto +closepath stroke + 4.83 2.56 moveto + 4.74 2.52 lineto +closepath stroke + 4.83 2.56 moveto + 4.76 2.61 lineto +closepath stroke + 4.83 2.56 moveto + 4.90 2.51 lineto +closepath stroke + 4.83 2.56 moveto + 4.82 2.66 lineto +closepath stroke + 4.83 2.56 moveto + 4.90 2.63 lineto +closepath stroke + 4.98 2.45 moveto + 4.94 2.33 lineto +closepath stroke + 4.98 2.45 moveto + 4.87 2.40 lineto +closepath stroke + 4.98 2.45 moveto + 4.90 2.51 lineto +closepath stroke + 4.98 2.45 moveto + 5.06 2.39 lineto +closepath stroke + 4.98 2.45 moveto + 4.97 2.57 lineto +closepath stroke + 4.98 2.45 moveto + 5.06 2.53 lineto +closepath stroke + 5.14 2.33 moveto + 5.09 2.19 lineto +closepath stroke + 5.14 2.33 moveto + 5.02 2.27 lineto +closepath stroke + 5.14 2.33 moveto + 5.06 2.39 lineto +closepath stroke + 5.14 2.33 moveto + 5.23 2.27 lineto +closepath stroke + 5.14 2.33 moveto + 5.14 2.47 lineto +closepath stroke + 5.14 2.33 moveto + 5.24 2.43 lineto +closepath stroke + 5.32 2.20 moveto + 5.26 2.03 lineto +closepath stroke + 5.32 2.20 moveto + 5.18 2.12 lineto +closepath stroke + 5.32 2.20 moveto + 5.23 2.27 lineto +closepath stroke + 5.32 2.20 moveto + 5.42 2.13 lineto +closepath stroke + 5.32 2.20 moveto + 5.33 2.36 lineto +closepath stroke + 5.32 2.20 moveto + 5.44 2.31 lineto +closepath stroke + 5.52 2.06 moveto + 5.45 1.86 lineto +closepath stroke + 5.52 2.06 moveto + 5.36 1.96 lineto +closepath stroke + 5.52 2.06 moveto + 5.42 2.13 lineto +closepath stroke + 5.52 2.06 moveto + 5.63 1.98 lineto +closepath stroke + 5.52 2.06 moveto + 5.54 2.24 lineto +closepath stroke + 5.52 2.06 moveto + 5.76 2.19 lineto +closepath stroke + 5.74 1.90 moveto + 5.65 1.68 lineto +closepath stroke + 5.74 1.90 moveto + 5.56 1.78 lineto +closepath stroke + 5.74 1.90 moveto + 5.63 1.98 lineto +closepath stroke + 5.74 1.90 moveto + 5.87 1.90 lineto +closepath stroke + 5.74 1.90 moveto + 5.87 2.11 lineto +closepath stroke + 6.00 1.90 moveto + 6.00 1.56 lineto +closepath stroke + 6.00 1.90 moveto + 5.78 1.68 lineto +closepath stroke + 6.00 1.90 moveto + 5.87 1.90 lineto +closepath stroke + 6.00 1.90 moveto + 6.00 2.11 lineto +closepath stroke + 4.53 2.88 moveto + 4.55 2.82 lineto +closepath stroke + 4.53 2.88 moveto + 4.49 2.86 lineto +closepath stroke + 4.53 2.88 moveto + 4.60 2.85 lineto +closepath stroke + 4.53 2.88 moveto + 4.56 2.91 lineto +closepath stroke + 4.66 2.82 moveto + 4.62 2.88 lineto +closepath stroke + 4.66 2.82 moveto + 4.70 2.87 lineto +closepath stroke + 4.66 2.82 moveto + 4.68 2.74 lineto +closepath stroke + 4.66 2.82 moveto + 4.61 2.79 lineto +closepath stroke + 4.66 2.82 moveto + 4.60 2.85 lineto +closepath stroke + 4.66 2.82 moveto + 4.74 2.79 lineto +closepath stroke + 4.81 2.76 moveto + 4.77 2.83 lineto +closepath stroke + 4.81 2.76 moveto + 4.85 2.82 lineto +closepath stroke + 4.81 2.76 moveto + 4.89 2.72 lineto +closepath stroke + 4.81 2.76 moveto + 4.82 2.66 lineto +closepath stroke + 4.81 2.76 moveto + 4.75 2.71 lineto +closepath stroke + 4.81 2.76 moveto + 4.74 2.79 lineto +closepath stroke + 4.97 2.69 moveto + 4.93 2.78 lineto +closepath stroke + 4.97 2.69 moveto + 5.02 2.76 lineto +closepath stroke + 4.97 2.69 moveto + 5.06 2.65 lineto +closepath stroke + 4.97 2.69 moveto + 4.89 2.72 lineto +closepath stroke + 4.97 2.69 moveto + 4.97 2.57 lineto +closepath stroke + 4.97 2.69 moveto + 4.90 2.63 lineto +closepath stroke + 5.15 2.61 moveto + 5.10 2.72 lineto +closepath stroke + 5.15 2.61 moveto + 5.20 2.70 lineto +closepath stroke + 5.15 2.61 moveto + 5.24 2.56 lineto +closepath stroke + 5.15 2.61 moveto + 5.06 2.65 lineto +closepath stroke + 5.15 2.61 moveto + 5.14 2.47 lineto +closepath stroke + 5.15 2.61 moveto + 5.06 2.53 lineto +closepath stroke + 5.34 2.52 moveto + 5.30 2.66 lineto +closepath stroke + 5.34 2.52 moveto + 5.41 2.64 lineto +closepath stroke + 5.34 2.52 moveto + 5.45 2.47 lineto +closepath stroke + 5.34 2.52 moveto + 5.24 2.56 lineto +closepath stroke + 5.34 2.52 moveto + 5.33 2.36 lineto +closepath stroke + 5.34 2.52 moveto + 5.24 2.43 lineto +closepath stroke + 5.55 2.43 moveto + 5.51 2.59 lineto +closepath stroke + 5.55 2.43 moveto + 5.63 2.56 lineto +closepath stroke + 5.55 2.43 moveto + 5.78 2.37 lineto +closepath stroke + 5.55 2.43 moveto + 5.45 2.47 lineto +closepath stroke + 5.55 2.43 moveto + 5.54 2.24 lineto +closepath stroke + 5.55 2.43 moveto + 5.44 2.31 lineto +closepath stroke + 6.00 2.32 moveto + 5.85 2.51 lineto +closepath stroke + 6.00 2.32 moveto + 6.00 2.51 lineto +closepath stroke + 6.00 2.32 moveto + 5.78 2.37 lineto +closepath stroke + 6.00 2.32 moveto + 6.00 2.11 lineto +closepath stroke + 6.00 2.32 moveto + 5.87 2.11 lineto +closepath stroke + 6.00 2.32 moveto + 5.76 2.19 lineto +closepath stroke + 4.58 2.94 moveto + 4.59 2.97 lineto +closepath stroke + 4.58 2.94 moveto + 4.65 2.92 lineto +closepath stroke + 4.58 2.94 moveto + 4.62 2.88 lineto +closepath stroke + 4.58 2.94 moveto + 4.56 2.91 lineto +closepath stroke + 4.73 2.91 moveto + 4.74 2.95 lineto +closepath stroke + 4.73 2.91 moveto + 4.81 2.89 lineto +closepath stroke + 4.73 2.91 moveto + 4.77 2.83 lineto +closepath stroke + 4.73 2.91 moveto + 4.66 2.95 lineto +closepath stroke + 4.73 2.91 moveto + 4.65 2.92 lineto +closepath stroke + 4.73 2.91 moveto + 4.70 2.87 lineto +closepath stroke + 4.89 2.87 moveto + 4.90 2.94 lineto +closepath stroke + 4.89 2.87 moveto + 4.98 2.85 lineto +closepath stroke + 4.89 2.87 moveto + 4.93 2.78 lineto +closepath stroke + 4.89 2.87 moveto + 4.82 2.94 lineto +closepath stroke + 4.89 2.87 moveto + 4.81 2.89 lineto +closepath stroke + 4.89 2.87 moveto + 4.85 2.82 lineto +closepath stroke + 5.06 2.84 moveto + 5.08 2.92 lineto +closepath stroke + 5.06 2.84 moveto + 5.16 2.82 lineto +closepath stroke + 5.06 2.84 moveto + 5.10 2.72 lineto +closepath stroke + 5.06 2.84 moveto + 4.99 2.92 lineto +closepath stroke + 5.06 2.84 moveto + 4.98 2.85 lineto +closepath stroke + 5.06 2.84 moveto + 5.02 2.76 lineto +closepath stroke + 5.26 2.79 moveto + 5.28 2.90 lineto +closepath stroke + 5.26 2.79 moveto + 5.36 2.77 lineto +closepath stroke + 5.26 2.79 moveto + 5.30 2.66 lineto +closepath stroke + 5.26 2.79 moveto + 5.18 2.90 lineto +closepath stroke + 5.26 2.79 moveto + 5.16 2.82 lineto +closepath stroke + 5.26 2.79 moveto + 5.20 2.70 lineto +closepath stroke + 5.47 2.75 moveto + 5.49 2.87 lineto +closepath stroke + 5.47 2.75 moveto + 5.59 2.72 lineto +closepath stroke + 5.47 2.75 moveto + 5.51 2.59 lineto +closepath stroke + 5.47 2.75 moveto + 5.38 2.87 lineto +closepath stroke + 5.47 2.75 moveto + 5.36 2.77 lineto +closepath stroke + 5.47 2.75 moveto + 5.41 2.64 lineto +closepath stroke + 5.70 2.70 moveto + 5.85 2.85 lineto +closepath stroke + 5.70 2.70 moveto + 5.85 2.70 lineto +closepath stroke + 5.70 2.70 moveto + 5.85 2.51 lineto +closepath stroke + 5.70 2.70 moveto + 5.61 2.85 lineto +closepath stroke + 5.70 2.70 moveto + 5.59 2.72 lineto +closepath stroke + 5.70 2.70 moveto + 5.63 2.56 lineto +closepath stroke + 6.00 2.70 moveto + 5.85 2.70 lineto +closepath stroke + 6.00 2.70 moveto + 6.00 2.85 lineto +closepath stroke + 6.00 2.70 moveto + 6.00 2.51 lineto +closepath stroke + 4.66 3.05 moveto + 4.74 3.05 lineto +closepath stroke + 4.66 3.05 moveto + 4.68 3.00 lineto +closepath stroke + 4.66 3.05 moveto + 4.59 3.03 lineto +closepath stroke + 4.66 3.05 moveto + 4.65 3.08 lineto +closepath stroke + 4.74 3.05 moveto + 4.68 3.00 lineto +closepath stroke + 4.74 3.05 moveto + 4.81 3.11 lineto +closepath stroke + 4.74 3.05 moveto + 4.82 3.06 lineto +closepath stroke + 4.68 3.00 moveto + 4.74 2.95 lineto +closepath stroke + 4.68 3.00 moveto + 4.66 2.95 lineto +closepath stroke + 4.59 3.03 moveto + 4.65 3.08 lineto +closepath stroke + 4.65 3.08 moveto + 4.62 3.12 lineto +closepath stroke + 4.65 3.08 moveto + 4.70 3.13 lineto +closepath stroke + 4.82 3.06 moveto + 4.90 3.06 lineto +closepath stroke + 4.82 3.06 moveto + 4.83 3.00 lineto +closepath stroke + 4.82 3.06 moveto + 4.81 3.11 lineto +closepath stroke + 4.90 3.06 moveto + 4.83 3.00 lineto +closepath stroke + 4.90 3.06 moveto + 4.98 3.15 lineto +closepath stroke + 4.90 3.06 moveto + 4.99 3.08 lineto +closepath stroke + 4.83 3.00 moveto + 4.90 2.94 lineto +closepath stroke + 4.83 3.00 moveto + 4.82 2.94 lineto +closepath stroke + 4.81 3.11 moveto + 4.77 3.17 lineto +closepath stroke + 4.81 3.11 moveto + 4.85 3.18 lineto +closepath stroke + 4.99 3.08 moveto + 5.08 3.08 lineto +closepath stroke + 4.99 3.08 moveto + 5.01 3.00 lineto +closepath stroke + 4.99 3.08 moveto + 4.98 3.15 lineto +closepath stroke + 5.08 3.08 moveto + 5.01 3.00 lineto +closepath stroke + 5.08 3.08 moveto + 5.16 3.18 lineto +closepath stroke + 5.08 3.08 moveto + 5.18 3.10 lineto +closepath stroke + 5.01 3.00 moveto + 5.08 2.92 lineto +closepath stroke + 5.01 3.00 moveto + 4.99 2.92 lineto +closepath stroke + 4.98 3.15 moveto + 4.93 3.22 lineto +closepath stroke + 4.98 3.15 moveto + 5.02 3.24 lineto +closepath stroke + 5.18 3.10 moveto + 5.28 3.10 lineto +closepath stroke + 5.18 3.10 moveto + 5.20 3.00 lineto +closepath stroke + 5.18 3.10 moveto + 5.16 3.18 lineto +closepath stroke + 5.28 3.10 moveto + 5.20 3.00 lineto +closepath stroke + 5.28 3.10 moveto + 5.36 3.23 lineto +closepath stroke + 5.28 3.10 moveto + 5.38 3.13 lineto +closepath stroke + 5.20 3.00 moveto + 5.28 2.90 lineto +closepath stroke + 5.20 3.00 moveto + 5.18 2.90 lineto +closepath stroke + 5.16 3.18 moveto + 5.10 3.28 lineto +closepath stroke + 5.16 3.18 moveto + 5.20 3.30 lineto +closepath stroke + 5.38 3.13 moveto + 5.49 3.13 lineto +closepath stroke + 5.38 3.13 moveto + 5.41 3.00 lineto +closepath stroke + 5.38 3.13 moveto + 5.36 3.23 lineto +closepath stroke + 5.49 3.13 moveto + 5.41 3.00 lineto +closepath stroke + 5.49 3.13 moveto + 5.59 3.28 lineto +closepath stroke + 5.49 3.13 moveto + 5.61 3.15 lineto +closepath stroke + 5.41 3.00 moveto + 5.49 2.87 lineto +closepath stroke + 5.41 3.00 moveto + 5.38 2.87 lineto +closepath stroke + 5.36 3.23 moveto + 5.30 3.34 lineto +closepath stroke + 5.36 3.23 moveto + 5.41 3.36 lineto +closepath stroke + 5.61 3.15 moveto + 5.85 3.15 lineto +closepath stroke + 5.61 3.15 moveto + 5.76 3.00 lineto +closepath stroke + 5.61 3.15 moveto + 5.59 3.28 lineto +closepath stroke + 5.85 3.15 moveto + 5.76 3.00 lineto +closepath stroke + 5.85 3.15 moveto + 5.85 3.30 lineto +closepath stroke + 5.85 3.15 moveto + 6.00 3.15 lineto +closepath stroke + 5.76 3.00 moveto + 5.85 2.85 lineto +closepath stroke + 5.76 3.00 moveto + 5.61 2.85 lineto +closepath stroke + 5.59 3.28 moveto + 5.51 3.41 lineto +closepath stroke + 5.59 3.28 moveto + 5.63 3.44 lineto +closepath stroke + 5.85 3.30 moveto + 6.00 3.15 lineto +closepath stroke + 5.85 3.30 moveto + 5.85 3.49 lineto +closepath stroke + 5.85 3.30 moveto + 6.00 3.49 lineto +closepath stroke + 4.62 3.12 moveto + 4.70 3.13 lineto +closepath stroke + 4.62 3.12 moveto + 4.56 3.09 lineto +closepath stroke + 4.62 3.12 moveto + 4.60 3.15 lineto +closepath stroke + 4.70 3.13 moveto + 4.74 3.21 lineto +closepath stroke + 4.70 3.13 moveto + 4.77 3.17 lineto +closepath stroke + 4.56 3.09 moveto + 4.60 3.15 lineto +closepath stroke + 4.60 3.15 moveto + 4.55 3.18 lineto +closepath stroke + 4.60 3.15 moveto + 4.61 3.21 lineto +closepath stroke + 4.77 3.17 moveto + 4.85 3.18 lineto +closepath stroke + 4.77 3.17 moveto + 4.74 3.21 lineto +closepath stroke + 4.85 3.18 moveto + 4.89 3.28 lineto +closepath stroke + 4.85 3.18 moveto + 4.93 3.22 lineto +closepath stroke + 4.74 3.21 moveto + 4.68 3.26 lineto +closepath stroke + 4.74 3.21 moveto + 4.75 3.29 lineto +closepath stroke + 4.93 3.22 moveto + 5.02 3.24 lineto +closepath stroke + 4.93 3.22 moveto + 4.89 3.28 lineto +closepath stroke + 5.02 3.24 moveto + 5.06 3.35 lineto +closepath stroke + 5.02 3.24 moveto + 5.10 3.28 lineto +closepath stroke + 4.89 3.28 moveto + 4.82 3.34 lineto +closepath stroke + 4.89 3.28 moveto + 4.90 3.37 lineto +closepath stroke + 5.10 3.28 moveto + 5.20 3.30 lineto +closepath stroke + 5.10 3.28 moveto + 5.06 3.35 lineto +closepath stroke + 5.20 3.30 moveto + 5.24 3.44 lineto +closepath stroke + 5.20 3.30 moveto + 5.30 3.34 lineto +closepath stroke + 5.06 3.35 moveto + 4.97 3.43 lineto +closepath stroke + 5.06 3.35 moveto + 5.06 3.47 lineto +closepath stroke + 5.30 3.34 moveto + 5.41 3.36 lineto +closepath stroke + 5.30 3.34 moveto + 5.24 3.44 lineto +closepath stroke + 5.41 3.36 moveto + 5.45 3.53 lineto +closepath stroke + 5.41 3.36 moveto + 5.51 3.41 lineto +closepath stroke + 5.24 3.44 moveto + 5.14 3.53 lineto +closepath stroke + 5.24 3.44 moveto + 5.24 3.57 lineto +closepath stroke + 5.51 3.41 moveto + 5.63 3.44 lineto +closepath stroke + 5.51 3.41 moveto + 5.45 3.53 lineto +closepath stroke + 5.63 3.44 moveto + 5.78 3.63 lineto +closepath stroke + 5.63 3.44 moveto + 5.85 3.49 lineto +closepath stroke + 5.45 3.53 moveto + 5.33 3.64 lineto +closepath stroke + 5.45 3.53 moveto + 5.44 3.69 lineto +closepath stroke + 5.85 3.49 moveto + 6.00 3.49 lineto +closepath stroke + 5.85 3.49 moveto + 5.78 3.63 lineto +closepath stroke + 5.78 3.63 moveto + 5.54 3.76 lineto +closepath stroke + 5.78 3.63 moveto + 5.76 3.81 lineto +closepath stroke + 4.55 3.18 moveto + 4.61 3.21 lineto +closepath stroke + 4.55 3.18 moveto + 4.49 3.14 lineto +closepath stroke + 4.55 3.18 moveto + 4.51 3.21 lineto +closepath stroke + 4.61 3.21 moveto + 4.63 3.29 lineto +closepath stroke + 4.61 3.21 moveto + 4.68 3.26 lineto +closepath stroke + 4.49 3.14 moveto + 4.51 3.21 lineto +closepath stroke + 4.51 3.21 moveto + 4.50 3.27 lineto +closepath stroke + 4.51 3.21 moveto + 4.45 3.23 lineto +closepath stroke + 4.68 3.26 moveto + 4.75 3.29 lineto +closepath stroke + 4.68 3.26 moveto + 4.63 3.29 lineto +closepath stroke + 4.75 3.29 moveto + 4.76 3.39 lineto +closepath stroke + 4.75 3.29 moveto + 4.82 3.34 lineto +closepath stroke + 4.63 3.29 moveto + 4.62 3.37 lineto +closepath stroke + 4.63 3.29 moveto + 4.55 3.33 lineto +closepath stroke + 4.82 3.34 moveto + 4.90 3.37 lineto +closepath stroke + 4.82 3.34 moveto + 4.76 3.39 lineto +closepath stroke + 4.90 3.37 moveto + 4.90 3.49 lineto +closepath stroke + 4.90 3.37 moveto + 4.97 3.43 lineto +closepath stroke + 4.76 3.39 moveto + 4.74 3.48 lineto +closepath stroke + 4.76 3.39 moveto + 4.67 3.43 lineto +closepath stroke + 4.97 3.43 moveto + 5.06 3.47 lineto +closepath stroke + 4.97 3.43 moveto + 4.90 3.49 lineto +closepath stroke + 5.06 3.47 moveto + 5.06 3.61 lineto +closepath stroke + 5.06 3.47 moveto + 5.14 3.53 lineto +closepath stroke + 4.90 3.49 moveto + 4.80 3.55 lineto +closepath stroke + 4.90 3.49 moveto + 4.87 3.60 lineto +closepath stroke + 5.14 3.53 moveto + 5.24 3.57 lineto +closepath stroke + 5.14 3.53 moveto + 5.06 3.61 lineto +closepath stroke + 5.24 3.57 moveto + 5.23 3.73 lineto +closepath stroke + 5.24 3.57 moveto + 5.33 3.64 lineto +closepath stroke + 5.06 3.61 moveto + 4.94 3.67 lineto +closepath stroke + 5.06 3.61 moveto + 5.02 3.73 lineto +closepath stroke + 5.33 3.64 moveto + 5.44 3.69 lineto +closepath stroke + 5.33 3.64 moveto + 5.23 3.73 lineto +closepath stroke + 5.44 3.69 moveto + 5.42 3.87 lineto +closepath stroke + 5.44 3.69 moveto + 5.54 3.76 lineto +closepath stroke + 5.23 3.73 moveto + 5.09 3.81 lineto +closepath stroke + 5.23 3.73 moveto + 5.18 3.88 lineto +closepath stroke + 5.54 3.76 moveto + 5.76 3.81 lineto +closepath stroke + 5.54 3.76 moveto + 5.42 3.87 lineto +closepath stroke + 5.76 3.81 moveto + 5.63 4.02 lineto +closepath stroke + 5.76 3.81 moveto + 5.87 3.89 lineto +closepath stroke + 5.42 3.87 moveto + 5.26 3.97 lineto +closepath stroke + 5.42 3.87 moveto + 5.36 4.04 lineto +closepath stroke + 5.63 4.02 moveto + 5.87 3.89 lineto +closepath stroke + 5.63 4.02 moveto + 5.45 4.14 lineto +closepath stroke + 5.63 4.02 moveto + 5.56 4.22 lineto +closepath stroke + 5.87 3.89 moveto + 5.87 4.10 lineto +closepath stroke + 5.87 3.89 moveto + 6.00 3.89 lineto +closepath stroke + 5.87 4.10 moveto + 6.00 3.89 lineto +closepath stroke + 5.87 4.10 moveto + 5.65 4.32 lineto +closepath stroke + 5.87 4.10 moveto + 5.78 4.32 lineto +closepath stroke + 4.50 3.27 moveto + 4.45 3.23 lineto +closepath stroke + 4.50 3.27 moveto + 4.49 3.35 lineto +closepath stroke + 4.50 3.27 moveto + 4.55 3.33 lineto +closepath stroke + 4.45 3.23 moveto + 4.40 3.25 lineto +closepath stroke + 4.45 3.23 moveto + 4.40 3.18 lineto +closepath stroke + 4.40 3.25 moveto + 4.40 3.18 lineto +closepath stroke + 4.40 3.25 moveto + 4.38 3.31 lineto +closepath stroke + 4.40 3.25 moveto + 4.34 3.26 lineto +closepath stroke + 4.62 3.37 moveto + 4.55 3.33 lineto +closepath stroke + 4.62 3.37 moveto + 4.60 3.46 lineto +closepath stroke + 4.62 3.37 moveto + 4.67 3.43 lineto +closepath stroke + 4.55 3.33 moveto + 4.49 3.35 lineto +closepath stroke + 4.49 3.35 moveto + 4.46 3.43 lineto +closepath stroke + 4.49 3.35 moveto + 4.41 3.37 lineto +closepath stroke + 4.74 3.48 moveto + 4.67 3.43 lineto +closepath stroke + 4.74 3.48 moveto + 4.71 3.59 lineto +closepath stroke + 4.74 3.48 moveto + 4.80 3.55 lineto +closepath stroke + 4.67 3.43 moveto + 4.60 3.46 lineto +closepath stroke + 4.60 3.46 moveto + 4.55 3.55 lineto +closepath stroke + 4.60 3.46 moveto + 4.50 3.49 lineto +closepath stroke + 4.80 3.55 moveto + 4.87 3.60 lineto +closepath stroke + 4.80 3.55 moveto + 4.71 3.59 lineto +closepath stroke + 4.87 3.60 moveto + 4.83 3.73 lineto +closepath stroke + 4.87 3.60 moveto + 4.94 3.67 lineto +closepath stroke + 4.71 3.59 moveto + 4.66 3.69 lineto +closepath stroke + 4.71 3.59 moveto + 4.60 3.62 lineto +closepath stroke + 4.94 3.67 moveto + 5.02 3.73 lineto +closepath stroke + 4.94 3.67 moveto + 4.83 3.73 lineto +closepath stroke + 5.02 3.73 moveto + 4.97 3.88 lineto +closepath stroke + 5.02 3.73 moveto + 5.09 3.81 lineto +closepath stroke + 4.83 3.73 moveto + 4.77 3.84 lineto +closepath stroke + 4.83 3.73 moveto + 4.70 3.77 lineto +closepath stroke + 5.09 3.81 moveto + 5.18 3.88 lineto +closepath stroke + 5.09 3.81 moveto + 4.97 3.88 lineto +closepath stroke + 5.18 3.88 moveto + 5.12 4.05 lineto +closepath stroke + 5.18 3.88 moveto + 5.26 3.97 lineto +closepath stroke + 4.97 3.88 moveto + 4.89 4.01 lineto +closepath stroke + 4.97 3.88 moveto + 4.82 3.93 lineto +closepath stroke + 5.26 3.97 moveto + 5.36 4.04 lineto +closepath stroke + 5.26 3.97 moveto + 5.12 4.05 lineto +closepath stroke + 5.36 4.04 moveto + 5.29 4.23 lineto +closepath stroke + 5.36 4.04 moveto + 5.45 4.14 lineto +closepath stroke + 5.12 4.05 moveto + 5.02 4.19 lineto +closepath stroke + 5.12 4.05 moveto + 4.95 4.11 lineto +closepath stroke + 5.45 4.14 moveto + 5.56 4.22 lineto +closepath stroke + 5.45 4.14 moveto + 5.29 4.23 lineto +closepath stroke + 5.56 4.22 moveto + 5.47 4.43 lineto +closepath stroke + 5.56 4.22 moveto + 5.65 4.32 lineto +closepath stroke + 5.29 4.23 moveto + 5.09 4.30 lineto +closepath stroke + 5.29 4.23 moveto + 5.17 4.40 lineto +closepath stroke + 5.65 4.32 moveto + 5.78 4.32 lineto +closepath stroke + 5.65 4.32 moveto + 5.47 4.43 lineto +closepath stroke + 5.78 4.32 moveto + 5.78 4.66 lineto +closepath stroke + 5.78 4.32 moveto + 6.00 4.44 lineto +closepath stroke + 5.47 4.43 moveto + 5.24 4.51 lineto +closepath stroke + 5.47 4.43 moveto + 5.33 4.62 lineto +closepath stroke + 5.78 4.66 moveto + 6.00 4.44 lineto +closepath stroke + 5.78 4.66 moveto + 5.49 4.89 lineto +closepath stroke + 5.78 4.66 moveto + 5.71 5.00 lineto +closepath stroke + 4.38 3.31 moveto + 4.34 3.26 lineto +closepath stroke + 4.38 3.31 moveto + 4.35 3.39 lineto +closepath stroke + 4.38 3.31 moveto + 4.41 3.37 lineto +closepath stroke + 4.34 3.26 moveto + 4.28 3.27 lineto +closepath stroke + 4.34 3.26 moveto + 4.30 3.21 lineto +closepath stroke + 4.28 3.27 moveto + 4.30 3.21 lineto +closepath stroke + 4.28 3.27 moveto + 4.25 3.33 lineto +closepath stroke + 4.28 3.27 moveto + 4.22 3.28 lineto +closepath stroke + 4.46 3.43 moveto + 4.41 3.37 lineto +closepath stroke + 4.46 3.43 moveto + 4.42 3.51 lineto +closepath stroke + 4.46 3.43 moveto + 4.50 3.49 lineto +closepath stroke + 4.41 3.37 moveto + 4.35 3.39 lineto +closepath stroke + 4.35 3.39 moveto + 4.30 3.46 lineto +closepath stroke + 4.35 3.39 moveto + 4.27 3.40 lineto +closepath stroke + 4.55 3.55 moveto + 4.50 3.49 lineto +closepath stroke + 4.55 3.55 moveto + 4.50 3.65 lineto +closepath stroke + 4.55 3.55 moveto + 4.60 3.62 lineto +closepath stroke + 4.50 3.49 moveto + 4.42 3.51 lineto +closepath stroke + 4.42 3.51 moveto + 4.36 3.59 lineto +closepath stroke + 4.42 3.51 moveto + 4.33 3.53 lineto +closepath stroke + 4.66 3.69 moveto + 4.60 3.62 lineto +closepath stroke + 4.66 3.69 moveto + 4.59 3.80 lineto +closepath stroke + 4.66 3.69 moveto + 4.70 3.77 lineto +closepath stroke + 4.60 3.62 moveto + 4.50 3.65 lineto +closepath stroke + 4.50 3.65 moveto + 4.43 3.74 lineto +closepath stroke + 4.50 3.65 moveto + 4.39 3.67 lineto +closepath stroke + 4.77 3.84 moveto + 4.70 3.77 lineto +closepath stroke + 4.77 3.84 moveto + 4.69 3.97 lineto +closepath stroke + 4.77 3.84 moveto + 4.82 3.93 lineto +closepath stroke + 4.70 3.77 moveto + 4.59 3.80 lineto +closepath stroke + 4.59 3.80 moveto + 4.50 3.90 lineto +closepath stroke + 4.59 3.80 moveto + 4.46 3.82 lineto +closepath stroke + 4.89 4.01 moveto + 4.82 3.93 lineto +closepath stroke + 4.89 4.01 moveto + 4.79 4.15 lineto +closepath stroke + 4.89 4.01 moveto + 4.95 4.11 lineto +closepath stroke + 4.82 3.93 moveto + 4.69 3.97 lineto +closepath stroke + 4.69 3.97 moveto + 4.58 4.08 lineto +closepath stroke + 4.69 3.97 moveto + 4.53 3.99 lineto +closepath stroke + 5.02 4.19 moveto + 4.95 4.11 lineto +closepath stroke + 5.02 4.19 moveto + 4.91 4.36 lineto +closepath stroke + 5.02 4.19 moveto + 5.09 4.30 lineto +closepath stroke + 4.95 4.11 moveto + 4.79 4.15 lineto +closepath stroke + 4.79 4.15 moveto + 4.67 4.28 lineto +closepath stroke + 4.79 4.15 moveto + 4.62 4.18 lineto +closepath stroke + 5.09 4.30 moveto + 5.17 4.40 lineto +closepath stroke + 5.09 4.30 moveto + 4.91 4.36 lineto +closepath stroke + 5.17 4.40 moveto + 5.04 4.58 lineto +closepath stroke + 5.17 4.40 moveto + 5.24 4.51 lineto +closepath stroke + 4.91 4.36 moveto + 4.77 4.50 lineto +closepath stroke + 4.91 4.36 moveto + 4.71 4.39 lineto +closepath stroke + 5.24 4.51 moveto + 5.33 4.62 lineto +closepath stroke + 5.24 4.51 moveto + 5.04 4.58 lineto +closepath stroke + 5.33 4.62 moveto + 5.18 4.83 lineto +closepath stroke + 5.33 4.62 moveto + 5.41 4.75 lineto +closepath stroke + 5.04 4.58 moveto + 4.88 4.73 lineto +closepath stroke + 5.04 4.58 moveto + 4.81 4.62 lineto +closepath stroke + 5.18 4.83 moveto + 5.41 4.75 lineto +closepath stroke + 5.18 4.83 moveto + 5.00 5.00 lineto +closepath stroke + 5.18 4.83 moveto + 4.92 4.87 lineto +closepath stroke + 5.41 4.75 moveto + 5.34 5.10 lineto +closepath stroke + 5.41 4.75 moveto + 5.49 4.89 lineto +closepath stroke + 5.49 4.89 moveto + 5.71 5.00 lineto +closepath stroke + 5.49 4.89 moveto + 5.34 5.10 lineto +closepath stroke + 5.71 5.00 moveto + 5.51 5.39 lineto +closepath stroke + 5.71 5.00 moveto + 5.80 5.16 lineto +closepath stroke + 5.34 5.10 moveto + 5.12 5.29 lineto +closepath stroke + 5.34 5.10 moveto + 5.04 5.14 lineto +closepath stroke + 5.80 5.77 moveto + 6.00 5.39 lineto +closepath stroke + 5.80 5.77 moveto + 5.80 5.16 lineto +closepath stroke + 5.80 5.77 moveto + 5.80 6.00 lineto +closepath stroke + 5.80 5.77 moveto + 5.60 5.77 lineto +closepath stroke + 6.00 5.39 moveto + 5.80 5.16 lineto +closepath stroke + 5.80 5.16 moveto + 5.51 5.39 lineto +closepath stroke + 5.51 5.39 moveto + 5.21 5.44 lineto +closepath stroke + 5.51 5.39 moveto + 5.12 5.29 lineto +closepath stroke + 5.80 6.00 moveto + 5.60 5.77 lineto +closepath stroke + 5.60 5.77 moveto + 5.27 5.77 lineto +closepath stroke + 5.60 5.77 moveto + 5.27 6.00 lineto +closepath stroke + 4.25 3.33 moveto + 4.22 3.28 lineto +closepath stroke + 4.25 3.33 moveto + 4.21 3.40 lineto +closepath stroke + 4.25 3.33 moveto + 4.27 3.40 lineto +closepath stroke + 4.22 3.28 moveto + 4.17 3.28 lineto +closepath stroke + 4.22 3.28 moveto + 4.20 3.22 lineto +closepath stroke + 4.17 3.28 moveto + 4.20 3.22 lineto +closepath stroke + 4.17 3.28 moveto + 4.12 3.34 lineto +closepath stroke + 4.17 3.28 moveto + 4.10 3.29 lineto +closepath stroke + 4.30 3.46 moveto + 4.27 3.40 lineto +closepath stroke + 4.30 3.46 moveto + 4.25 3.53 lineto +closepath stroke + 4.30 3.46 moveto + 4.33 3.53 lineto +closepath stroke + 4.27 3.40 moveto + 4.21 3.40 lineto +closepath stroke + 4.21 3.40 moveto + 4.15 3.47 lineto +closepath stroke + 4.21 3.40 moveto + 4.13 3.41 lineto +closepath stroke + 4.36 3.59 moveto + 4.33 3.53 lineto +closepath stroke + 4.36 3.59 moveto + 4.29 3.68 lineto +closepath stroke + 4.36 3.59 moveto + 4.39 3.67 lineto +closepath stroke + 4.33 3.53 moveto + 4.25 3.53 lineto +closepath stroke + 4.25 3.53 moveto + 4.18 3.61 lineto +closepath stroke + 4.25 3.53 moveto + 4.16 3.54 lineto +closepath stroke + 4.43 3.74 moveto + 4.39 3.67 lineto +closepath stroke + 4.43 3.74 moveto + 4.35 3.84 lineto +closepath stroke + 4.43 3.74 moveto + 4.46 3.82 lineto +closepath stroke + 4.39 3.67 moveto + 4.29 3.68 lineto +closepath stroke + 4.29 3.68 moveto + 4.21 3.76 lineto +closepath stroke + 4.29 3.68 moveto + 4.19 3.68 lineto +closepath stroke + 4.50 3.90 moveto + 4.46 3.82 lineto +closepath stroke + 4.50 3.90 moveto + 4.40 4.01 lineto +closepath stroke + 4.50 3.90 moveto + 4.53 3.99 lineto +closepath stroke + 4.46 3.82 moveto + 4.35 3.84 lineto +closepath stroke + 4.35 3.84 moveto + 4.25 3.93 lineto +closepath stroke + 4.35 3.84 moveto + 4.22 3.84 lineto +closepath stroke + 4.58 4.08 moveto + 4.53 3.99 lineto +closepath stroke + 4.58 4.08 moveto + 4.47 4.21 lineto +closepath stroke + 4.58 4.08 moveto + 4.62 4.18 lineto +closepath stroke + 4.53 3.99 moveto + 4.40 4.01 lineto +closepath stroke + 4.40 4.01 moveto + 4.29 4.11 lineto +closepath stroke + 4.40 4.01 moveto + 4.26 4.02 lineto +closepath stroke + 4.67 4.28 moveto + 4.62 4.18 lineto +closepath stroke + 4.67 4.28 moveto + 4.53 4.42 lineto +closepath stroke + 4.67 4.28 moveto + 4.71 4.39 lineto +closepath stroke + 4.62 4.18 moveto + 4.47 4.21 lineto +closepath stroke + 4.47 4.21 moveto + 4.33 4.31 lineto +closepath stroke + 4.47 4.21 moveto + 4.30 4.21 lineto +closepath stroke + 4.77 4.50 moveto + 4.71 4.39 lineto +closepath stroke + 4.77 4.50 moveto + 4.61 4.65 lineto +closepath stroke + 4.77 4.50 moveto + 4.81 4.62 lineto +closepath stroke + 4.71 4.39 moveto + 4.53 4.42 lineto +closepath stroke + 4.53 4.42 moveto + 4.38 4.54 lineto +closepath stroke + 4.53 4.42 moveto + 4.34 4.43 lineto +closepath stroke + 4.88 4.73 moveto + 4.81 4.62 lineto +closepath stroke + 4.88 4.73 moveto + 4.69 4.91 lineto +closepath stroke + 4.88 4.73 moveto + 4.92 4.87 lineto +closepath stroke + 4.81 4.62 moveto + 4.61 4.65 lineto +closepath stroke + 4.61 4.65 moveto + 4.43 4.78 lineto +closepath stroke + 4.61 4.65 moveto + 4.39 4.66 lineto +closepath stroke + 5.00 5.00 moveto + 4.92 4.87 lineto +closepath stroke + 5.00 5.00 moveto + 4.78 5.19 lineto +closepath stroke + 5.00 5.00 moveto + 5.04 5.14 lineto +closepath stroke + 4.92 4.87 moveto + 4.69 4.91 lineto +closepath stroke + 4.69 4.91 moveto + 4.49 5.05 lineto +closepath stroke + 4.69 4.91 moveto + 4.45 4.92 lineto +closepath stroke + 5.21 5.44 moveto + 5.12 5.29 lineto +closepath stroke + 5.21 5.44 moveto + 5.27 5.77 lineto +closepath stroke + 5.21 5.44 moveto + 4.88 5.67 lineto +closepath stroke + 5.12 5.29 moveto + 5.04 5.14 lineto +closepath stroke + 5.04 5.14 moveto + 4.78 5.19 lineto +closepath stroke + 4.78 5.19 moveto + 4.55 5.35 lineto +closepath stroke + 4.78 5.19 moveto + 4.50 5.20 lineto +closepath stroke + 5.27 5.77 moveto + 4.88 5.67 lineto +closepath stroke + 5.27 5.77 moveto + 5.27 6.00 lineto +closepath stroke + 4.88 5.67 moveto + 4.62 6.00 lineto +closepath stroke + 4.88 5.67 moveto + 4.57 5.67 lineto +closepath stroke + 4.12 3.34 moveto + 4.10 3.29 lineto +closepath stroke + 4.12 3.34 moveto + 4.07 3.41 lineto +closepath stroke + 4.12 3.34 moveto + 4.13 3.41 lineto +closepath stroke + 4.10 3.29 moveto + 4.05 3.29 lineto +closepath stroke + 4.10 3.29 moveto + 4.10 3.23 lineto +closepath stroke + 4.05 3.29 moveto + 4.10 3.23 lineto +closepath stroke + 4.05 3.29 moveto + 4.01 3.29 lineto +closepath stroke + 4.05 3.29 moveto + 4.00 3.23 lineto +closepath stroke + 4.15 3.47 moveto + 4.13 3.41 lineto +closepath stroke + 4.15 3.47 moveto + 4.08 3.54 lineto +closepath stroke + 4.15 3.47 moveto + 4.16 3.54 lineto +closepath stroke + 4.13 3.41 moveto + 4.07 3.41 lineto +closepath stroke + 4.07 3.41 moveto + 4.01 3.41 lineto +closepath stroke + 4.07 3.41 moveto + 4.00 3.34 lineto +closepath stroke + 4.18 3.61 moveto + 4.16 3.54 lineto +closepath stroke + 4.18 3.61 moveto + 4.10 3.69 lineto +closepath stroke + 4.18 3.61 moveto + 4.19 3.68 lineto +closepath stroke + 4.16 3.54 moveto + 4.08 3.54 lineto +closepath stroke + 4.08 3.54 moveto + 4.01 3.54 lineto +closepath stroke + 4.08 3.54 moveto + 4.00 3.47 lineto +closepath stroke + 4.21 3.76 moveto + 4.19 3.68 lineto +closepath stroke + 4.21 3.76 moveto + 4.11 3.85 lineto +closepath stroke + 4.21 3.76 moveto + 4.22 3.84 lineto +closepath stroke + 4.19 3.68 moveto + 4.10 3.69 lineto +closepath stroke + 4.10 3.69 moveto + 4.01 3.69 lineto +closepath stroke + 4.10 3.69 moveto + 4.00 3.61 lineto +closepath stroke + 4.25 3.93 moveto + 4.22 3.84 lineto +closepath stroke + 4.25 3.93 moveto + 4.13 4.02 lineto +closepath stroke + 4.25 3.93 moveto + 4.26 4.02 lineto +closepath stroke + 4.22 3.84 moveto + 4.11 3.85 lineto +closepath stroke + 4.11 3.85 moveto + 4.01 3.85 lineto +closepath stroke + 4.11 3.85 moveto + 4.00 3.76 lineto +closepath stroke + 4.29 4.11 moveto + 4.26 4.02 lineto +closepath stroke + 4.29 4.11 moveto + 4.15 4.22 lineto +closepath stroke + 4.29 4.11 moveto + 4.30 4.21 lineto +closepath stroke + 4.26 4.02 moveto + 4.13 4.02 lineto +closepath stroke + 4.13 4.02 moveto + 4.01 4.02 lineto +closepath stroke + 4.13 4.02 moveto + 4.00 3.93 lineto +closepath stroke + 4.33 4.31 moveto + 4.30 4.21 lineto +closepath stroke + 4.33 4.31 moveto + 4.17 4.43 lineto +closepath stroke + 4.33 4.31 moveto + 4.34 4.43 lineto +closepath stroke + 4.30 4.21 moveto + 4.15 4.22 lineto +closepath stroke + 4.15 4.22 moveto + 4.01 4.22 lineto +closepath stroke + 4.15 4.22 moveto + 4.00 4.12 lineto +closepath stroke + 4.38 4.54 moveto + 4.34 4.43 lineto +closepath stroke + 4.38 4.54 moveto + 4.20 4.67 lineto +closepath stroke + 4.38 4.54 moveto + 4.39 4.66 lineto +closepath stroke + 4.34 4.43 moveto + 4.17 4.43 lineto +closepath stroke + 4.17 4.43 moveto + 4.01 4.43 lineto +closepath stroke + 4.17 4.43 moveto + 4.00 4.32 lineto +closepath stroke + 4.43 4.78 moveto + 4.39 4.66 lineto +closepath stroke + 4.43 4.78 moveto + 4.23 4.93 lineto +closepath stroke + 4.43 4.78 moveto + 4.45 4.92 lineto +closepath stroke + 4.39 4.66 moveto + 4.20 4.67 lineto +closepath stroke + 4.20 4.67 moveto + 4.01 4.67 lineto +closepath stroke + 4.20 4.67 moveto + 4.00 4.54 lineto +closepath stroke + 4.49 5.05 moveto + 4.45 4.92 lineto +closepath stroke + 4.49 5.05 moveto + 4.26 5.21 lineto +closepath stroke + 4.49 5.05 moveto + 4.50 5.20 lineto +closepath stroke + 4.45 4.92 moveto + 4.23 4.93 lineto +closepath stroke + 4.23 4.93 moveto + 4.01 4.93 lineto +closepath stroke + 4.23 4.93 moveto + 4.00 4.79 lineto +closepath stroke + 4.55 5.35 moveto + 4.50 5.20 lineto +closepath stroke + 4.55 5.35 moveto + 4.29 5.68 lineto +closepath stroke + 4.55 5.35 moveto + 4.57 5.67 lineto +closepath stroke + 4.50 5.20 moveto + 4.26 5.21 lineto +closepath stroke + 4.26 5.21 moveto + 4.02 5.21 lineto +closepath stroke + 4.26 5.21 moveto + 4.00 5.06 lineto +closepath stroke + 4.62 6.00 moveto + 4.57 5.67 lineto +closepath stroke + 4.57 5.67 moveto + 4.29 5.68 lineto +closepath stroke + 4.29 5.68 moveto + 4.02 5.68 lineto +closepath stroke + 4.29 5.68 moveto + 4.00 5.36 lineto +closepath stroke + 4.01 3.29 moveto + 4.00 3.23 lineto +closepath stroke + 4.01 3.29 moveto + 3.95 3.29 lineto +closepath stroke + 4.01 3.29 moveto + 4.00 3.34 lineto +closepath stroke + 4.01 3.41 moveto + 4.00 3.34 lineto +closepath stroke + 4.01 3.41 moveto + 3.93 3.41 lineto +closepath stroke + 4.01 3.41 moveto + 4.00 3.47 lineto +closepath stroke + 4.00 3.34 moveto + 3.95 3.29 lineto +closepath stroke + 3.95 3.29 moveto + 3.89 3.29 lineto +closepath stroke + 3.95 3.29 moveto + 3.90 3.23 lineto +closepath stroke + 4.01 3.54 moveto + 4.00 3.47 lineto +closepath stroke + 4.01 3.54 moveto + 3.92 3.54 lineto +closepath stroke + 4.01 3.54 moveto + 4.00 3.61 lineto +closepath stroke + 4.00 3.47 moveto + 3.93 3.41 lineto +closepath stroke + 3.93 3.41 moveto + 3.87 3.41 lineto +closepath stroke + 3.93 3.41 moveto + 3.88 3.35 lineto +closepath stroke + 4.01 3.69 moveto + 4.00 3.61 lineto +closepath stroke + 4.01 3.69 moveto + 3.90 3.69 lineto +closepath stroke + 4.01 3.69 moveto + 4.00 3.76 lineto +closepath stroke + 4.00 3.61 moveto + 3.92 3.54 lineto +closepath stroke + 3.92 3.54 moveto + 3.84 3.54 lineto +closepath stroke + 3.92 3.54 moveto + 3.85 3.47 lineto +closepath stroke + 4.01 3.85 moveto + 4.00 3.76 lineto +closepath stroke + 4.01 3.85 moveto + 3.89 3.85 lineto +closepath stroke + 4.01 3.85 moveto + 4.00 3.93 lineto +closepath stroke + 4.00 3.76 moveto + 3.90 3.69 lineto +closepath stroke + 3.90 3.69 moveto + 3.81 3.69 lineto +closepath stroke + 3.90 3.69 moveto + 3.82 3.61 lineto +closepath stroke + 4.01 4.02 moveto + 4.00 3.93 lineto +closepath stroke + 4.01 4.02 moveto + 3.87 4.02 lineto +closepath stroke + 4.01 4.02 moveto + 4.00 4.12 lineto +closepath stroke + 4.00 3.93 moveto + 3.89 3.85 lineto +closepath stroke + 3.89 3.85 moveto + 3.78 3.85 lineto +closepath stroke + 3.89 3.85 moveto + 3.79 3.77 lineto +closepath stroke + 4.01 4.22 moveto + 4.00 4.12 lineto +closepath stroke + 4.01 4.22 moveto + 3.85 4.22 lineto +closepath stroke + 4.01 4.22 moveto + 4.00 4.32 lineto +closepath stroke + 4.00 4.12 moveto + 3.87 4.02 lineto +closepath stroke + 3.87 4.02 moveto + 3.74 4.03 lineto +closepath stroke + 3.87 4.02 moveto + 3.75 3.94 lineto +closepath stroke + 4.01 4.43 moveto + 4.00 4.32 lineto +closepath stroke + 4.01 4.43 moveto + 3.83 4.43 lineto +closepath stroke + 4.01 4.43 moveto + 4.00 4.54 lineto +closepath stroke + 4.00 4.32 moveto + 3.85 4.22 lineto +closepath stroke + 3.85 4.22 moveto + 3.70 4.22 lineto +closepath stroke + 3.85 4.22 moveto + 3.71 4.12 lineto +closepath stroke + 4.01 4.67 moveto + 4.00 4.54 lineto +closepath stroke + 4.01 4.67 moveto + 3.80 4.67 lineto +closepath stroke + 4.01 4.67 moveto + 4.00 4.79 lineto +closepath stroke + 4.00 4.54 moveto + 3.83 4.43 lineto +closepath stroke + 3.83 4.43 moveto + 3.65 4.44 lineto +closepath stroke + 3.83 4.43 moveto + 3.66 4.33 lineto +closepath stroke + 4.01 4.93 moveto + 4.00 4.79 lineto +closepath stroke + 4.01 4.93 moveto + 3.77 4.93 lineto +closepath stroke + 4.01 4.93 moveto + 4.00 5.06 lineto +closepath stroke + 4.00 4.79 moveto + 3.80 4.67 lineto +closepath stroke + 3.80 4.67 moveto + 3.60 4.67 lineto +closepath stroke + 3.80 4.67 moveto + 3.62 4.55 lineto +closepath stroke + 4.02 5.21 moveto + 4.00 5.06 lineto +closepath stroke + 4.02 5.21 moveto + 3.74 5.21 lineto +closepath stroke + 4.02 5.21 moveto + 4.00 5.36 lineto +closepath stroke + 4.00 5.06 moveto + 3.77 4.93 lineto +closepath stroke + 3.77 4.93 moveto + 3.55 4.93 lineto +closepath stroke + 3.77 4.93 moveto + 3.56 4.80 lineto +closepath stroke + 4.02 5.68 moveto + 4.00 5.36 lineto +closepath stroke + 4.02 5.68 moveto + 4.00 6.00 lineto +closepath stroke + 4.02 5.68 moveto + 3.71 5.68 lineto +closepath stroke + 4.00 5.36 moveto + 3.74 5.21 lineto +closepath stroke + 3.74 5.21 moveto + 3.49 5.22 lineto +closepath stroke + 3.74 5.21 moveto + 3.50 5.07 lineto +closepath stroke + 4.00 6.00 moveto + 3.71 5.68 lineto +closepath stroke + 3.71 5.68 moveto + 3.42 5.69 lineto +closepath stroke + 3.71 5.68 moveto + 3.44 5.37 lineto +closepath stroke + 3.89 3.29 moveto + 3.90 3.23 lineto +closepath stroke + 3.89 3.29 moveto + 3.83 3.29 lineto +closepath stroke + 3.89 3.29 moveto + 3.88 3.35 lineto +closepath stroke + 3.87 3.41 moveto + 3.88 3.35 lineto +closepath stroke + 3.87 3.41 moveto + 3.79 3.41 lineto +closepath stroke + 3.87 3.41 moveto + 3.85 3.47 lineto +closepath stroke + 3.88 3.35 moveto + 3.83 3.29 lineto +closepath stroke + 3.83 3.29 moveto + 3.77 3.29 lineto +closepath stroke + 3.83 3.29 moveto + 3.79 3.23 lineto +closepath stroke + 3.84 3.54 moveto + 3.85 3.47 lineto +closepath stroke + 3.84 3.54 moveto + 3.75 3.54 lineto +closepath stroke + 3.84 3.54 moveto + 3.82 3.61 lineto +closepath stroke + 3.85 3.47 moveto + 3.79 3.41 lineto +closepath stroke + 3.79 3.41 moveto + 3.72 3.41 lineto +closepath stroke + 3.79 3.41 moveto + 3.74 3.35 lineto +closepath stroke + 3.81 3.69 moveto + 3.82 3.61 lineto +closepath stroke + 3.81 3.69 moveto + 3.70 3.69 lineto +closepath stroke + 3.81 3.69 moveto + 3.79 3.77 lineto +closepath stroke + 3.82 3.61 moveto + 3.75 3.54 lineto +closepath stroke + 3.75 3.54 moveto + 3.65 3.55 lineto +closepath stroke + 3.75 3.54 moveto + 3.68 3.48 lineto +closepath stroke + 3.78 3.85 moveto + 3.79 3.77 lineto +closepath stroke + 3.78 3.85 moveto + 3.65 3.85 lineto +closepath stroke + 3.78 3.85 moveto + 3.75 3.94 lineto +closepath stroke + 3.79 3.77 moveto + 3.70 3.69 lineto +closepath stroke + 3.70 3.69 moveto + 3.59 3.70 lineto +closepath stroke + 3.70 3.69 moveto + 3.61 3.62 lineto +closepath stroke + 3.74 4.03 moveto + 3.75 3.94 lineto +closepath stroke + 3.74 4.03 moveto + 3.59 4.03 lineto +closepath stroke + 3.74 4.03 moveto + 3.71 4.12 lineto +closepath stroke + 3.75 3.94 moveto + 3.65 3.85 lineto +closepath stroke + 3.65 3.85 moveto + 3.52 3.86 lineto +closepath stroke + 3.65 3.85 moveto + 3.54 3.78 lineto +closepath stroke + 3.70 4.22 moveto + 3.71 4.12 lineto +closepath stroke + 3.70 4.22 moveto + 3.53 4.23 lineto +closepath stroke + 3.70 4.22 moveto + 3.66 4.33 lineto +closepath stroke + 3.71 4.12 moveto + 3.59 4.03 lineto +closepath stroke + 3.59 4.03 moveto + 3.44 4.04 lineto +closepath stroke + 3.59 4.03 moveto + 3.47 3.95 lineto +closepath stroke + 3.65 4.44 moveto + 3.66 4.33 lineto +closepath stroke + 3.65 4.44 moveto + 3.46 4.44 lineto +closepath stroke + 3.65 4.44 moveto + 3.62 4.55 lineto +closepath stroke + 3.66 4.33 moveto + 3.53 4.23 lineto +closepath stroke + 3.53 4.23 moveto + 3.35 4.24 lineto +closepath stroke + 3.53 4.23 moveto + 3.38 4.14 lineto +closepath stroke + 3.60 4.67 moveto + 3.62 4.55 lineto +closepath stroke + 3.60 4.67 moveto + 3.38 4.68 lineto +closepath stroke + 3.60 4.67 moveto + 3.56 4.80 lineto +closepath stroke + 3.62 4.55 moveto + 3.46 4.44 lineto +closepath stroke + 3.46 4.44 moveto + 3.25 4.46 lineto +closepath stroke + 3.46 4.44 moveto + 3.29 4.34 lineto +closepath stroke + 3.55 4.93 moveto + 3.56 4.80 lineto +closepath stroke + 3.55 4.93 moveto + 3.29 4.94 lineto +closepath stroke + 3.55 4.93 moveto + 3.50 5.07 lineto +closepath stroke + 3.56 4.80 moveto + 3.38 4.68 lineto +closepath stroke + 3.38 4.68 moveto + 3.14 4.69 lineto +closepath stroke + 3.38 4.68 moveto + 3.18 4.57 lineto +closepath stroke + 3.49 5.22 moveto + 3.50 5.07 lineto +closepath stroke + 3.49 5.22 moveto + 3.20 5.23 lineto +closepath stroke + 3.49 5.22 moveto + 3.44 5.37 lineto +closepath stroke + 3.50 5.07 moveto + 3.29 4.94 lineto +closepath stroke + 3.29 4.94 moveto + 3.03 4.96 lineto +closepath stroke + 3.29 4.94 moveto + 3.07 4.82 lineto +closepath stroke + 3.42 5.69 moveto + 3.44 5.37 lineto +closepath stroke + 3.42 5.69 moveto + 3.37 6.00 lineto +closepath stroke + 3.42 5.69 moveto + 3.10 5.69 lineto +closepath stroke + 3.44 5.37 moveto + 3.20 5.23 lineto +closepath stroke + 3.20 5.23 moveto + 2.90 5.25 lineto +closepath stroke + 3.20 5.23 moveto + 2.95 5.10 lineto +closepath stroke + 3.37 6.00 moveto + 3.10 5.69 lineto +closepath stroke + 3.10 5.69 moveto + 2.76 5.71 lineto +closepath stroke + 3.10 5.69 moveto + 2.81 5.40 lineto +closepath stroke + 3.77 3.29 moveto + 3.79 3.23 lineto +closepath stroke + 3.77 3.29 moveto + 3.69 3.29 lineto +closepath stroke + 3.77 3.29 moveto + 3.74 3.35 lineto +closepath stroke + 3.72 3.41 moveto + 3.74 3.35 lineto +closepath stroke + 3.72 3.41 moveto + 3.62 3.42 lineto +closepath stroke + 3.72 3.41 moveto + 3.68 3.48 lineto +closepath stroke + 3.74 3.35 moveto + 3.69 3.29 lineto +closepath stroke + 3.69 3.29 moveto + 3.61 3.30 lineto +closepath stroke + 3.69 3.29 moveto + 3.65 3.24 lineto +closepath stroke + 3.65 3.55 moveto + 3.68 3.48 lineto +closepath stroke + 3.65 3.55 moveto + 3.54 3.55 lineto +closepath stroke + 3.65 3.55 moveto + 3.61 3.62 lineto +closepath stroke + 3.68 3.48 moveto + 3.62 3.42 lineto +closepath stroke + 3.62 3.42 moveto + 3.52 3.42 lineto +closepath stroke + 3.62 3.42 moveto + 3.56 3.36 lineto +closepath stroke + 3.59 3.70 moveto + 3.61 3.62 lineto +closepath stroke + 3.59 3.70 moveto + 3.46 3.70 lineto +closepath stroke + 3.59 3.70 moveto + 3.54 3.78 lineto +closepath stroke + 3.61 3.62 moveto + 3.54 3.55 lineto +closepath stroke + 3.54 3.55 moveto + 3.42 3.56 lineto +closepath stroke + 3.54 3.55 moveto + 3.46 3.49 lineto +closepath stroke + 3.52 3.86 moveto + 3.54 3.78 lineto +closepath stroke + 3.52 3.86 moveto + 3.36 3.87 lineto +closepath stroke + 3.52 3.86 moveto + 3.47 3.95 lineto +closepath stroke + 3.54 3.78 moveto + 3.46 3.70 lineto +closepath stroke + 3.46 3.70 moveto + 3.31 3.71 lineto +closepath stroke + 3.46 3.70 moveto + 3.36 3.63 lineto +closepath stroke + 3.44 4.04 moveto + 3.47 3.95 lineto +closepath stroke + 3.44 4.04 moveto + 3.26 4.05 lineto +closepath stroke + 3.44 4.04 moveto + 3.38 4.14 lineto +closepath stroke + 3.47 3.95 moveto + 3.36 3.87 lineto +closepath stroke + 3.36 3.87 moveto + 3.26 3.80 lineto +closepath stroke + 3.36 3.87 moveto + 3.31 3.71 lineto +closepath stroke + 3.35 4.24 moveto + 3.38 4.14 lineto +closepath stroke + 3.35 4.24 moveto + 3.14 4.25 lineto +closepath stroke + 3.35 4.24 moveto + 3.29 4.34 lineto +closepath stroke + 3.38 4.14 moveto + 3.26 4.05 lineto +closepath stroke + 3.26 4.05 moveto + 3.13 3.97 lineto +closepath stroke + 3.26 4.05 moveto + 3.19 3.88 lineto +closepath stroke + 3.25 4.46 moveto + 3.29 4.34 lineto +closepath stroke + 3.25 4.46 moveto + 3.02 4.47 lineto +closepath stroke + 3.25 4.46 moveto + 3.18 4.57 lineto +closepath stroke + 3.29 4.34 moveto + 3.14 4.25 lineto +closepath stroke + 3.14 4.25 moveto + 3.00 4.16 lineto +closepath stroke + 3.14 4.25 moveto + 3.06 4.06 lineto +closepath stroke + 3.14 4.69 moveto + 3.18 4.57 lineto +closepath stroke + 3.14 4.69 moveto + 2.88 4.71 lineto +closepath stroke + 3.14 4.69 moveto + 3.07 4.82 lineto +closepath stroke + 3.18 4.57 moveto + 3.02 4.47 lineto +closepath stroke + 3.02 4.47 moveto + 2.84 4.37 lineto +closepath stroke + 3.02 4.47 moveto + 2.91 4.26 lineto +closepath stroke + 3.03 4.96 moveto + 3.07 4.82 lineto +closepath stroke + 3.03 4.96 moveto + 2.72 4.98 lineto +closepath stroke + 3.03 4.96 moveto + 2.95 5.10 lineto +closepath stroke + 3.07 4.82 moveto + 2.88 4.71 lineto +closepath stroke + 2.88 4.71 moveto + 2.67 4.61 lineto +closepath stroke + 2.88 4.71 moveto + 2.75 4.48 lineto +closepath stroke + 2.90 5.25 moveto + 2.95 5.10 lineto +closepath stroke + 2.90 5.25 moveto + 2.55 5.27 lineto +closepath stroke + 2.90 5.25 moveto + 2.81 5.40 lineto +closepath stroke + 2.95 5.10 moveto + 2.72 4.98 lineto +closepath stroke + 2.72 4.98 moveto + 2.49 4.86 lineto +closepath stroke + 2.72 4.98 moveto + 2.57 4.72 lineto +closepath stroke + 2.76 5.71 moveto + 2.81 5.40 lineto +closepath stroke + 2.76 5.71 moveto + 2.66 6.00 lineto +closepath stroke + 2.76 5.71 moveto + 2.37 5.71 lineto +closepath stroke + 2.81 5.40 moveto + 2.55 5.27 lineto +closepath stroke + 2.55 5.27 moveto + 2.28 5.14 lineto +closepath stroke + 2.55 5.27 moveto + 2.37 4.99 lineto +closepath stroke + 2.66 6.00 moveto + 2.37 5.71 lineto +closepath stroke + 2.37 5.71 moveto + 1.92 5.73 lineto +closepath stroke + 2.37 5.71 moveto + 2.02 5.44 lineto +closepath stroke + 3.61 3.30 moveto + 3.65 3.24 lineto +closepath stroke + 3.61 3.30 moveto + 3.51 3.30 lineto +closepath stroke + 3.61 3.30 moveto + 3.56 3.36 lineto +closepath stroke + 3.52 3.42 moveto + 3.56 3.36 lineto +closepath stroke + 3.52 3.42 moveto + 3.40 3.43 lineto +closepath stroke + 3.52 3.42 moveto + 3.46 3.49 lineto +closepath stroke + 3.56 3.36 moveto + 3.51 3.30 lineto +closepath stroke + 3.51 3.30 moveto + 3.41 3.30 lineto +closepath stroke + 3.51 3.30 moveto + 3.46 3.24 lineto +closepath stroke + 3.42 3.56 moveto + 3.46 3.49 lineto +closepath stroke + 3.42 3.56 moveto + 3.28 3.56 lineto +closepath stroke + 3.42 3.56 moveto + 3.36 3.63 lineto +closepath stroke + 3.46 3.49 moveto + 3.40 3.43 lineto +closepath stroke + 3.40 3.43 moveto + 3.35 3.36 lineto +closepath stroke + 3.40 3.43 moveto + 3.41 3.30 lineto +closepath stroke + 3.31 3.71 moveto + 3.36 3.63 lineto +closepath stroke + 3.31 3.71 moveto + 3.26 3.80 lineto +closepath stroke + 3.36 3.63 moveto + 3.28 3.56 lineto +closepath stroke + 3.28 3.56 moveto + 3.20 3.49 lineto +closepath stroke + 3.28 3.56 moveto + 3.27 3.42 lineto +closepath stroke + 3.26 3.80 moveto + 3.14 3.72 lineto +closepath stroke + 3.26 3.80 moveto + 3.19 3.88 lineto +closepath stroke + 3.13 3.97 moveto + 3.19 3.88 lineto +closepath stroke + 3.13 3.97 moveto + 2.99 3.88 lineto +closepath stroke + 3.13 3.97 moveto + 3.06 4.06 lineto +closepath stroke + 3.19 3.88 moveto + 3.14 3.72 lineto +closepath stroke + 3.14 3.72 moveto + 3.04 3.64 lineto +closepath stroke + 3.14 3.72 moveto + 3.11 3.56 lineto +closepath stroke + 3.00 4.16 moveto + 3.06 4.06 lineto +closepath stroke + 3.00 4.16 moveto + 2.82 4.07 lineto +closepath stroke + 3.00 4.16 moveto + 2.91 4.26 lineto +closepath stroke + 3.06 4.06 moveto + 2.99 3.88 lineto +closepath stroke + 2.99 3.88 moveto + 2.86 3.80 lineto +closepath stroke + 2.99 3.88 moveto + 2.94 3.71 lineto +closepath stroke + 2.84 4.37 moveto + 2.91 4.26 lineto +closepath stroke + 2.84 4.37 moveto + 2.64 4.27 lineto +closepath stroke + 2.84 4.37 moveto + 2.75 4.48 lineto +closepath stroke + 2.91 4.26 moveto + 2.82 4.07 lineto +closepath stroke + 2.82 4.07 moveto + 2.67 3.97 lineto +closepath stroke + 2.82 4.07 moveto + 2.75 3.88 lineto +closepath stroke + 2.67 4.61 moveto + 2.75 4.48 lineto +closepath stroke + 2.67 4.61 moveto + 2.44 4.49 lineto +closepath stroke + 2.67 4.61 moveto + 2.57 4.72 lineto +closepath stroke + 2.75 4.48 moveto + 2.64 4.27 lineto +closepath stroke + 2.64 4.27 moveto + 2.45 4.17 lineto +closepath stroke + 2.64 4.27 moveto + 2.55 4.06 lineto +closepath stroke + 2.49 4.86 moveto + 2.57 4.72 lineto +closepath stroke + 2.49 4.86 moveto + 2.22 4.74 lineto +closepath stroke + 2.49 4.86 moveto + 2.37 4.99 lineto +closepath stroke + 2.57 4.72 moveto + 2.44 4.49 lineto +closepath stroke + 2.44 4.49 moveto + 2.22 4.38 lineto +closepath stroke + 2.44 4.49 moveto + 2.32 4.26 lineto +closepath stroke + 2.28 5.14 moveto + 2.37 4.99 lineto +closepath stroke + 2.28 5.14 moveto + 1.97 5.01 lineto +closepath stroke + 2.28 5.14 moveto + 2.16 5.29 lineto +closepath stroke + 2.37 4.99 moveto + 2.22 4.74 lineto +closepath stroke + 2.22 4.74 moveto + 1.96 4.61 lineto +closepath stroke + 2.22 4.74 moveto + 2.07 4.48 lineto +closepath stroke + 1.97 5.01 moveto + 2.16 5.29 lineto +closepath stroke + 1.97 5.01 moveto + 1.67 4.87 lineto +closepath stroke + 1.97 5.01 moveto + 1.80 4.72 lineto +closepath stroke + 2.16 5.29 moveto + 1.71 5.31 lineto +closepath stroke + 2.16 5.29 moveto + 2.02 5.44 lineto +closepath stroke + 1.92 5.73 moveto + 2.02 5.44 lineto +closepath stroke + 1.92 5.73 moveto + 1.77 6.00 lineto +closepath stroke + 1.92 5.73 moveto + 1.41 5.73 lineto +closepath stroke + 2.02 5.44 moveto + 1.71 5.31 lineto +closepath stroke + 1.71 5.31 moveto + 1.36 5.15 lineto +closepath stroke + 1.71 5.31 moveto + 1.50 4.99 lineto +closepath stroke + 1.77 6.00 moveto + 1.41 5.73 lineto +closepath stroke + 1.41 5.73 moveto + 1.02 5.56 lineto +closepath stroke + 1.41 5.73 moveto + 1.17 5.29 lineto +closepath stroke + 3.41 3.30 moveto + 3.46 3.24 lineto +closepath stroke + 3.41 3.30 moveto + 3.35 3.36 lineto +closepath stroke + 3.35 3.36 moveto + 3.27 3.29 lineto +closepath stroke + 3.35 3.36 moveto + 3.27 3.42 lineto +closepath stroke + 3.20 3.49 moveto + 3.27 3.42 lineto +closepath stroke + 3.20 3.49 moveto + 3.10 3.42 lineto +closepath stroke + 3.20 3.49 moveto + 3.11 3.56 lineto +closepath stroke + 3.27 3.42 moveto + 3.27 3.29 lineto +closepath stroke + 3.27 3.29 moveto + 3.13 3.28 lineto +closepath stroke + 3.27 3.29 moveto + 3.21 3.22 lineto +closepath stroke + 3.04 3.64 moveto + 3.11 3.56 lineto +closepath stroke + 3.04 3.64 moveto + 2.91 3.55 lineto +closepath stroke + 3.04 3.64 moveto + 2.94 3.71 lineto +closepath stroke + 3.11 3.56 moveto + 3.10 3.42 lineto +closepath stroke + 3.10 3.42 moveto + 3.04 3.35 lineto +closepath stroke + 3.10 3.42 moveto + 3.13 3.28 lineto +closepath stroke + 2.86 3.80 moveto + 2.94 3.71 lineto +closepath stroke + 2.86 3.80 moveto + 2.71 3.70 lineto +closepath stroke + 2.86 3.80 moveto + 2.75 3.88 lineto +closepath stroke + 2.94 3.71 moveto + 2.91 3.55 lineto +closepath stroke + 2.91 3.55 moveto + 2.82 3.47 lineto +closepath stroke + 2.91 3.55 moveto + 2.92 3.40 lineto +closepath stroke + 2.67 3.97 moveto + 2.75 3.88 lineto +closepath stroke + 2.67 3.97 moveto + 2.48 3.87 lineto +closepath stroke + 2.67 3.97 moveto + 2.55 4.06 lineto +closepath stroke + 2.75 3.88 moveto + 2.71 3.70 lineto +closepath stroke + 2.71 3.70 moveto + 2.59 3.60 lineto +closepath stroke + 2.71 3.70 moveto + 2.70 3.53 lineto +closepath stroke + 2.45 4.17 moveto + 2.55 4.06 lineto +closepath stroke + 2.45 4.17 moveto + 2.23 4.05 lineto +closepath stroke + 2.45 4.17 moveto + 2.32 4.26 lineto +closepath stroke + 2.55 4.06 moveto + 2.48 3.87 lineto +closepath stroke + 2.48 3.87 moveto + 2.33 3.75 lineto +closepath stroke + 2.48 3.87 moveto + 2.45 3.67 lineto +closepath stroke + 2.22 4.38 moveto + 2.32 4.26 lineto +closepath stroke + 2.22 4.38 moveto + 1.96 4.25 lineto +closepath stroke + 2.22 4.38 moveto + 2.07 4.48 lineto +closepath stroke + 2.32 4.26 moveto + 2.23 4.05 lineto +closepath stroke + 2.23 4.05 moveto + 2.04 3.92 lineto +closepath stroke + 2.23 4.05 moveto + 2.17 3.82 lineto +closepath stroke + 1.96 4.61 moveto + 2.07 4.48 lineto +closepath stroke + 1.96 4.61 moveto + 1.66 4.47 lineto +closepath stroke + 1.96 4.61 moveto + 1.80 4.72 lineto +closepath stroke + 2.07 4.48 moveto + 1.96 4.25 lineto +closepath stroke + 1.96 4.25 moveto + 1.73 4.10 lineto +closepath stroke + 1.96 4.25 moveto + 1.87 3.99 lineto +closepath stroke + 1.67 4.87 moveto + 1.80 4.72 lineto +closepath stroke + 1.67 4.87 moveto + 1.33 4.71 lineto +closepath stroke + 1.67 4.87 moveto + 1.50 4.99 lineto +closepath stroke + 1.80 4.72 moveto + 1.66 4.47 lineto +closepath stroke + 1.66 4.47 moveto + 1.38 4.30 lineto +closepath stroke + 1.66 4.47 moveto + 1.54 4.18 lineto +closepath stroke + 1.36 5.15 moveto + 1.50 4.99 lineto +closepath stroke + 1.36 5.15 moveto + 0.96 4.97 lineto +closepath stroke + 1.36 5.15 moveto + 1.17 5.29 lineto +closepath stroke + 1.50 4.99 moveto + 1.33 4.71 lineto +closepath stroke + 1.33 4.71 moveto + 1.00 4.51 lineto +closepath stroke + 1.33 4.71 moveto + 1.18 4.39 lineto +closepath stroke + 1.02 5.56 moveto + 1.17 5.29 lineto +closepath stroke + 1.02 5.56 moveto + 0.63 6.00 lineto +closepath stroke + 1.02 5.56 moveto + 0.39 5.56 lineto +closepath stroke + 1.17 5.29 moveto + 0.96 4.97 lineto +closepath stroke + 0.96 4.97 moveto + 0.81 4.65 lineto +closepath stroke + 0.96 4.97 moveto + 1.00 4.51 lineto +closepath stroke + 0.63 6.00 moveto + 0.39 5.56 lineto +closepath stroke + 0.39 5.56 moveto + 0.00 5.71 lineto +closepath stroke + 0.39 5.56 moveto + 0.39 5.26 lineto +closepath stroke + 0.00 5.71 moveto + 0.39 5.26 lineto +closepath stroke + 0.39 5.26 moveto + 0.39 4.75 lineto +closepath stroke + 0.39 5.26 moveto + 0.00 4.91 lineto +closepath stroke + 3.13 3.28 moveto + 3.21 3.22 lineto +closepath stroke + 3.13 3.28 moveto + 3.04 3.35 lineto +closepath stroke + 3.04 3.35 moveto + 2.95 3.26 lineto +closepath stroke + 3.04 3.35 moveto + 2.92 3.40 lineto +closepath stroke + 2.82 3.47 moveto + 2.92 3.40 lineto +closepath stroke + 2.82 3.47 moveto + 2.70 3.37 lineto +closepath stroke + 2.82 3.47 moveto + 2.70 3.53 lineto +closepath stroke + 2.92 3.40 moveto + 2.95 3.26 lineto +closepath stroke + 2.95 3.26 moveto + 2.77 3.22 lineto +closepath stroke + 2.95 3.26 moveto + 2.89 3.17 lineto +closepath stroke + 2.59 3.60 moveto + 2.70 3.53 lineto +closepath stroke + 2.59 3.60 moveto + 2.43 3.49 lineto +closepath stroke + 2.59 3.60 moveto + 2.45 3.67 lineto +closepath stroke + 2.70 3.53 moveto + 2.70 3.37 lineto +closepath stroke + 2.70 3.37 moveto + 2.64 3.28 lineto +closepath stroke + 2.70 3.37 moveto + 2.77 3.22 lineto +closepath stroke + 2.33 3.75 moveto + 2.45 3.67 lineto +closepath stroke + 2.33 3.75 moveto + 2.14 3.62 lineto +closepath stroke + 2.33 3.75 moveto + 2.17 3.82 lineto +closepath stroke + 2.45 3.67 moveto + 2.43 3.49 lineto +closepath stroke + 2.43 3.49 moveto + 2.34 3.38 lineto +closepath stroke + 2.43 3.49 moveto + 2.48 3.32 lineto +closepath stroke + 2.04 3.92 moveto + 2.17 3.82 lineto +closepath stroke + 2.04 3.92 moveto + 1.81 3.77 lineto +closepath stroke + 2.04 3.92 moveto + 1.87 3.99 lineto +closepath stroke + 2.17 3.82 moveto + 2.14 3.62 lineto +closepath stroke + 2.14 3.62 moveto + 2.00 3.49 lineto +closepath stroke + 2.14 3.62 moveto + 2.16 3.42 lineto +closepath stroke + 1.73 4.10 moveto + 1.87 3.99 lineto +closepath stroke + 1.73 4.10 moveto + 1.45 3.93 lineto +closepath stroke + 1.73 4.10 moveto + 1.54 4.18 lineto +closepath stroke + 1.87 3.99 moveto + 1.81 3.77 lineto +closepath stroke + 1.81 3.77 moveto + 1.64 3.60 lineto +closepath stroke + 1.81 3.77 moveto + 1.81 3.53 lineto +closepath stroke + 1.38 4.30 moveto + 1.54 4.18 lineto +closepath stroke + 1.38 4.30 moveto + 1.06 4.10 lineto +closepath stroke + 1.38 4.30 moveto + 1.18 4.39 lineto +closepath stroke + 1.54 4.18 moveto + 1.45 3.93 lineto +closepath stroke + 1.45 3.93 moveto + 1.23 3.73 lineto +closepath stroke + 1.45 3.93 moveto + 1.42 3.65 lineto +closepath stroke + 0.81 4.65 moveto + 1.00 4.51 lineto +closepath stroke + 0.81 4.65 moveto + 0.39 4.75 lineto +closepath stroke + 0.81 4.65 moveto + 0.43 4.30 lineto +closepath stroke + 1.00 4.51 moveto + 1.18 4.39 lineto +closepath stroke + 1.18 4.39 moveto + 1.06 4.10 lineto +closepath stroke + 1.06 4.10 moveto + 0.79 3.88 lineto +closepath stroke + 1.06 4.10 moveto + 1.00 3.78 lineto +closepath stroke + 0.39 4.75 moveto + 0.43 4.30 lineto +closepath stroke + 0.39 4.75 moveto + 0.00 4.91 lineto +closepath stroke + 0.43 4.30 moveto + 0.00 4.03 lineto +closepath stroke + 0.43 4.30 moveto + 0.43 3.93 lineto +closepath stroke + 2.77 3.22 moveto + 2.89 3.17 lineto +closepath stroke + 2.77 3.22 moveto + 2.64 3.28 lineto +closepath stroke + 2.64 3.28 moveto + 2.54 3.17 lineto +closepath stroke + 2.64 3.28 moveto + 2.48 3.32 lineto +closepath stroke + 2.34 3.38 moveto + 2.48 3.32 lineto +closepath stroke + 2.34 3.38 moveto + 2.20 3.24 lineto +closepath stroke + 2.34 3.38 moveto + 2.16 3.42 lineto +closepath stroke + 2.48 3.32 moveto + 2.54 3.17 lineto +closepath stroke + 2.54 3.17 moveto + 2.33 3.10 lineto +closepath stroke + 2.54 3.17 moveto + 2.49 3.07 lineto +closepath stroke + 2.00 3.49 moveto + 2.16 3.42 lineto +closepath stroke + 2.00 3.49 moveto + 1.83 3.32 lineto +closepath stroke + 2.00 3.49 moveto + 1.81 3.53 lineto +closepath stroke + 2.16 3.42 moveto + 2.20 3.24 lineto +closepath stroke + 2.20 3.24 moveto + 2.15 3.14 lineto +closepath stroke + 2.20 3.24 moveto + 2.33 3.10 lineto +closepath stroke + 1.64 3.60 moveto + 1.81 3.53 lineto +closepath stroke + 1.64 3.60 moveto + 1.42 3.41 lineto +closepath stroke + 1.64 3.60 moveto + 1.42 3.65 lineto +closepath stroke + 1.81 3.53 moveto + 1.83 3.32 lineto +closepath stroke + 1.83 3.32 moveto + 1.74 3.18 lineto +closepath stroke + 1.83 3.32 moveto + 1.94 3.14 lineto +closepath stroke + 1.23 3.73 moveto + 1.42 3.65 lineto +closepath stroke + 1.23 3.73 moveto + 0.96 3.51 lineto +closepath stroke + 1.23 3.73 moveto + 1.00 3.78 lineto +closepath stroke + 1.42 3.65 moveto + 1.42 3.41 lineto +closepath stroke + 1.42 3.41 moveto + 1.29 3.23 lineto +closepath stroke + 1.42 3.41 moveto + 1.50 3.18 lineto +closepath stroke + 0.79 3.88 moveto + 1.00 3.78 lineto +closepath stroke + 0.79 3.88 moveto + 0.36 3.61 lineto +closepath stroke + 0.79 3.88 moveto + 0.43 3.93 lineto +closepath stroke + 1.00 3.78 moveto + 0.96 3.51 lineto +closepath stroke + 0.96 3.51 moveto + 0.79 3.28 lineto +closepath stroke + 0.96 3.51 moveto + 1.03 3.23 lineto +closepath stroke + 0.00 4.03 moveto + 0.43 3.93 lineto +closepath stroke + 0.43 3.93 moveto + 0.36 3.61 lineto +closepath stroke + 0.36 3.61 moveto + 0.00 3.33 lineto +closepath stroke + 0.36 3.61 moveto + 0.36 3.28 lineto +closepath stroke + 2.33 3.10 moveto + 2.49 3.07 lineto +closepath stroke + 2.33 3.10 moveto + 2.15 3.14 lineto +closepath stroke + 2.15 3.14 moveto + 2.06 3.00 lineto +closepath stroke + 2.15 3.14 moveto + 1.94 3.14 lineto +closepath stroke + 1.74 3.18 moveto + 1.94 3.14 lineto +closepath stroke + 1.74 3.18 moveto + 1.61 3.00 lineto +closepath stroke + 1.74 3.18 moveto + 1.50 3.18 lineto +closepath stroke + 1.94 3.14 moveto + 2.06 3.00 lineto +closepath stroke + 2.06 3.00 moveto + 1.94 2.86 lineto +closepath stroke + 2.06 3.00 moveto + 2.15 2.86 lineto +closepath stroke + 1.29 3.23 moveto + 1.50 3.18 lineto +closepath stroke + 1.29 3.23 moveto + 1.12 3.00 lineto +closepath stroke + 1.29 3.23 moveto + 1.03 3.23 lineto +closepath stroke + 1.50 3.18 moveto + 1.61 3.00 lineto +closepath stroke + 1.61 3.00 moveto + 1.50 2.82 lineto +closepath stroke + 1.61 3.00 moveto + 1.74 2.82 lineto +closepath stroke + 0.79 3.28 moveto + 1.03 3.23 lineto +closepath stroke + 0.79 3.28 moveto + 0.43 3.00 lineto +closepath stroke + 0.79 3.28 moveto + 0.36 3.28 lineto +closepath stroke + 1.03 3.23 moveto + 1.12 3.00 lineto +closepath stroke + 1.12 3.00 moveto + 1.03 2.77 lineto +closepath stroke + 1.12 3.00 moveto + 1.29 2.77 lineto +closepath stroke + 0.00 3.33 moveto + 0.36 3.28 lineto +closepath stroke + 0.36 3.28 moveto + 0.43 3.00 lineto +closepath stroke + 0.43 3.00 moveto + 0.36 2.72 lineto +closepath stroke + 0.43 3.00 moveto + 0.79 2.72 lineto +closepath stroke + 5.85 2.85 moveto + 6.00 2.85 lineto +closepath stroke + 5.85 2.85 moveto + 5.85 2.70 lineto +closepath stroke + 5.85 2.85 moveto + 5.61 2.85 lineto +closepath stroke + 6.00 2.85 moveto + 5.85 2.70 lineto +closepath stroke + 5.85 2.70 moveto + 6.00 2.51 lineto +closepath stroke + 5.85 2.70 moveto + 5.85 2.51 lineto +closepath stroke + 2.54 2.83 moveto + 2.33 2.90 lineto +closepath stroke + 2.54 2.83 moveto + 2.49 2.93 lineto +closepath stroke + 2.54 2.83 moveto + 2.64 2.72 lineto +closepath stroke + 2.54 2.83 moveto + 2.48 2.68 lineto +closepath stroke + 2.33 2.90 moveto + 2.49 2.93 lineto +closepath stroke + 2.33 2.90 moveto + 2.20 2.76 lineto +closepath stroke + 2.33 2.90 moveto + 2.15 2.86 lineto +closepath stroke + 1.94 2.86 moveto + 2.15 2.86 lineto +closepath stroke + 1.94 2.86 moveto + 1.83 2.68 lineto +closepath stroke + 1.94 2.86 moveto + 1.74 2.82 lineto +closepath stroke + 2.15 2.86 moveto + 2.20 2.76 lineto +closepath stroke + 2.20 2.76 moveto + 2.16 2.58 lineto +closepath stroke + 2.20 2.76 moveto + 2.34 2.62 lineto +closepath stroke + 1.50 2.82 moveto + 1.74 2.82 lineto +closepath stroke + 1.50 2.82 moveto + 1.42 2.59 lineto +closepath stroke + 1.50 2.82 moveto + 1.29 2.77 lineto +closepath stroke + 1.74 2.82 moveto + 1.83 2.68 lineto +closepath stroke + 1.83 2.68 moveto + 1.81 2.47 lineto +closepath stroke + 1.83 2.68 moveto + 2.00 2.51 lineto +closepath stroke + 1.03 2.77 moveto + 1.29 2.77 lineto +closepath stroke + 1.03 2.77 moveto + 0.96 2.49 lineto +closepath stroke + 1.03 2.77 moveto + 0.79 2.72 lineto +closepath stroke + 1.29 2.77 moveto + 1.42 2.59 lineto +closepath stroke + 1.42 2.59 moveto + 1.42 2.35 lineto +closepath stroke + 1.42 2.59 moveto + 1.64 2.40 lineto +closepath stroke + 0.36 2.72 moveto + 0.79 2.72 lineto +closepath stroke + 0.36 2.72 moveto + 0.00 2.67 lineto +closepath stroke + 0.36 2.72 moveto + 0.36 2.39 lineto +closepath stroke + 0.79 2.72 moveto + 0.96 2.49 lineto +closepath stroke + 0.96 2.49 moveto + 1.00 2.22 lineto +closepath stroke + 0.96 2.49 moveto + 1.23 2.27 lineto +closepath stroke + 0.00 2.67 moveto + 0.36 2.39 lineto +closepath stroke + 0.36 2.39 moveto + 0.43 2.07 lineto +closepath stroke + 0.36 2.39 moveto + 0.79 2.12 lineto +closepath stroke + 6.00 2.51 moveto + 5.85 2.51 lineto +closepath stroke + 5.85 2.51 moveto + 5.63 2.56 lineto +closepath stroke + 5.85 2.51 moveto + 5.78 2.37 lineto +closepath stroke + 5.61 2.85 moveto + 5.59 2.72 lineto +closepath stroke + 5.61 2.85 moveto + 5.49 2.87 lineto +closepath stroke + 2.77 2.78 moveto + 2.89 2.83 lineto +closepath stroke + 2.77 2.78 moveto + 2.95 2.74 lineto +closepath stroke + 2.77 2.78 moveto + 2.64 2.72 lineto +closepath stroke + 2.77 2.78 moveto + 2.70 2.63 lineto +closepath stroke + 2.89 2.83 moveto + 2.95 2.74 lineto +closepath stroke + 2.95 2.74 moveto + 3.04 2.65 lineto +closepath stroke + 2.95 2.74 moveto + 2.92 2.60 lineto +closepath stroke + 2.64 2.72 moveto + 2.70 2.63 lineto +closepath stroke + 2.64 2.72 moveto + 2.48 2.68 lineto +closepath stroke + 2.70 2.63 moveto + 2.82 2.53 lineto +closepath stroke + 2.70 2.63 moveto + 2.70 2.47 lineto +closepath stroke + 2.48 2.68 moveto + 2.43 2.51 lineto +closepath stroke + 2.48 2.68 moveto + 2.34 2.62 lineto +closepath stroke + 2.16 2.58 moveto + 2.34 2.62 lineto +closepath stroke + 2.16 2.58 moveto + 2.14 2.38 lineto +closepath stroke + 2.16 2.58 moveto + 2.00 2.51 lineto +closepath stroke + 2.34 2.62 moveto + 2.43 2.51 lineto +closepath stroke + 2.43 2.51 moveto + 2.59 2.40 lineto +closepath stroke + 2.43 2.51 moveto + 2.45 2.33 lineto +closepath stroke + 1.81 2.47 moveto + 2.00 2.51 lineto +closepath stroke + 1.81 2.47 moveto + 1.81 2.23 lineto +closepath stroke + 1.81 2.47 moveto + 1.64 2.40 lineto +closepath stroke + 2.00 2.51 moveto + 2.14 2.38 lineto +closepath stroke + 2.14 2.38 moveto + 2.33 2.25 lineto +closepath stroke + 2.14 2.38 moveto + 2.17 2.18 lineto +closepath stroke + 1.42 2.35 moveto + 1.64 2.40 lineto +closepath stroke + 1.42 2.35 moveto + 1.45 2.07 lineto +closepath stroke + 1.42 2.35 moveto + 1.23 2.27 lineto +closepath stroke + 1.64 2.40 moveto + 1.81 2.23 lineto +closepath stroke + 1.81 2.23 moveto + 2.04 2.08 lineto +closepath stroke + 1.81 2.23 moveto + 1.87 2.01 lineto +closepath stroke + 1.00 2.22 moveto + 1.23 2.27 lineto +closepath stroke + 1.00 2.22 moveto + 1.06 1.90 lineto +closepath stroke + 1.00 2.22 moveto + 0.79 2.12 lineto +closepath stroke + 1.23 2.27 moveto + 1.45 2.07 lineto +closepath stroke + 1.45 2.07 moveto + 1.54 1.82 lineto +closepath stroke + 1.45 2.07 moveto + 1.73 1.90 lineto +closepath stroke + 0.43 2.07 moveto + 0.79 2.12 lineto +closepath stroke + 0.43 2.07 moveto + 0.00 1.97 lineto +closepath stroke + 0.43 2.07 moveto + 0.43 1.70 lineto +closepath stroke + 0.79 2.12 moveto + 1.06 1.90 lineto +closepath stroke + 1.06 1.90 moveto + 1.18 1.61 lineto +closepath stroke + 1.06 1.90 moveto + 1.38 1.70 lineto +closepath stroke + 0.00 1.97 moveto + 0.43 1.70 lineto +closepath stroke + 0.43 1.70 moveto + 0.39 1.25 lineto +closepath stroke + 0.43 1.70 moveto + 0.81 1.35 lineto +closepath stroke + 5.59 2.72 moveto + 5.49 2.87 lineto +closepath stroke + 5.59 2.72 moveto + 5.63 2.56 lineto +closepath stroke + 5.59 2.72 moveto + 5.51 2.59 lineto +closepath stroke + 5.49 2.87 moveto + 5.38 2.87 lineto +closepath stroke + 5.63 2.56 moveto + 5.51 2.59 lineto +closepath stroke + 5.63 2.56 moveto + 5.78 2.37 lineto +closepath stroke + 5.51 2.59 moveto + 5.45 2.47 lineto +closepath stroke + 5.51 2.59 moveto + 5.41 2.64 lineto +closepath stroke + 5.78 2.37 moveto + 5.54 2.24 lineto +closepath stroke + 5.78 2.37 moveto + 5.76 2.19 lineto +closepath stroke + 3.13 2.72 moveto + 3.21 2.78 lineto +closepath stroke + 3.13 2.72 moveto + 3.27 2.71 lineto +closepath stroke + 3.13 2.72 moveto + 3.04 2.65 lineto +closepath stroke + 3.13 2.72 moveto + 3.10 2.58 lineto +closepath stroke + 3.21 2.78 moveto + 3.27 2.71 lineto +closepath stroke + 3.27 2.71 moveto + 3.35 2.64 lineto +closepath stroke + 3.27 2.71 moveto + 3.27 2.58 lineto +closepath stroke + 3.04 2.65 moveto + 3.10 2.58 lineto +closepath stroke + 3.04 2.65 moveto + 2.92 2.60 lineto +closepath stroke + 3.10 2.58 moveto + 3.20 2.51 lineto +closepath stroke + 3.10 2.58 moveto + 3.11 2.44 lineto +closepath stroke + 2.92 2.60 moveto + 2.82 2.53 lineto +closepath stroke + 2.92 2.60 moveto + 2.91 2.45 lineto +closepath stroke + 2.82 2.53 moveto + 2.91 2.45 lineto +closepath stroke + 2.82 2.53 moveto + 2.70 2.47 lineto +closepath stroke + 2.91 2.45 moveto + 3.04 2.36 lineto +closepath stroke + 2.91 2.45 moveto + 2.94 2.29 lineto +closepath stroke + 2.70 2.47 moveto + 2.59 2.40 lineto +closepath stroke + 2.70 2.47 moveto + 2.71 2.30 lineto +closepath stroke + 2.59 2.40 moveto + 2.71 2.30 lineto +closepath stroke + 2.59 2.40 moveto + 2.45 2.33 lineto +closepath stroke + 2.71 2.30 moveto + 2.86 2.20 lineto +closepath stroke + 2.71 2.30 moveto + 2.75 2.12 lineto +closepath stroke + 2.45 2.33 moveto + 2.33 2.25 lineto +closepath stroke + 2.45 2.33 moveto + 2.48 2.13 lineto +closepath stroke + 2.33 2.25 moveto + 2.48 2.13 lineto +closepath stroke + 2.33 2.25 moveto + 2.17 2.18 lineto +closepath stroke + 2.48 2.13 moveto + 2.67 2.03 lineto +closepath stroke + 2.48 2.13 moveto + 2.55 1.94 lineto +closepath stroke + 2.17 2.18 moveto + 2.04 2.08 lineto +closepath stroke + 2.17 2.18 moveto + 2.23 1.95 lineto +closepath stroke + 2.04 2.08 moveto + 2.23 1.95 lineto +closepath stroke + 2.04 2.08 moveto + 1.87 2.01 lineto +closepath stroke + 2.23 1.95 moveto + 2.45 1.83 lineto +closepath stroke + 2.23 1.95 moveto + 2.32 1.74 lineto +closepath stroke + 1.87 2.01 moveto + 1.96 1.75 lineto +closepath stroke + 1.87 2.01 moveto + 1.73 1.90 lineto +closepath stroke + 1.54 1.82 moveto + 1.73 1.90 lineto +closepath stroke + 1.54 1.82 moveto + 1.66 1.53 lineto +closepath stroke + 1.54 1.82 moveto + 1.38 1.70 lineto +closepath stroke + 1.73 1.90 moveto + 1.96 1.75 lineto +closepath stroke + 1.96 1.75 moveto + 2.22 1.62 lineto +closepath stroke + 1.96 1.75 moveto + 2.07 1.52 lineto +closepath stroke + 1.18 1.61 moveto + 1.38 1.70 lineto +closepath stroke + 1.18 1.61 moveto + 1.00 1.49 lineto +closepath stroke + 1.18 1.61 moveto + 1.33 1.29 lineto +closepath stroke + 1.38 1.70 moveto + 1.66 1.53 lineto +closepath stroke + 1.66 1.53 moveto + 1.96 1.39 lineto +closepath stroke + 1.66 1.53 moveto + 1.80 1.28 lineto +closepath stroke + 1.00 1.49 moveto + 1.33 1.29 lineto +closepath stroke + 1.00 1.49 moveto + 0.96 1.03 lineto +closepath stroke + 1.00 1.49 moveto + 0.81 1.35 lineto +closepath stroke + 1.33 1.29 moveto + 1.67 1.13 lineto +closepath stroke + 1.33 1.29 moveto + 1.50 1.01 lineto +closepath stroke + 0.39 1.25 moveto + 0.81 1.35 lineto +closepath stroke + 0.39 1.25 moveto + 0.00 1.09 lineto +closepath stroke + 0.39 1.25 moveto + 0.39 0.74 lineto +closepath stroke + 0.81 1.35 moveto + 0.96 1.03 lineto +closepath stroke + 0.96 1.03 moveto + 1.36 0.85 lineto +closepath stroke + 0.96 1.03 moveto + 1.17 0.71 lineto +closepath stroke + 0.00 1.09 moveto + 0.39 0.74 lineto +closepath stroke + 0.39 0.74 moveto + 0.00 0.29 lineto +closepath stroke + 0.39 0.74 moveto + 0.39 0.44 lineto +closepath stroke + 0.00 0.29 moveto + 0.39 0.44 lineto +closepath stroke + 0.39 0.44 moveto + 1.02 0.44 lineto +closepath stroke + 0.39 0.44 moveto + 0.63 0.00 lineto +closepath stroke + 5.38 2.87 moveto + 5.36 2.77 lineto +closepath stroke + 5.38 2.87 moveto + 5.28 2.90 lineto +closepath stroke + 3.46 2.76 moveto + 3.51 2.70 lineto +closepath stroke + 3.46 2.76 moveto + 3.41 2.70 lineto +closepath stroke + 3.51 2.70 moveto + 3.41 2.70 lineto +closepath stroke + 3.51 2.70 moveto + 3.61 2.70 lineto +closepath stroke + 3.51 2.70 moveto + 3.56 2.64 lineto +closepath stroke + 3.41 2.70 moveto + 3.40 2.57 lineto +closepath stroke + 3.41 2.70 moveto + 3.35 2.64 lineto +closepath stroke + 3.35 2.64 moveto + 3.27 2.58 lineto +closepath stroke + 3.35 2.64 moveto + 3.40 2.57 lineto +closepath stroke + 3.27 2.58 moveto + 3.20 2.51 lineto +closepath stroke + 3.27 2.58 moveto + 3.28 2.44 lineto +closepath stroke + 3.40 2.57 moveto + 3.52 2.58 lineto +closepath stroke + 3.40 2.57 moveto + 3.46 2.51 lineto +closepath stroke + 3.20 2.51 moveto + 3.28 2.44 lineto +closepath stroke + 3.20 2.51 moveto + 3.11 2.44 lineto +closepath stroke + 3.28 2.44 moveto + 3.42 2.44 lineto +closepath stroke + 3.28 2.44 moveto + 3.36 2.37 lineto +closepath stroke + 3.11 2.44 moveto + 3.04 2.36 lineto +closepath stroke + 3.11 2.44 moveto + 3.14 2.28 lineto +closepath stroke + 3.04 2.36 moveto + 3.14 2.28 lineto +closepath stroke + 3.04 2.36 moveto + 2.94 2.29 lineto +closepath stroke + 3.14 2.28 moveto + 3.26 2.20 lineto +closepath stroke + 3.14 2.28 moveto + 3.19 2.12 lineto +closepath stroke + 2.94 2.29 moveto + 2.86 2.20 lineto +closepath stroke + 2.94 2.29 moveto + 2.99 2.12 lineto +closepath stroke + 2.86 2.20 moveto + 2.99 2.12 lineto +closepath stroke + 2.86 2.20 moveto + 2.75 2.12 lineto +closepath stroke + 2.99 2.12 moveto + 3.13 2.03 lineto +closepath stroke + 2.99 2.12 moveto + 3.06 1.94 lineto +closepath stroke + 2.75 2.12 moveto + 2.67 2.03 lineto +closepath stroke + 2.75 2.12 moveto + 2.82 1.93 lineto +closepath stroke + 2.67 2.03 moveto + 2.82 1.93 lineto +closepath stroke + 2.67 2.03 moveto + 2.55 1.94 lineto +closepath stroke + 2.82 1.93 moveto + 3.00 1.84 lineto +closepath stroke + 2.82 1.93 moveto + 2.91 1.74 lineto +closepath stroke + 2.55 1.94 moveto + 2.45 1.83 lineto +closepath stroke + 2.55 1.94 moveto + 2.64 1.73 lineto +closepath stroke + 2.45 1.83 moveto + 2.64 1.73 lineto +closepath stroke + 2.45 1.83 moveto + 2.32 1.74 lineto +closepath stroke + 2.64 1.73 moveto + 2.84 1.63 lineto +closepath stroke + 2.64 1.73 moveto + 2.75 1.52 lineto +closepath stroke + 2.32 1.74 moveto + 2.22 1.62 lineto +closepath stroke + 2.32 1.74 moveto + 2.44 1.51 lineto +closepath stroke + 2.22 1.62 moveto + 2.44 1.51 lineto +closepath stroke + 2.22 1.62 moveto + 2.07 1.52 lineto +closepath stroke + 2.44 1.51 moveto + 2.67 1.39 lineto +closepath stroke + 2.44 1.51 moveto + 2.57 1.28 lineto +closepath stroke + 2.07 1.52 moveto + 1.96 1.39 lineto +closepath stroke + 2.07 1.52 moveto + 2.22 1.26 lineto +closepath stroke + 1.96 1.39 moveto + 2.22 1.26 lineto +closepath stroke + 1.96 1.39 moveto + 1.80 1.28 lineto +closepath stroke + 2.22 1.26 moveto + 2.49 1.14 lineto +closepath stroke + 2.22 1.26 moveto + 2.37 1.01 lineto +closepath stroke + 1.80 1.28 moveto + 1.67 1.13 lineto +closepath stroke + 1.80 1.28 moveto + 1.97 0.99 lineto +closepath stroke + 1.67 1.13 moveto + 1.97 0.99 lineto +closepath stroke + 1.67 1.13 moveto + 1.50 1.01 lineto +closepath stroke + 1.97 0.99 moveto + 2.28 0.86 lineto +closepath stroke + 1.97 0.99 moveto + 2.16 0.71 lineto +closepath stroke + 1.50 1.01 moveto + 1.36 0.85 lineto +closepath stroke + 1.50 1.01 moveto + 1.71 0.69 lineto +closepath stroke + 1.36 0.85 moveto + 1.71 0.69 lineto +closepath stroke + 1.36 0.85 moveto + 1.17 0.71 lineto +closepath stroke + 1.71 0.69 moveto + 2.16 0.71 lineto +closepath stroke + 1.71 0.69 moveto + 2.02 0.56 lineto +closepath stroke + 1.17 0.71 moveto + 1.02 0.44 lineto +closepath stroke + 1.17 0.71 moveto + 1.41 0.27 lineto +closepath stroke + 1.02 0.44 moveto + 1.41 0.27 lineto +closepath stroke + 1.02 0.44 moveto + 0.63 0.00 lineto +closepath stroke + 1.41 0.27 moveto + 1.92 0.27 lineto +closepath stroke + 1.41 0.27 moveto + 1.77 0.00 lineto +closepath stroke + 5.36 2.77 moveto + 5.28 2.90 lineto +closepath stroke + 5.36 2.77 moveto + 5.41 2.64 lineto +closepath stroke + 5.36 2.77 moveto + 5.30 2.66 lineto +closepath stroke + 5.28 2.90 moveto + 5.18 2.90 lineto +closepath stroke + 5.41 2.64 moveto + 5.30 2.66 lineto +closepath stroke + 5.41 2.64 moveto + 5.45 2.47 lineto +closepath stroke + 5.30 2.66 moveto + 5.24 2.56 lineto +closepath stroke + 5.30 2.66 moveto + 5.20 2.70 lineto +closepath stroke + 3.61 2.70 moveto + 3.56 2.64 lineto +closepath stroke + 3.61 2.70 moveto + 3.65 2.76 lineto +closepath stroke + 3.61 2.70 moveto + 3.69 2.71 lineto +closepath stroke + 3.56 2.64 moveto + 3.62 2.58 lineto +closepath stroke + 3.56 2.64 moveto + 3.52 2.58 lineto +closepath stroke + 3.65 2.76 moveto + 3.69 2.71 lineto +closepath stroke + 3.69 2.71 moveto + 3.77 2.71 lineto +closepath stroke + 3.69 2.71 moveto + 3.74 2.65 lineto +closepath stroke + 3.52 2.58 moveto + 3.46 2.51 lineto +closepath stroke + 3.52 2.58 moveto + 3.62 2.58 lineto +closepath stroke + 3.46 2.51 moveto + 3.54 2.45 lineto +closepath stroke + 3.46 2.51 moveto + 3.42 2.44 lineto +closepath stroke + 3.62 2.58 moveto + 3.68 2.52 lineto +closepath stroke + 3.62 2.58 moveto + 3.72 2.59 lineto +closepath stroke + 3.42 2.44 moveto + 3.36 2.37 lineto +closepath stroke + 3.42 2.44 moveto + 3.54 2.45 lineto +closepath stroke + 3.36 2.37 moveto + 3.31 2.29 lineto +closepath stroke + 3.36 2.37 moveto + 3.46 2.30 lineto +closepath stroke + 3.54 2.45 moveto + 3.61 2.38 lineto +closepath stroke + 3.54 2.45 moveto + 3.65 2.45 lineto +closepath stroke + 3.31 2.29 moveto + 3.46 2.30 lineto +closepath stroke + 3.31 2.29 moveto + 3.26 2.20 lineto +closepath stroke + 3.31 2.29 moveto + 3.36 2.13 lineto +closepath stroke + 3.46 2.30 moveto + 3.54 2.22 lineto +closepath stroke + 3.46 2.30 moveto + 3.59 2.30 lineto +closepath stroke + 3.26 2.20 moveto + 3.36 2.13 lineto +closepath stroke + 3.26 2.20 moveto + 3.19 2.12 lineto +closepath stroke + 3.36 2.13 moveto + 3.52 2.14 lineto +closepath stroke + 3.36 2.13 moveto + 3.47 2.05 lineto +closepath stroke + 3.19 2.12 moveto + 3.13 2.03 lineto +closepath stroke + 3.19 2.12 moveto + 3.26 1.95 lineto +closepath stroke + 3.13 2.03 moveto + 3.26 1.95 lineto +closepath stroke + 3.13 2.03 moveto + 3.06 1.94 lineto +closepath stroke + 3.26 1.95 moveto + 3.44 1.96 lineto +closepath stroke + 3.26 1.95 moveto + 3.38 1.86 lineto +closepath stroke + 3.06 1.94 moveto + 3.00 1.84 lineto +closepath stroke + 3.06 1.94 moveto + 3.14 1.75 lineto +closepath stroke + 3.00 1.84 moveto + 3.14 1.75 lineto +closepath stroke + 3.00 1.84 moveto + 2.91 1.74 lineto +closepath stroke + 3.14 1.75 moveto + 3.35 1.76 lineto +closepath stroke + 3.14 1.75 moveto + 3.29 1.66 lineto +closepath stroke + 2.91 1.74 moveto + 2.84 1.63 lineto +closepath stroke + 2.91 1.74 moveto + 3.02 1.53 lineto +closepath stroke + 2.84 1.63 moveto + 3.02 1.53 lineto +closepath stroke + 2.84 1.63 moveto + 2.75 1.52 lineto +closepath stroke + 3.02 1.53 moveto + 3.25 1.54 lineto +closepath stroke + 3.02 1.53 moveto + 3.18 1.43 lineto +closepath stroke + 2.75 1.52 moveto + 2.67 1.39 lineto +closepath stroke + 2.75 1.52 moveto + 2.88 1.29 lineto +closepath stroke + 2.67 1.39 moveto + 2.88 1.29 lineto +closepath stroke + 2.67 1.39 moveto + 2.57 1.28 lineto +closepath stroke + 2.88 1.29 moveto + 3.14 1.31 lineto +closepath stroke + 2.88 1.29 moveto + 3.07 1.18 lineto +closepath stroke + 2.57 1.28 moveto + 2.49 1.14 lineto +closepath stroke + 2.57 1.28 moveto + 2.72 1.02 lineto +closepath stroke + 2.49 1.14 moveto + 2.72 1.02 lineto +closepath stroke + 2.49 1.14 moveto + 2.37 1.01 lineto +closepath stroke + 2.72 1.02 moveto + 3.03 1.04 lineto +closepath stroke + 2.72 1.02 moveto + 2.95 0.90 lineto +closepath stroke + 2.37 1.01 moveto + 2.28 0.86 lineto +closepath stroke + 2.37 1.01 moveto + 2.55 0.73 lineto +closepath stroke + 2.16 0.71 moveto + 2.02 0.56 lineto +closepath stroke + 2.16 0.71 moveto + 2.28 0.86 lineto +closepath stroke + 2.02 0.56 moveto + 2.37 0.29 lineto +closepath stroke + 2.02 0.56 moveto + 1.92 0.27 lineto +closepath stroke + 2.28 0.86 moveto + 2.55 0.73 lineto +closepath stroke + 2.55 0.73 moveto + 2.90 0.75 lineto +closepath stroke + 2.55 0.73 moveto + 2.81 0.60 lineto +closepath stroke + 1.92 0.27 moveto + 1.77 0.00 lineto +closepath stroke + 1.92 0.27 moveto + 2.37 0.29 lineto +closepath stroke + 2.37 0.29 moveto + 2.76 0.29 lineto +closepath stroke + 2.37 0.29 moveto + 2.66 0.00 lineto +closepath stroke + 5.45 2.47 moveto + 5.44 2.31 lineto +closepath stroke + 5.45 2.47 moveto + 5.33 2.36 lineto +closepath stroke + 5.18 2.90 moveto + 5.16 2.82 lineto +closepath stroke + 5.18 2.90 moveto + 5.08 2.92 lineto +closepath stroke + 5.16 2.82 moveto + 5.08 2.92 lineto +closepath stroke + 5.16 2.82 moveto + 5.20 2.70 lineto +closepath stroke + 5.16 2.82 moveto + 5.10 2.72 lineto +closepath stroke + 5.08 2.92 moveto + 4.99 2.92 lineto +closepath stroke + 3.77 2.71 moveto + 3.74 2.65 lineto +closepath stroke + 3.77 2.71 moveto + 3.79 2.77 lineto +closepath stroke + 3.77 2.71 moveto + 3.83 2.71 lineto +closepath stroke + 3.74 2.65 moveto + 3.79 2.59 lineto +closepath stroke + 3.74 2.65 moveto + 3.72 2.59 lineto +closepath stroke + 3.79 2.77 moveto + 3.83 2.71 lineto +closepath stroke + 3.83 2.71 moveto + 3.88 2.65 lineto +closepath stroke + 3.83 2.71 moveto + 3.89 2.71 lineto +closepath stroke + 3.68 2.52 moveto + 3.72 2.59 lineto +closepath stroke + 3.68 2.52 moveto + 3.75 2.46 lineto +closepath stroke + 3.68 2.52 moveto + 3.65 2.45 lineto +closepath stroke + 3.72 2.59 moveto + 3.79 2.59 lineto +closepath stroke + 3.79 2.59 moveto + 3.85 2.53 lineto +closepath stroke + 3.79 2.59 moveto + 3.87 2.59 lineto +closepath stroke + 3.61 2.38 moveto + 3.65 2.45 lineto +closepath stroke + 3.61 2.38 moveto + 3.70 2.31 lineto +closepath stroke + 3.61 2.38 moveto + 3.59 2.30 lineto +closepath stroke + 3.65 2.45 moveto + 3.75 2.46 lineto +closepath stroke + 3.75 2.46 moveto + 3.82 2.39 lineto +closepath stroke + 3.75 2.46 moveto + 3.84 2.46 lineto +closepath stroke + 3.54 2.22 moveto + 3.59 2.30 lineto +closepath stroke + 3.54 2.22 moveto + 3.52 2.14 lineto +closepath stroke + 3.54 2.22 moveto + 3.65 2.15 lineto +closepath stroke + 3.59 2.30 moveto + 3.70 2.31 lineto +closepath stroke + 3.70 2.31 moveto + 3.79 2.23 lineto +closepath stroke + 3.70 2.31 moveto + 3.81 2.31 lineto +closepath stroke + 3.52 2.14 moveto + 3.65 2.15 lineto +closepath stroke + 3.52 2.14 moveto + 3.47 2.05 lineto +closepath stroke + 3.65 2.15 moveto + 3.75 2.06 lineto +closepath stroke + 3.65 2.15 moveto + 3.78 2.15 lineto +closepath stroke + 3.47 2.05 moveto + 3.44 1.96 lineto +closepath stroke + 3.47 2.05 moveto + 3.59 1.97 lineto +closepath stroke + 3.44 1.96 moveto + 3.59 1.97 lineto +closepath stroke + 3.44 1.96 moveto + 3.38 1.86 lineto +closepath stroke + 3.59 1.97 moveto + 3.74 1.97 lineto +closepath stroke + 3.59 1.97 moveto + 3.71 1.88 lineto +closepath stroke + 3.38 1.86 moveto + 3.35 1.76 lineto +closepath stroke + 3.38 1.86 moveto + 3.53 1.77 lineto +closepath stroke + 3.35 1.76 moveto + 3.53 1.77 lineto +closepath stroke + 3.35 1.76 moveto + 3.29 1.66 lineto +closepath stroke + 3.53 1.77 moveto + 3.70 1.78 lineto +closepath stroke + 3.53 1.77 moveto + 3.66 1.67 lineto +closepath stroke + 3.29 1.66 moveto + 3.25 1.54 lineto +closepath stroke + 3.29 1.66 moveto + 3.46 1.56 lineto +closepath stroke + 3.25 1.54 moveto + 3.46 1.56 lineto +closepath stroke + 3.25 1.54 moveto + 3.18 1.43 lineto +closepath stroke + 3.46 1.56 moveto + 3.65 1.56 lineto +closepath stroke + 3.46 1.56 moveto + 3.62 1.45 lineto +closepath stroke + 3.18 1.43 moveto + 3.14 1.31 lineto +closepath stroke + 3.18 1.43 moveto + 3.38 1.32 lineto +closepath stroke + 3.14 1.31 moveto + 3.38 1.32 lineto +closepath stroke + 3.14 1.31 moveto + 3.07 1.18 lineto +closepath stroke + 3.38 1.32 moveto + 3.60 1.33 lineto +closepath stroke + 3.38 1.32 moveto + 3.56 1.20 lineto +closepath stroke + 3.07 1.18 moveto + 3.03 1.04 lineto +closepath stroke + 3.07 1.18 moveto + 3.29 1.06 lineto +closepath stroke + 3.03 1.04 moveto + 3.29 1.06 lineto +closepath stroke + 3.03 1.04 moveto + 2.95 0.90 lineto +closepath stroke + 3.29 1.06 moveto + 3.55 1.07 lineto +closepath stroke + 3.29 1.06 moveto + 3.50 0.93 lineto +closepath stroke + 2.95 0.90 moveto + 2.90 0.75 lineto +closepath stroke + 2.95 0.90 moveto + 3.20 0.77 lineto +closepath stroke + 2.90 0.75 moveto + 3.20 0.77 lineto +closepath stroke + 2.90 0.75 moveto + 2.81 0.60 lineto +closepath stroke + 3.20 0.77 moveto + 3.49 0.78 lineto +closepath stroke + 3.20 0.77 moveto + 3.44 0.63 lineto +closepath stroke + 2.81 0.60 moveto + 2.76 0.29 lineto +closepath stroke + 2.81 0.60 moveto + 3.10 0.31 lineto +closepath stroke + 2.76 0.29 moveto + 3.10 0.31 lineto +closepath stroke + 2.76 0.29 moveto + 2.66 0.00 lineto +closepath stroke + 3.10 0.31 moveto + 3.42 0.31 lineto +closepath stroke + 3.10 0.31 moveto + 3.37 0.00 lineto +closepath stroke + 5.20 2.70 moveto + 5.10 2.72 lineto +closepath stroke + 5.20 2.70 moveto + 5.24 2.56 lineto +closepath stroke + 5.10 2.72 moveto + 5.06 2.65 lineto +closepath stroke + 5.10 2.72 moveto + 5.02 2.76 lineto +closepath stroke + 3.88 2.65 moveto + 3.89 2.71 lineto +closepath stroke + 3.88 2.65 moveto + 3.93 2.59 lineto +closepath stroke + 3.88 2.65 moveto + 3.87 2.59 lineto +closepath stroke + 3.89 2.71 moveto + 3.95 2.71 lineto +closepath stroke + 3.89 2.71 moveto + 3.90 2.77 lineto +closepath stroke + 3.95 2.71 moveto + 3.90 2.77 lineto +closepath stroke + 3.95 2.71 moveto + 4.00 2.66 lineto +closepath stroke + 3.95 2.71 moveto + 4.01 2.71 lineto +closepath stroke + 3.85 2.53 moveto + 3.87 2.59 lineto +closepath stroke + 3.85 2.53 moveto + 3.92 2.46 lineto +closepath stroke + 3.85 2.53 moveto + 3.84 2.46 lineto +closepath stroke + 3.87 2.59 moveto + 3.93 2.59 lineto +closepath stroke + 3.93 2.59 moveto + 4.00 2.53 lineto +closepath stroke + 3.93 2.59 moveto + 4.01 2.59 lineto +closepath stroke + 3.82 2.39 moveto + 3.84 2.46 lineto +closepath stroke + 3.82 2.39 moveto + 3.90 2.31 lineto +closepath stroke + 3.82 2.39 moveto + 3.81 2.31 lineto +closepath stroke + 3.84 2.46 moveto + 3.92 2.46 lineto +closepath stroke + 3.92 2.46 moveto + 4.00 2.39 lineto +closepath stroke + 3.92 2.46 moveto + 4.01 2.46 lineto +closepath stroke + 3.79 2.23 moveto + 3.81 2.31 lineto +closepath stroke + 3.79 2.23 moveto + 3.89 2.15 lineto +closepath stroke + 3.79 2.23 moveto + 3.78 2.15 lineto +closepath stroke + 3.81 2.31 moveto + 3.90 2.31 lineto +closepath stroke + 3.90 2.31 moveto + 4.00 2.24 lineto +closepath stroke + 3.90 2.31 moveto + 4.01 2.31 lineto +closepath stroke + 3.75 2.06 moveto + 3.78 2.15 lineto +closepath stroke + 3.75 2.06 moveto + 3.87 1.98 lineto +closepath stroke + 3.75 2.06 moveto + 3.74 1.97 lineto +closepath stroke + 3.78 2.15 moveto + 3.89 2.15 lineto +closepath stroke + 3.89 2.15 moveto + 4.00 2.07 lineto +closepath stroke + 3.89 2.15 moveto + 4.01 2.15 lineto +closepath stroke + 3.74 1.97 moveto + 3.71 1.88 lineto +closepath stroke + 3.74 1.97 moveto + 3.87 1.98 lineto +closepath stroke + 3.71 1.88 moveto + 3.70 1.78 lineto +closepath stroke + 3.71 1.88 moveto + 3.85 1.78 lineto +closepath stroke + 3.87 1.98 moveto + 4.00 1.88 lineto +closepath stroke + 3.87 1.98 moveto + 4.01 1.98 lineto +closepath stroke + 3.70 1.78 moveto + 3.85 1.78 lineto +closepath stroke + 3.70 1.78 moveto + 3.66 1.67 lineto +closepath stroke + 3.85 1.78 moveto + 4.01 1.78 lineto +closepath stroke + 3.85 1.78 moveto + 4.00 1.68 lineto +closepath stroke + 3.66 1.67 moveto + 3.65 1.56 lineto +closepath stroke + 3.66 1.67 moveto + 3.83 1.57 lineto +closepath stroke + 3.65 1.56 moveto + 3.83 1.57 lineto +closepath stroke + 3.65 1.56 moveto + 3.62 1.45 lineto +closepath stroke + 3.83 1.57 moveto + 4.01 1.57 lineto +closepath stroke + 3.83 1.57 moveto + 4.00 1.46 lineto +closepath stroke + 3.62 1.45 moveto + 3.60 1.33 lineto +closepath stroke + 3.62 1.45 moveto + 3.80 1.33 lineto +closepath stroke + 3.60 1.33 moveto + 3.80 1.33 lineto +closepath stroke + 3.60 1.33 moveto + 3.56 1.20 lineto +closepath stroke + 3.80 1.33 moveto + 4.01 1.33 lineto +closepath stroke + 3.80 1.33 moveto + 4.00 1.21 lineto +closepath stroke + 3.56 1.20 moveto + 3.55 1.07 lineto +closepath stroke + 3.56 1.20 moveto + 3.77 1.07 lineto +closepath stroke + 3.55 1.07 moveto + 3.77 1.07 lineto +closepath stroke + 3.55 1.07 moveto + 3.50 0.93 lineto +closepath stroke + 3.77 1.07 moveto + 4.01 1.07 lineto +closepath stroke + 3.77 1.07 moveto + 4.00 0.94 lineto +closepath stroke + 3.50 0.93 moveto + 3.49 0.78 lineto +closepath stroke + 3.50 0.93 moveto + 3.74 0.79 lineto +closepath stroke + 3.49 0.78 moveto + 3.74 0.79 lineto +closepath stroke + 3.49 0.78 moveto + 3.44 0.63 lineto +closepath stroke + 3.74 0.79 moveto + 4.02 0.79 lineto +closepath stroke + 3.74 0.79 moveto + 4.00 0.64 lineto +closepath stroke + 3.44 0.63 moveto + 3.42 0.31 lineto +closepath stroke + 3.44 0.63 moveto + 3.71 0.32 lineto +closepath stroke + 3.42 0.31 moveto + 3.71 0.32 lineto +closepath stroke + 3.42 0.31 moveto + 3.37 0.00 lineto +closepath stroke + 3.71 0.32 moveto + 4.02 0.32 lineto +closepath stroke + 3.71 0.32 moveto + 4.00 0.00 lineto +closepath stroke + 5.24 2.56 moveto + 5.24 2.43 lineto +closepath stroke + 5.24 2.56 moveto + 5.14 2.47 lineto +closepath stroke + 4.99 2.92 moveto + 4.98 2.85 lineto +closepath stroke + 4.99 2.92 moveto + 4.90 2.94 lineto +closepath stroke + 4.00 2.66 moveto + 4.01 2.71 lineto +closepath stroke + 4.00 2.66 moveto + 4.07 2.59 lineto +closepath stroke + 4.00 2.66 moveto + 4.01 2.59 lineto +closepath stroke + 4.01 2.71 moveto + 4.05 2.71 lineto +closepath stroke + 4.01 2.71 moveto + 4.00 2.77 lineto +closepath stroke + 4.05 2.71 moveto + 4.00 2.77 lineto +closepath stroke + 4.05 2.71 moveto + 4.10 2.71 lineto +closepath stroke + 4.05 2.71 moveto + 4.10 2.77 lineto +closepath stroke + 4.00 2.53 moveto + 4.01 2.59 lineto +closepath stroke + 4.00 2.53 moveto + 4.08 2.46 lineto +closepath stroke + 4.00 2.53 moveto + 4.01 2.46 lineto +closepath stroke + 4.01 2.59 moveto + 4.07 2.59 lineto +closepath stroke + 4.07 2.59 moveto + 4.13 2.59 lineto +closepath stroke + 4.07 2.59 moveto + 4.12 2.66 lineto +closepath stroke + 4.00 2.39 moveto + 4.01 2.46 lineto +closepath stroke + 4.00 2.39 moveto + 4.10 2.31 lineto +closepath stroke + 4.00 2.39 moveto + 4.01 2.31 lineto +closepath stroke + 4.01 2.46 moveto + 4.08 2.46 lineto +closepath stroke + 4.08 2.46 moveto + 4.16 2.46 lineto +closepath stroke + 4.08 2.46 moveto + 4.15 2.53 lineto +closepath stroke + 4.00 2.24 moveto + 4.01 2.31 lineto +closepath stroke + 4.00 2.24 moveto + 4.11 2.15 lineto +closepath stroke + 4.00 2.24 moveto + 4.01 2.15 lineto +closepath stroke + 4.01 2.31 moveto + 4.10 2.31 lineto +closepath stroke + 4.10 2.31 moveto + 4.19 2.32 lineto +closepath stroke + 4.10 2.31 moveto + 4.18 2.39 lineto +closepath stroke + 4.00 2.07 moveto + 4.01 2.15 lineto +closepath stroke + 4.00 2.07 moveto + 4.13 1.98 lineto +closepath stroke + 4.00 2.07 moveto + 4.01 1.98 lineto +closepath stroke + 4.01 2.15 moveto + 4.11 2.15 lineto +closepath stroke + 4.11 2.15 moveto + 4.22 2.16 lineto +closepath stroke + 4.11 2.15 moveto + 4.21 2.24 lineto +closepath stroke + 4.00 1.88 moveto + 4.01 1.98 lineto +closepath stroke + 4.00 1.88 moveto + 4.15 1.78 lineto +closepath stroke + 4.00 1.88 moveto + 4.01 1.78 lineto +closepath stroke + 4.01 1.98 moveto + 4.13 1.98 lineto +closepath stroke + 4.13 1.98 moveto + 4.26 1.98 lineto +closepath stroke + 4.13 1.98 moveto + 4.25 2.07 lineto +closepath stroke + 4.01 1.78 moveto + 4.00 1.68 lineto +closepath stroke + 4.01 1.78 moveto + 4.15 1.78 lineto +closepath stroke + 4.00 1.68 moveto + 4.01 1.57 lineto +closepath stroke + 4.00 1.68 moveto + 4.17 1.57 lineto +closepath stroke + 4.15 1.78 moveto + 4.30 1.79 lineto +closepath stroke + 4.15 1.78 moveto + 4.29 1.89 lineto +closepath stroke + 4.01 1.57 moveto + 4.17 1.57 lineto +closepath stroke + 4.01 1.57 moveto + 4.00 1.46 lineto +closepath stroke + 4.17 1.57 moveto + 4.33 1.69 lineto +closepath stroke + 4.17 1.57 moveto + 4.34 1.57 lineto +closepath stroke + 4.00 1.46 moveto + 4.01 1.33 lineto +closepath stroke + 4.00 1.46 moveto + 4.20 1.33 lineto +closepath stroke + 4.01 1.33 moveto + 4.20 1.33 lineto +closepath stroke + 4.01 1.33 moveto + 4.00 1.21 lineto +closepath stroke + 4.20 1.33 moveto + 4.38 1.46 lineto +closepath stroke + 4.20 1.33 moveto + 4.39 1.34 lineto +closepath stroke + 4.00 1.21 moveto + 4.01 1.07 lineto +closepath stroke + 4.00 1.21 moveto + 4.23 1.07 lineto +closepath stroke + 4.01 1.07 moveto + 4.23 1.07 lineto +closepath stroke + 4.01 1.07 moveto + 4.00 0.94 lineto +closepath stroke + 4.23 1.07 moveto + 4.43 1.22 lineto +closepath stroke + 4.23 1.07 moveto + 4.45 1.08 lineto +closepath stroke + 4.00 0.94 moveto + 4.02 0.79 lineto +closepath stroke + 4.00 0.94 moveto + 4.26 0.79 lineto +closepath stroke + 4.02 0.79 moveto + 4.26 0.79 lineto +closepath stroke + 4.02 0.79 moveto + 4.00 0.64 lineto +closepath stroke + 4.26 0.79 moveto + 4.49 0.95 lineto +closepath stroke + 4.26 0.79 moveto + 4.50 0.80 lineto +closepath stroke + 4.00 0.64 moveto + 4.02 0.32 lineto +closepath stroke + 4.00 0.64 moveto + 4.29 0.32 lineto +closepath stroke + 4.02 0.32 moveto + 4.29 0.32 lineto +closepath stroke + 4.02 0.32 moveto + 4.00 0.00 lineto +closepath stroke + 4.29 0.32 moveto + 4.55 0.65 lineto +closepath stroke + 4.29 0.32 moveto + 4.57 0.33 lineto +closepath stroke + 4.98 2.85 moveto + 4.90 2.94 lineto +closepath stroke + 4.98 2.85 moveto + 5.02 2.76 lineto +closepath stroke + 4.98 2.85 moveto + 4.93 2.78 lineto +closepath stroke + 4.90 2.94 moveto + 4.82 2.94 lineto +closepath stroke + 5.02 2.76 moveto + 4.93 2.78 lineto +closepath stroke + 5.02 2.76 moveto + 5.06 2.65 lineto +closepath stroke + 4.93 2.78 moveto + 4.89 2.72 lineto +closepath stroke + 4.93 2.78 moveto + 4.85 2.82 lineto +closepath stroke + 5.06 2.65 moveto + 5.06 2.53 lineto +closepath stroke + 5.06 2.65 moveto + 4.97 2.57 lineto +closepath stroke + 4.10 2.71 moveto + 4.10 2.77 lineto +closepath stroke + 4.10 2.71 moveto + 4.17 2.72 lineto +closepath stroke + 4.10 2.71 moveto + 4.12 2.66 lineto +closepath stroke + 4.13 2.59 moveto + 4.12 2.66 lineto +closepath stroke + 4.13 2.59 moveto + 4.21 2.60 lineto +closepath stroke + 4.13 2.59 moveto + 4.15 2.53 lineto +closepath stroke + 4.12 2.66 moveto + 4.17 2.72 lineto +closepath stroke + 4.17 2.72 moveto + 4.22 2.72 lineto +closepath stroke + 4.17 2.72 moveto + 4.20 2.78 lineto +closepath stroke + 4.16 2.46 moveto + 4.15 2.53 lineto +closepath stroke + 4.16 2.46 moveto + 4.25 2.47 lineto +closepath stroke + 4.16 2.46 moveto + 4.18 2.39 lineto +closepath stroke + 4.15 2.53 moveto + 4.21 2.60 lineto +closepath stroke + 4.21 2.60 moveto + 4.27 2.60 lineto +closepath stroke + 4.21 2.60 moveto + 4.25 2.67 lineto +closepath stroke + 4.19 2.32 moveto + 4.18 2.39 lineto +closepath stroke + 4.19 2.32 moveto + 4.29 2.32 lineto +closepath stroke + 4.19 2.32 moveto + 4.21 2.24 lineto +closepath stroke + 4.18 2.39 moveto + 4.25 2.47 lineto +closepath stroke + 4.25 2.47 moveto + 4.33 2.47 lineto +closepath stroke + 4.25 2.47 moveto + 4.30 2.54 lineto +closepath stroke + 4.22 2.16 moveto + 4.21 2.24 lineto +closepath stroke + 4.22 2.16 moveto + 4.35 2.16 lineto +closepath stroke + 4.22 2.16 moveto + 4.25 2.07 lineto +closepath stroke + 4.21 2.24 moveto + 4.29 2.32 lineto +closepath stroke + 4.29 2.32 moveto + 4.39 2.33 lineto +closepath stroke + 4.29 2.32 moveto + 4.36 2.41 lineto +closepath stroke + 4.26 1.98 moveto + 4.25 2.07 lineto +closepath stroke + 4.26 1.98 moveto + 4.40 1.99 lineto +closepath stroke + 4.26 1.98 moveto + 4.29 1.89 lineto +closepath stroke + 4.25 2.07 moveto + 4.35 2.16 lineto +closepath stroke + 4.35 2.16 moveto + 4.46 2.18 lineto +closepath stroke + 4.35 2.16 moveto + 4.43 2.26 lineto +closepath stroke + 4.30 1.79 moveto + 4.29 1.89 lineto +closepath stroke + 4.30 1.79 moveto + 4.47 1.79 lineto +closepath stroke + 4.30 1.79 moveto + 4.33 1.69 lineto +closepath stroke + 4.29 1.89 moveto + 4.40 1.99 lineto +closepath stroke + 4.40 1.99 moveto + 4.53 2.01 lineto +closepath stroke + 4.40 1.99 moveto + 4.50 2.10 lineto +closepath stroke + 4.33 1.69 moveto + 4.34 1.57 lineto +closepath stroke + 4.33 1.69 moveto + 4.47 1.79 lineto +closepath stroke + 4.34 1.57 moveto + 4.38 1.46 lineto +closepath stroke + 4.34 1.57 moveto + 4.53 1.58 lineto +closepath stroke + 4.47 1.79 moveto + 4.62 1.82 lineto +closepath stroke + 4.47 1.79 moveto + 4.58 1.92 lineto +closepath stroke + 4.38 1.46 moveto + 4.53 1.58 lineto +closepath stroke + 4.38 1.46 moveto + 4.39 1.34 lineto +closepath stroke + 4.53 1.58 moveto + 4.71 1.61 lineto +closepath stroke + 4.53 1.58 moveto + 4.67 1.72 lineto +closepath stroke + 4.39 1.34 moveto + 4.43 1.22 lineto +closepath stroke + 4.39 1.34 moveto + 4.61 1.35 lineto +closepath stroke + 4.43 1.22 moveto + 4.61 1.35 lineto +closepath stroke + 4.43 1.22 moveto + 4.45 1.08 lineto +closepath stroke + 4.61 1.35 moveto + 4.77 1.50 lineto +closepath stroke + 4.61 1.35 moveto + 4.81 1.38 lineto +closepath stroke + 4.45 1.08 moveto + 4.49 0.95 lineto +closepath stroke + 4.45 1.08 moveto + 4.69 1.09 lineto +closepath stroke + 4.49 0.95 moveto + 4.69 1.09 lineto +closepath stroke + 4.49 0.95 moveto + 4.50 0.80 lineto +closepath stroke + 4.69 1.09 moveto + 4.88 1.27 lineto +closepath stroke + 4.69 1.09 moveto + 4.92 1.13 lineto +closepath stroke + 4.50 0.80 moveto + 4.55 0.65 lineto +closepath stroke + 4.50 0.80 moveto + 4.78 0.81 lineto +closepath stroke + 4.55 0.65 moveto + 4.78 0.81 lineto +closepath stroke + 4.55 0.65 moveto + 4.57 0.33 lineto +closepath stroke + 4.78 0.81 moveto + 5.00 1.00 lineto +closepath stroke + 4.78 0.81 moveto + 5.04 0.86 lineto +closepath stroke + 4.57 0.33 moveto + 4.88 0.33 lineto +closepath stroke + 4.57 0.33 moveto + 4.62 0.00 lineto +closepath stroke + 4.88 0.33 moveto + 4.62 0.00 lineto +closepath stroke + 4.88 0.33 moveto + 5.21 0.56 lineto +closepath stroke + 4.88 0.33 moveto + 5.27 0.23 lineto +closepath stroke + 4.82 2.94 moveto + 4.81 2.89 lineto +closepath stroke + 4.82 2.94 moveto + 4.74 2.95 lineto +closepath stroke + 4.22 2.72 moveto + 4.20 2.78 lineto +closepath stroke + 4.22 2.72 moveto + 4.28 2.73 lineto +closepath stroke + 4.22 2.72 moveto + 4.25 2.67 lineto +closepath stroke + 4.27 2.60 moveto + 4.25 2.67 lineto +closepath stroke + 4.27 2.60 moveto + 4.35 2.61 lineto +closepath stroke + 4.27 2.60 moveto + 4.30 2.54 lineto +closepath stroke + 4.25 2.67 moveto + 4.28 2.73 lineto +closepath stroke + 4.28 2.73 moveto + 4.34 2.74 lineto +closepath stroke + 4.28 2.73 moveto + 4.30 2.79 lineto +closepath stroke + 4.33 2.47 moveto + 4.30 2.54 lineto +closepath stroke + 4.33 2.47 moveto + 4.42 2.49 lineto +closepath stroke + 4.33 2.47 moveto + 4.36 2.41 lineto +closepath stroke + 4.30 2.54 moveto + 4.35 2.61 lineto +closepath stroke + 4.35 2.61 moveto + 4.41 2.63 lineto +closepath stroke + 4.35 2.61 moveto + 4.38 2.69 lineto +closepath stroke + 4.39 2.33 moveto + 4.36 2.41 lineto +closepath stroke + 4.39 2.33 moveto + 4.50 2.35 lineto +closepath stroke + 4.39 2.33 moveto + 4.43 2.26 lineto +closepath stroke + 4.36 2.41 moveto + 4.42 2.49 lineto +closepath stroke + 4.42 2.49 moveto + 4.50 2.51 lineto +closepath stroke + 4.42 2.49 moveto + 4.46 2.57 lineto +closepath stroke + 4.46 2.18 moveto + 4.43 2.26 lineto +closepath stroke + 4.46 2.18 moveto + 4.59 2.20 lineto +closepath stroke + 4.46 2.18 moveto + 4.50 2.10 lineto +closepath stroke + 4.43 2.26 moveto + 4.50 2.35 lineto +closepath stroke + 4.50 2.35 moveto + 4.60 2.38 lineto +closepath stroke + 4.50 2.35 moveto + 4.55 2.45 lineto +closepath stroke + 4.53 2.01 moveto + 4.50 2.10 lineto +closepath stroke + 4.53 2.01 moveto + 4.69 2.03 lineto +closepath stroke + 4.53 2.01 moveto + 4.58 1.92 lineto +closepath stroke + 4.50 2.10 moveto + 4.59 2.20 lineto +closepath stroke + 4.59 2.20 moveto + 4.70 2.23 lineto +closepath stroke + 4.59 2.20 moveto + 4.66 2.31 lineto +closepath stroke + 4.62 1.82 moveto + 4.58 1.92 lineto +closepath stroke + 4.62 1.82 moveto + 4.79 1.85 lineto +closepath stroke + 4.62 1.82 moveto + 4.67 1.72 lineto +closepath stroke + 4.58 1.92 moveto + 4.69 2.03 lineto +closepath stroke + 4.69 2.03 moveto + 4.82 2.07 lineto +closepath stroke + 4.69 2.03 moveto + 4.77 2.16 lineto +closepath stroke + 4.71 1.61 moveto + 4.67 1.72 lineto +closepath stroke + 4.71 1.61 moveto + 4.91 1.64 lineto +closepath stroke + 4.71 1.61 moveto + 4.77 1.50 lineto +closepath stroke + 4.67 1.72 moveto + 4.79 1.85 lineto +closepath stroke + 4.79 1.85 moveto + 4.95 1.89 lineto +closepath stroke + 4.79 1.85 moveto + 4.89 1.99 lineto +closepath stroke + 4.77 1.50 moveto + 4.81 1.38 lineto +closepath stroke + 4.77 1.50 moveto + 4.91 1.64 lineto +closepath stroke + 4.81 1.38 moveto + 5.04 1.42 lineto +closepath stroke + 4.81 1.38 moveto + 4.88 1.27 lineto +closepath stroke + 4.91 1.64 moveto + 5.09 1.70 lineto +closepath stroke + 4.91 1.64 moveto + 5.02 1.81 lineto +closepath stroke + 4.88 1.27 moveto + 4.92 1.13 lineto +closepath stroke + 4.88 1.27 moveto + 5.04 1.42 lineto +closepath stroke + 4.92 1.13 moveto + 5.00 1.00 lineto +closepath stroke + 4.92 1.13 moveto + 5.18 1.17 lineto +closepath stroke + 5.04 1.42 moveto + 5.17 1.60 lineto +closepath stroke + 5.04 1.42 moveto + 5.24 1.49 lineto +closepath stroke + 5.00 1.00 moveto + 5.18 1.17 lineto +closepath stroke + 5.00 1.00 moveto + 5.04 0.86 lineto +closepath stroke + 5.18 1.17 moveto + 5.33 1.38 lineto +closepath stroke + 5.18 1.17 moveto + 5.41 1.25 lineto +closepath stroke + 5.04 0.86 moveto + 5.12 0.71 lineto +closepath stroke + 5.04 0.86 moveto + 5.34 0.90 lineto +closepath stroke + 5.12 0.71 moveto + 5.34 0.90 lineto +closepath stroke + 5.12 0.71 moveto + 5.21 0.56 lineto +closepath stroke + 5.12 0.71 moveto + 5.51 0.61 lineto +closepath stroke + 5.34 0.90 moveto + 5.41 1.25 lineto +closepath stroke + 5.34 0.90 moveto + 5.49 1.11 lineto +closepath stroke + 5.21 0.56 moveto + 5.51 0.61 lineto +closepath stroke + 5.21 0.56 moveto + 5.27 0.23 lineto +closepath stroke + 5.51 0.61 moveto + 5.71 1.00 lineto +closepath stroke + 5.51 0.61 moveto + 5.80 0.84 lineto +closepath stroke + 5.27 0.23 moveto + 5.60 0.23 lineto +closepath stroke + 5.27 0.23 moveto + 5.27 0.00 lineto +closepath stroke + 5.60 0.23 moveto + 5.80 0.23 lineto +closepath stroke + 5.60 0.23 moveto + 5.80 0.00 lineto +closepath stroke + 5.60 0.23 moveto + 5.27 0.00 lineto +closepath stroke + 5.80 0.23 moveto + 5.80 0.00 lineto +closepath stroke + 5.80 0.23 moveto + 5.80 0.84 lineto +closepath stroke + 5.80 0.23 moveto + 6.00 0.61 lineto +closepath stroke + 4.81 2.89 moveto + 4.74 2.95 lineto +closepath stroke + 4.81 2.89 moveto + 4.85 2.82 lineto +closepath stroke + 4.81 2.89 moveto + 4.77 2.83 lineto +closepath stroke + 4.74 2.95 moveto + 4.66 2.95 lineto +closepath stroke + 4.85 2.82 moveto + 4.77 2.83 lineto +closepath stroke + 4.85 2.82 moveto + 4.89 2.72 lineto +closepath stroke + 4.77 2.83 moveto + 4.74 2.79 lineto +closepath stroke + 4.77 2.83 moveto + 4.70 2.87 lineto +closepath stroke + 4.89 2.72 moveto + 4.90 2.63 lineto +closepath stroke + 4.89 2.72 moveto + 4.82 2.66 lineto +closepath stroke + 4.34 2.74 moveto + 4.30 2.79 lineto +closepath stroke + 4.34 2.74 moveto + 4.40 2.75 lineto +closepath stroke + 4.34 2.74 moveto + 4.38 2.69 lineto +closepath stroke + 4.41 2.63 moveto + 4.38 2.69 lineto +closepath stroke + 4.41 2.63 moveto + 4.49 2.65 lineto +closepath stroke + 4.41 2.63 moveto + 4.46 2.57 lineto +closepath stroke + 4.38 2.69 moveto + 4.40 2.75 lineto +closepath stroke + 4.40 2.75 moveto + 4.45 2.77 lineto +closepath stroke + 4.40 2.75 moveto + 4.40 2.82 lineto +closepath stroke + 4.50 2.51 moveto + 4.46 2.57 lineto +closepath stroke + 4.50 2.51 moveto + 4.60 2.54 lineto +closepath stroke + 4.50 2.51 moveto + 4.55 2.45 lineto +closepath stroke + 4.46 2.57 moveto + 4.49 2.65 lineto +closepath stroke + 4.49 2.65 moveto + 4.55 2.67 lineto +closepath stroke + 4.49 2.65 moveto + 4.50 2.73 lineto +closepath stroke + 4.60 2.38 moveto + 4.55 2.45 lineto +closepath stroke + 4.60 2.38 moveto + 4.71 2.41 lineto +closepath stroke + 4.60 2.38 moveto + 4.66 2.31 lineto +closepath stroke + 4.55 2.45 moveto + 4.60 2.54 lineto +closepath stroke + 4.60 2.54 moveto + 4.67 2.57 lineto +closepath stroke + 4.60 2.54 moveto + 4.62 2.63 lineto +closepath stroke + 4.70 2.23 moveto + 4.66 2.31 lineto +closepath stroke + 4.70 2.23 moveto + 4.83 2.27 lineto +closepath stroke + 4.70 2.23 moveto + 4.77 2.16 lineto +closepath stroke + 4.66 2.31 moveto + 4.71 2.41 lineto +closepath stroke + 4.71 2.41 moveto + 4.80 2.45 lineto +closepath stroke + 4.71 2.41 moveto + 4.74 2.52 lineto +closepath stroke + 4.82 2.07 moveto + 4.77 2.16 lineto +closepath stroke + 4.82 2.07 moveto + 4.97 2.12 lineto +closepath stroke + 4.82 2.07 moveto + 4.89 1.99 lineto +closepath stroke + 4.77 2.16 moveto + 4.83 2.27 lineto +closepath stroke + 4.83 2.27 moveto + 4.94 2.33 lineto +closepath stroke + 4.83 2.27 moveto + 4.87 2.40 lineto +closepath stroke + 4.95 1.89 moveto + 4.89 1.99 lineto +closepath stroke + 4.95 1.89 moveto + 5.12 1.95 lineto +closepath stroke + 4.95 1.89 moveto + 5.02 1.81 lineto +closepath stroke + 4.89 1.99 moveto + 4.97 2.12 lineto +closepath stroke + 4.97 2.12 moveto + 5.09 2.19 lineto +closepath stroke + 4.97 2.12 moveto + 5.02 2.27 lineto +closepath stroke + 5.09 1.70 moveto + 5.02 1.81 lineto +closepath stroke + 5.09 1.70 moveto + 5.29 1.77 lineto +closepath stroke + 5.09 1.70 moveto + 5.17 1.60 lineto +closepath stroke + 5.02 1.81 moveto + 5.12 1.95 lineto +closepath stroke + 5.12 1.95 moveto + 5.26 2.03 lineto +closepath stroke + 5.12 1.95 moveto + 5.18 2.12 lineto +closepath stroke + 5.17 1.60 moveto + 5.24 1.49 lineto +closepath stroke + 5.17 1.60 moveto + 5.29 1.77 lineto +closepath stroke + 5.24 1.49 moveto + 5.47 1.57 lineto +closepath stroke + 5.24 1.49 moveto + 5.33 1.38 lineto +closepath stroke + 5.29 1.77 moveto + 5.36 1.96 lineto +closepath stroke + 5.29 1.77 moveto + 5.45 1.86 lineto +closepath stroke + 5.41 1.25 moveto + 5.49 1.11 lineto +closepath stroke + 5.41 1.25 moveto + 5.33 1.38 lineto +closepath stroke + 5.49 1.11 moveto + 5.78 1.34 lineto +closepath stroke + 5.49 1.11 moveto + 5.71 1.00 lineto +closepath stroke + 5.33 1.38 moveto + 5.47 1.57 lineto +closepath stroke + 5.47 1.57 moveto + 5.56 1.78 lineto +closepath stroke + 5.47 1.57 moveto + 5.65 1.68 lineto +closepath stroke + 5.80 0.84 moveto + 6.00 0.61 lineto +closepath stroke + 5.80 0.84 moveto + 5.71 1.00 lineto +closepath stroke + 5.71 1.00 moveto + 5.78 1.34 lineto +closepath stroke + 5.78 1.34 moveto + 5.78 1.68 lineto +closepath stroke + 5.78 1.34 moveto + 6.00 1.56 lineto +closepath stroke + 4.66 2.95 moveto + 4.65 2.92 lineto +closepath stroke + 4.66 2.95 moveto + 4.59 2.97 lineto +closepath stroke + 4.45 2.77 moveto + 4.40 2.82 lineto +closepath stroke + 4.45 2.77 moveto + 4.51 2.79 lineto +closepath stroke + 4.45 2.77 moveto + 4.50 2.73 lineto +closepath stroke + 4.55 2.67 moveto + 4.50 2.73 lineto +closepath stroke + 4.55 2.67 moveto + 4.63 2.71 lineto +closepath stroke + 4.55 2.67 moveto + 4.62 2.63 lineto +closepath stroke + 4.50 2.73 moveto + 4.51 2.79 lineto +closepath stroke + 4.51 2.79 moveto + 4.55 2.82 lineto +closepath stroke + 4.51 2.79 moveto + 4.49 2.86 lineto +closepath stroke + 4.67 2.57 moveto + 4.62 2.63 lineto +closepath stroke + 4.67 2.57 moveto + 4.76 2.61 lineto +closepath stroke + 4.67 2.57 moveto + 4.74 2.52 lineto +closepath stroke + 4.62 2.63 moveto + 4.63 2.71 lineto +closepath stroke + 4.63 2.71 moveto + 4.68 2.74 lineto +closepath stroke + 4.63 2.71 moveto + 4.61 2.79 lineto +closepath stroke + 4.80 2.45 moveto + 4.74 2.52 lineto +closepath stroke + 4.80 2.45 moveto + 4.90 2.51 lineto +closepath stroke + 4.80 2.45 moveto + 4.87 2.40 lineto +closepath stroke + 4.74 2.52 moveto + 4.76 2.61 lineto +closepath stroke + 4.76 2.61 moveto + 4.82 2.66 lineto +closepath stroke + 4.76 2.61 moveto + 4.75 2.71 lineto +closepath stroke + 4.94 2.33 moveto + 4.87 2.40 lineto +closepath stroke + 4.94 2.33 moveto + 5.06 2.39 lineto +closepath stroke + 4.94 2.33 moveto + 5.02 2.27 lineto +closepath stroke + 4.87 2.40 moveto + 4.90 2.51 lineto +closepath stroke + 4.90 2.51 moveto + 4.97 2.57 lineto +closepath stroke + 4.90 2.51 moveto + 4.90 2.63 lineto +closepath stroke + 5.09 2.19 moveto + 5.02 2.27 lineto +closepath stroke + 5.09 2.19 moveto + 5.23 2.27 lineto +closepath stroke + 5.09 2.19 moveto + 5.18 2.12 lineto +closepath stroke + 5.02 2.27 moveto + 5.06 2.39 lineto +closepath stroke + 5.06 2.39 moveto + 5.14 2.47 lineto +closepath stroke + 5.06 2.39 moveto + 5.06 2.53 lineto +closepath stroke + 5.26 2.03 moveto + 5.18 2.12 lineto +closepath stroke + 5.26 2.03 moveto + 5.42 2.13 lineto +closepath stroke + 5.26 2.03 moveto + 5.36 1.96 lineto +closepath stroke + 5.18 2.12 moveto + 5.23 2.27 lineto +closepath stroke + 5.23 2.27 moveto + 5.33 2.36 lineto +closepath stroke + 5.23 2.27 moveto + 5.24 2.43 lineto +closepath stroke + 5.36 1.96 moveto + 5.45 1.86 lineto +closepath stroke + 5.36 1.96 moveto + 5.42 2.13 lineto +closepath stroke + 5.45 1.86 moveto + 5.63 1.98 lineto +closepath stroke + 5.45 1.86 moveto + 5.56 1.78 lineto +closepath stroke + 5.42 2.13 moveto + 5.54 2.24 lineto +closepath stroke + 5.42 2.13 moveto + 5.44 2.31 lineto +closepath stroke + 5.56 1.78 moveto + 5.65 1.68 lineto +closepath stroke + 5.56 1.78 moveto + 5.63 1.98 lineto +closepath stroke + 5.65 1.68 moveto + 5.87 1.90 lineto +closepath stroke + 5.65 1.68 moveto + 5.78 1.68 lineto +closepath stroke + 5.63 1.98 moveto + 5.76 2.19 lineto +closepath stroke + 5.63 1.98 moveto + 5.87 2.11 lineto +closepath stroke + 5.78 1.68 moveto + 6.00 1.56 lineto +closepath stroke + 5.78 1.68 moveto + 5.87 1.90 lineto +closepath stroke + 5.87 1.90 moveto + 6.00 2.11 lineto +closepath stroke + 5.87 1.90 moveto + 5.87 2.11 lineto +closepath stroke + 4.65 2.92 moveto + 4.59 2.97 lineto +closepath stroke + 4.65 2.92 moveto + 4.70 2.87 lineto +closepath stroke + 4.65 2.92 moveto + 4.62 2.88 lineto +closepath stroke + 4.70 2.87 moveto + 4.62 2.88 lineto +closepath stroke + 4.70 2.87 moveto + 4.74 2.79 lineto +closepath stroke + 4.62 2.88 moveto + 4.60 2.85 lineto +closepath stroke + 4.62 2.88 moveto + 4.56 2.91 lineto +closepath stroke + 4.55 2.82 moveto + 4.49 2.86 lineto +closepath stroke + 4.55 2.82 moveto + 4.60 2.85 lineto +closepath stroke + 4.55 2.82 moveto + 4.61 2.79 lineto +closepath stroke + 4.68 2.74 moveto + 4.61 2.79 lineto +closepath stroke + 4.68 2.74 moveto + 4.74 2.79 lineto +closepath stroke + 4.68 2.74 moveto + 4.75 2.71 lineto +closepath stroke + 4.61 2.79 moveto + 4.60 2.85 lineto +closepath stroke + 4.60 2.85 moveto + 4.56 2.91 lineto +closepath stroke + 4.82 2.66 moveto + 4.75 2.71 lineto +closepath stroke + 4.82 2.66 moveto + 4.90 2.63 lineto +closepath stroke + 4.75 2.71 moveto + 4.74 2.79 lineto +closepath stroke + 4.97 2.57 moveto + 4.90 2.63 lineto +closepath stroke + 4.97 2.57 moveto + 5.06 2.53 lineto +closepath stroke + 5.14 2.47 moveto + 5.06 2.53 lineto +closepath stroke + 5.14 2.47 moveto + 5.24 2.43 lineto +closepath stroke + 5.33 2.36 moveto + 5.24 2.43 lineto +closepath stroke + 5.33 2.36 moveto + 5.44 2.31 lineto +closepath stroke + 5.54 2.24 moveto + 5.44 2.31 lineto +closepath stroke + 5.54 2.24 moveto + 5.76 2.19 lineto +closepath stroke + 6.00 2.11 moveto + 5.87 2.11 lineto +closepath stroke + 5.87 2.11 moveto + 5.76 2.19 lineto +closepath stroke +showpage +%%EndDocument + @endspecial 116 x @beginspecial 40 @vscale 40 @hscale 200 +@hoffset -200 @voffset @setspecial +%%BeginDocument: mat.ps.8 +%! +%%Creator: PSPLTM routine +%%BoundingBox: 264.22 133.90 1290.26 1257.14 +%%EndComments +/cm {72 mul 2.54 div} def +/mc {72 div 2.54 mul} def +/pnum { 72 div 2.54 mul 20 string +cvs print ( ) print} def +/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def +gsave + /Helvetica findfont 0.500000 cm scalefont setfont + 10.7950 cm 16.9700 cm moveto +(Assembled Matrix) Cshow + 3.81000 cm 2.00000 cm translate + 13.9700 cm 1257 div dup scale + 0.250000 setlinewidth +newpath + 0 0 moveto + 1257 0 lineto + 1257 1257 lineto + 0 1257 lineto +closepath stroke + 0.2 setlinewidth +1 1 translate +0.8 setlinewidth +/p {moveto 0 -.40 rmoveto + 0 .80 rlineto stroke} def + 0 1255 p + 880 1255 p + 881 1255 p + 918 1255 p + 1 1254 p + 1161 1254 p + 1160 1254 p + 1199 1254 p + 2 1253 p + 469 1253 p + 468 1253 p + 472 1253 p + 3 1252 p + 730 1252 p + 731 1252 p + 732 1252 p + 4 1251 p + 330 1251 p + 332 1251 p + 333 1251 p + 1202 1251 p + 1233 1251 p + 5 1250 p + 332 1250 p + 331 1250 p + 335 1250 p + 337 1250 p + 1121 1250 p + 1164 1250 p + 6 1249 p + 337 1249 p + 336 1249 p + 339 1249 p + 341 1249 p + 1041 1249 p + 1080 1249 p + 7 1248 p + 341 1248 p + 340 1248 p + 343 1248 p + 345 1248 p + 961 1248 p + 963 1248 p + 8 1247 p + 345 1247 p + 344 1247 p + 347 1247 p + 349 1247 p + 882 1247 p + 920 1247 p + 9 1246 p + 349 1246 p + 348 1246 p + 351 1246 p + 353 1246 p + 820 1246 p + 845 1246 p + 10 1245 p + 353 1245 p + 352 1245 p + 356 1245 p + 799 1245 p + 798 1245 p + 11 1244 p + 334 1244 p + 333 1244 p + 357 1244 p + 359 1244 p + 12 1243 p + 331 1243 p + 330 1243 p + 334 1243 p + 338 1243 p + 358 1243 p + 361 1243 p + 13 1242 p + 336 1242 p + 335 1242 p + 338 1242 p + 342 1242 p + 362 1242 p + 364 1242 p + 14 1241 p + 340 1241 p + 339 1241 p + 342 1241 p + 346 1241 p + 365 1241 p + 367 1241 p + 15 1240 p + 344 1240 p + 343 1240 p + 346 1240 p + 350 1240 p + 368 1240 p + 370 1240 p + 16 1239 p + 348 1239 p + 347 1239 p + 350 1239 p + 354 1239 p + 371 1239 p + 373 1239 p + 17 1238 p + 352 1238 p + 351 1238 p + 354 1238 p + 355 1238 p + 374 1238 p + 376 1238 p + 18 1237 p + 356 1237 p + 355 1237 p + 377 1237 p + 19 1236 p + 360 1236 p + 359 1236 p + 379 1236 p + 381 1236 p + 20 1235 p + 358 1235 p + 357 1235 p + 360 1235 p + 363 1235 p + 380 1235 p + 383 1235 p + 21 1234 p + 362 1234 p + 361 1234 p + 363 1234 p + 366 1234 p + 384 1234 p + 386 1234 p + 22 1233 p + 365 1233 p + 364 1233 p + 366 1233 p + 369 1233 p + 387 1233 p + 389 1233 p + 23 1232 p + 368 1232 p + 367 1232 p + 369 1232 p + 372 1232 p + 390 1232 p + 392 1232 p + 24 1231 p + 371 1231 p + 370 1231 p + 372 1231 p + 375 1231 p + 393 1231 p + 395 1231 p + 25 1230 p + 374 1230 p + 373 1230 p + 375 1230 p + 378 1230 p + 396 1230 p + 398 1230 p + 26 1229 p + 377 1229 p + 376 1229 p + 378 1229 p + 399 1229 p + 402 1229 p + 404 1229 p + 27 1228 p + 382 1228 p + 381 1228 p + 406 1228 p + 408 1228 p + 28 1227 p + 380 1227 p + 379 1227 p + 382 1227 p + 385 1227 p + 405 1227 p + 410 1227 p + 29 1226 p + 384 1226 p + 383 1226 p + 385 1226 p + 388 1226 p + 409 1226 p + 413 1226 p + 30 1225 p + 387 1225 p + 386 1225 p + 388 1225 p + 391 1225 p + 412 1225 p + 415 1225 p + 31 1224 p + 390 1224 p + 389 1224 p + 391 1224 p + 394 1224 p + 416 1224 p + 418 1224 p + 32 1223 p + 393 1223 p + 392 1223 p + 394 1223 p + 397 1223 p + 419 1223 p + 421 1223 p + 33 1222 p + 396 1222 p + 395 1222 p + 397 1222 p + 400 1222 p + 422 1222 p + 424 1222 p + 34 1221 p + 399 1221 p + 398 1221 p + 400 1221 p + 401 1221 p + 425 1221 p + 427 1221 p + 35 1220 p + 402 1220 p + 401 1220 p + 403 1220 p + 428 1220 p + 430 1220 p + 36 1219 p + 404 1219 p + 403 1219 p + 431 1219 p + 434 1219 p + 37 1218 p + 407 1218 p + 408 1218 p + 436 1218 p + 438 1218 p + 38 1217 p + 405 1217 p + 406 1217 p + 407 1217 p + 411 1217 p + 435 1217 p + 440 1217 p + 39 1216 p + 409 1216 p + 410 1216 p + 411 1216 p + 414 1216 p + 439 1216 p + 443 1216 p + 40 1215 p + 412 1215 p + 413 1215 p + 414 1215 p + 417 1215 p + 442 1215 p + 446 1215 p + 41 1214 p + 416 1214 p + 415 1214 p + 417 1214 p + 420 1214 p + 445 1214 p + 449 1214 p + 42 1213 p + 419 1213 p + 418 1213 p + 420 1213 p + 423 1213 p + 448 1213 p + 452 1213 p + 43 1212 p + 422 1212 p + 421 1212 p + 423 1212 p + 426 1212 p + 451 1212 p + 455 1212 p + 44 1211 p + 425 1211 p + 424 1211 p + 426 1211 p + 429 1211 p + 454 1211 p + 457 1211 p + 45 1210 p + 428 1210 p + 427 1210 p + 429 1210 p + 432 1210 p + 458 1210 p + 460 1210 p + 46 1209 p + 431 1209 p + 430 1209 p + 432 1209 p + 433 1209 p + 461 1209 p + 464 1209 p + 465 1209 p + 47 1208 p + 434 1208 p + 433 1208 p + 466 1208 p + 470 1208 p + 469 1208 p + 48 1207 p + 437 1207 p + 438 1207 p + 475 1207 p + 477 1207 p + 49 1206 p + 435 1206 p + 436 1206 p + 437 1206 p + 441 1206 p + 474 1206 p + 479 1206 p + 50 1205 p + 439 1205 p + 440 1205 p + 441 1205 p + 444 1205 p + 478 1205 p + 482 1205 p + 51 1204 p + 442 1204 p + 443 1204 p + 444 1204 p + 447 1204 p + 481 1204 p + 485 1204 p + 52 1203 p + 445 1203 p + 446 1203 p + 447 1203 p + 450 1203 p + 484 1203 p + 488 1203 p + 53 1202 p + 448 1202 p + 449 1202 p + 450 1202 p + 453 1202 p + 487 1202 p + 491 1202 p + 54 1201 p + 451 1201 p + 452 1201 p + 453 1201 p + 456 1201 p + 490 1201 p + 494 1201 p + 55 1200 p + 454 1200 p + 455 1200 p + 456 1200 p + 459 1200 p + 493 1200 p + 497 1200 p + 56 1199 p + 458 1199 p + 457 1199 p + 459 1199 p + 462 1199 p + 496 1199 p + 500 1199 p + 57 1198 p + 461 1198 p + 460 1198 p + 462 1198 p + 463 1198 p + 499 1198 p + 503 1198 p + 58 1197 p + 464 1197 p + 463 1197 p + 467 1197 p + 502 1197 p + 507 1197 p + 59 1196 p + 466 1196 p + 465 1196 p + 467 1196 p + 471 1196 p + 506 1196 p + 60 1195 p + 468 1195 p + 470 1195 p + 471 1195 p + 473 1195 p + 505 1195 p + 509 1195 p + 61 1194 p + 472 1194 p + 473 1194 p + 511 1194 p + 62 1193 p + 476 1193 p + 477 1193 p + 513 1193 p + 515 1193 p + 63 1192 p + 474 1192 p + 475 1192 p + 476 1192 p + 480 1192 p + 512 1192 p + 517 1192 p + 64 1191 p + 478 1191 p + 479 1191 p + 480 1191 p + 483 1191 p + 516 1191 p + 520 1191 p + 65 1190 p + 481 1190 p + 482 1190 p + 483 1190 p + 486 1190 p + 519 1190 p + 523 1190 p + 66 1189 p + 484 1189 p + 485 1189 p + 486 1189 p + 489 1189 p + 522 1189 p + 526 1189 p + 67 1188 p + 487 1188 p + 488 1188 p + 489 1188 p + 492 1188 p + 525 1188 p + 529 1188 p + 68 1187 p + 490 1187 p + 491 1187 p + 492 1187 p + 495 1187 p + 528 1187 p + 532 1187 p + 69 1186 p + 493 1186 p + 494 1186 p + 495 1186 p + 498 1186 p + 531 1186 p + 535 1186 p + 70 1185 p + 496 1185 p + 497 1185 p + 498 1185 p + 501 1185 p + 534 1185 p + 538 1185 p + 71 1184 p + 499 1184 p + 500 1184 p + 501 1184 p + 504 1184 p + 537 1184 p + 541 1184 p + 72 1183 p + 502 1183 p + 503 1183 p + 504 1183 p + 508 1183 p + 540 1183 p + 544 1183 p + 73 1182 p + 505 1182 p + 506 1182 p + 507 1182 p + 508 1182 p + 510 1182 p + 543 1182 p + 547 1182 p + 74 1181 p + 509 1181 p + 510 1181 p + 511 1181 p + 546 1181 p + 75 1180 p + 514 1180 p + 515 1180 p + 550 1180 p + 76 1179 p + 512 1179 p + 513 1179 p + 514 1179 p + 518 1179 p + 549 1179 p + 552 1179 p + 77 1178 p + 516 1178 p + 517 1178 p + 518 1178 p + 521 1178 p + 551 1178 p + 555 1178 p + 78 1177 p + 519 1177 p + 520 1177 p + 521 1177 p + 524 1177 p + 554 1177 p + 558 1177 p + 79 1176 p + 522 1176 p + 523 1176 p + 524 1176 p + 527 1176 p + 557 1176 p + 561 1176 p + 80 1175 p + 525 1175 p + 526 1175 p + 527 1175 p + 530 1175 p + 560 1175 p + 564 1175 p + 81 1174 p + 528 1174 p + 529 1174 p + 530 1174 p + 533 1174 p + 563 1174 p + 567 1174 p + 82 1173 p + 531 1173 p + 532 1173 p + 533 1173 p + 536 1173 p + 566 1173 p + 570 1173 p + 83 1172 p + 534 1172 p + 535 1172 p + 536 1172 p + 539 1172 p + 569 1172 p + 573 1172 p + 84 1171 p + 537 1171 p + 538 1171 p + 539 1171 p + 542 1171 p + 572 1171 p + 576 1171 p + 85 1170 p + 540 1170 p + 541 1170 p + 542 1170 p + 545 1170 p + 575 1170 p + 579 1170 p + 86 1169 p + 543 1169 p + 544 1169 p + 545 1169 p + 548 1169 p + 578 1169 p + 582 1169 p + 87 1168 p + 546 1168 p + 547 1168 p + 548 1168 p + 581 1168 p + 584 1168 p + 88 1167 p + 549 1167 p + 550 1167 p + 553 1167 p + 587 1167 p + 89 1166 p + 551 1166 p + 552 1166 p + 553 1166 p + 556 1166 p + 586 1166 p + 589 1166 p + 90 1165 p + 554 1165 p + 555 1165 p + 556 1165 p + 559 1165 p + 588 1165 p + 592 1165 p + 91 1164 p + 557 1164 p + 558 1164 p + 559 1164 p + 562 1164 p + 591 1164 p + 595 1164 p + 92 1163 p + 560 1163 p + 561 1163 p + 562 1163 p + 565 1163 p + 594 1163 p + 598 1163 p + 93 1162 p + 563 1162 p + 564 1162 p + 565 1162 p + 568 1162 p + 597 1162 p + 601 1162 p + 94 1161 p + 566 1161 p + 567 1161 p + 568 1161 p + 571 1161 p + 600 1161 p + 604 1161 p + 95 1160 p + 569 1160 p + 570 1160 p + 571 1160 p + 574 1160 p + 603 1160 p + 607 1160 p + 96 1159 p + 572 1159 p + 573 1159 p + 574 1159 p + 577 1159 p + 606 1159 p + 610 1159 p + 97 1158 p + 575 1158 p + 576 1158 p + 577 1158 p + 580 1158 p + 609 1158 p + 613 1158 p + 98 1157 p + 578 1157 p + 579 1157 p + 580 1157 p + 583 1157 p + 612 1157 p + 616 1157 p + 99 1156 p + 581 1156 p + 582 1156 p + 583 1156 p + 585 1156 p + 615 1156 p + 619 1156 p + 100 1155 p + 584 1155 p + 585 1155 p + 618 1155 p + 621 1155 p + 101 1154 p + 586 1154 p + 587 1154 p + 590 1154 p + 624 1154 p + 102 1153 p + 588 1153 p + 589 1153 p + 590 1153 p + 593 1153 p + 623 1153 p + 626 1153 p + 103 1152 p + 591 1152 p + 592 1152 p + 593 1152 p + 596 1152 p + 625 1152 p + 629 1152 p + 104 1151 p + 594 1151 p + 595 1151 p + 596 1151 p + 599 1151 p + 628 1151 p + 632 1151 p + 105 1150 p + 597 1150 p + 598 1150 p + 599 1150 p + 602 1150 p + 631 1150 p + 635 1150 p + 106 1149 p + 600 1149 p + 601 1149 p + 602 1149 p + 605 1149 p + 634 1149 p + 638 1149 p + 107 1148 p + 603 1148 p + 604 1148 p + 605 1148 p + 608 1148 p + 637 1148 p + 641 1148 p + 108 1147 p + 606 1147 p + 607 1147 p + 608 1147 p + 611 1147 p + 640 1147 p + 644 1147 p + 109 1146 p + 609 1146 p + 610 1146 p + 611 1146 p + 614 1146 p + 643 1146 p + 647 1146 p + 110 1145 p + 612 1145 p + 613 1145 p + 614 1145 p + 617 1145 p + 646 1145 p + 650 1145 p + 111 1144 p + 615 1144 p + 616 1144 p + 617 1144 p + 620 1144 p + 649 1144 p + 653 1144 p + 112 1143 p + 618 1143 p + 619 1143 p + 620 1143 p + 622 1143 p + 652 1143 p + 656 1143 p + 113 1142 p + 621 1142 p + 622 1142 p + 655 1142 p + 658 1142 p + 114 1141 p + 623 1141 p + 624 1141 p + 627 1141 p + 661 1141 p + 115 1140 p + 625 1140 p + 626 1140 p + 627 1140 p + 630 1140 p + 660 1140 p + 663 1140 p + 116 1139 p + 628 1139 p + 629 1139 p + 630 1139 p + 633 1139 p + 662 1139 p + 666 1139 p + 117 1138 p + 631 1138 p + 632 1138 p + 633 1138 p + 636 1138 p + 665 1138 p + 669 1138 p + 118 1137 p + 634 1137 p + 635 1137 p + 636 1137 p + 639 1137 p + 668 1137 p + 119 1136 p + 637 1136 p + 638 1136 p + 639 1136 p + 642 1136 p + 671 1136 p + 673 1136 p + 120 1135 p + 640 1135 p + 641 1135 p + 642 1135 p + 645 1135 p + 672 1135 p + 676 1135 p + 121 1134 p + 643 1134 p + 644 1134 p + 645 1134 p + 648 1134 p + 675 1134 p + 679 1134 p + 122 1133 p + 646 1133 p + 647 1133 p + 648 1133 p + 651 1133 p + 678 1133 p + 682 1133 p + 123 1132 p + 649 1132 p + 650 1132 p + 651 1132 p + 654 1132 p + 681 1132 p + 685 1132 p + 124 1131 p + 652 1131 p + 653 1131 p + 654 1131 p + 657 1131 p + 684 1131 p + 688 1131 p + 125 1130 p + 655 1130 p + 656 1130 p + 657 1130 p + 659 1130 p + 687 1130 p + 691 1130 p + 693 1130 p + 126 1129 p + 658 1129 p + 659 1129 p + 692 1129 p + 695 1129 p + 127 1128 p + 660 1128 p + 661 1128 p + 664 1128 p + 698 1128 p + 128 1127 p + 662 1127 p + 663 1127 p + 664 1127 p + 667 1127 p + 697 1127 p + 129 1126 p + 665 1126 p + 666 1126 p + 667 1126 p + 670 1126 p + 699 1126 p + 701 1126 p + 130 1125 p + 668 1125 p + 669 1125 p + 670 1125 p + 671 1125 p + 674 1125 p + 700 1125 p + 704 1125 p + 131 1124 p + 672 1124 p + 673 1124 p + 674 1124 p + 677 1124 p + 703 1124 p + 707 1124 p + 132 1123 p + 675 1123 p + 676 1123 p + 677 1123 p + 680 1123 p + 706 1123 p + 710 1123 p + 133 1122 p + 678 1122 p + 679 1122 p + 680 1122 p + 683 1122 p + 709 1122 p + 713 1122 p + 134 1121 p + 681 1121 p + 682 1121 p + 683 1121 p + 686 1121 p + 712 1121 p + 716 1121 p + 135 1120 p + 684 1120 p + 685 1120 p + 686 1120 p + 689 1120 p + 715 1120 p + 719 1120 p + 136 1119 p + 687 1119 p + 688 1119 p + 689 1119 p + 690 1119 p + 718 1119 p + 722 1119 p + 137 1118 p + 691 1118 p + 690 1118 p + 694 1118 p + 721 1118 p + 725 1118 p + 138 1117 p + 692 1117 p + 693 1117 p + 694 1117 p + 696 1117 p + 724 1117 p + 728 1117 p + 139 1116 p + 695 1116 p + 696 1116 p + 727 1116 p + 730 1116 p + 140 1115 p + 697 1115 p + 698 1115 p + 699 1115 p + 702 1115 p + 735 1115 p + 141 1114 p + 700 1114 p + 701 1114 p + 702 1114 p + 705 1114 p + 734 1114 p + 142 1113 p + 703 1113 p + 704 1113 p + 705 1113 p + 708 1113 p + 736 1113 p + 738 1113 p + 143 1112 p + 706 1112 p + 707 1112 p + 708 1112 p + 711 1112 p + 737 1112 p + 741 1112 p + 144 1111 p + 709 1111 p + 710 1111 p + 711 1111 p + 714 1111 p + 740 1111 p + 744 1111 p + 145 1110 p + 712 1110 p + 713 1110 p + 714 1110 p + 717 1110 p + 743 1110 p + 747 1110 p + 146 1109 p + 715 1109 p + 716 1109 p + 717 1109 p + 720 1109 p + 746 1109 p + 750 1109 p + 147 1108 p + 718 1108 p + 719 1108 p + 720 1108 p + 723 1108 p + 749 1108 p + 753 1108 p + 148 1107 p + 721 1107 p + 722 1107 p + 723 1107 p + 726 1107 p + 752 1107 p + 757 1107 p + 149 1106 p + 724 1106 p + 725 1106 p + 726 1106 p + 729 1106 p + 756 1106 p + 150 1105 p + 727 1105 p + 728 1105 p + 729 1105 p + 731 1105 p + 733 1105 p + 755 1105 p + 759 1105 p + 151 1104 p + 732 1104 p + 733 1104 p + 761 1104 p + 152 1103 p + 734 1103 p + 735 1103 p + 736 1103 p + 739 1103 p + 763 1103 p + 153 1102 p + 737 1102 p + 738 1102 p + 739 1102 p + 742 1102 p + 762 1102 p + 154 1101 p + 740 1101 p + 741 1101 p + 742 1101 p + 745 1101 p + 764 1101 p + 766 1101 p + 155 1100 p + 743 1100 p + 744 1100 p + 745 1100 p + 748 1100 p + 765 1100 p + 769 1100 p + 156 1099 p + 746 1099 p + 747 1099 p + 748 1099 p + 751 1099 p + 768 1099 p + 772 1099 p + 157 1098 p + 749 1098 p + 750 1098 p + 751 1098 p + 754 1098 p + 771 1098 p + 775 1098 p + 158 1097 p + 752 1097 p + 753 1097 p + 754 1097 p + 758 1097 p + 774 1097 p + 778 1097 p + 159 1096 p + 755 1096 p + 756 1096 p + 757 1096 p + 758 1096 p + 760 1096 p + 777 1096 p + 781 1096 p + 160 1095 p + 759 1095 p + 760 1095 p + 761 1095 p + 780 1095 p + 161 1094 p + 762 1094 p + 763 1094 p + 764 1094 p + 767 1094 p + 784 1094 p + 162 1093 p + 765 1093 p + 766 1093 p + 767 1093 p + 770 1093 p + 783 1093 p + 163 1092 p + 768 1092 p + 769 1092 p + 770 1092 p + 773 1092 p + 785 1092 p + 787 1092 p + 164 1091 p + 771 1091 p + 772 1091 p + 773 1091 p + 776 1091 p + 786 1091 p + 790 1091 p + 165 1090 p + 774 1090 p + 775 1090 p + 776 1090 p + 779 1090 p + 789 1090 p + 793 1090 p + 166 1089 p + 777 1089 p + 778 1089 p + 779 1089 p + 782 1089 p + 792 1089 p + 796 1089 p + 167 1088 p + 780 1088 p + 781 1088 p + 782 1088 p + 795 1088 p + 168 1087 p + 783 1087 p + 784 1087 p + 785 1087 p + 788 1087 p + 803 1087 p + 802 1087 p + 805 1087 p + 169 1086 p + 786 1086 p + 787 1086 p + 788 1086 p + 791 1086 p + 804 1086 p + 808 1086 p + 170 1085 p + 789 1085 p + 790 1085 p + 791 1085 p + 794 1085 p + 807 1085 p + 811 1085 p + 171 1084 p + 792 1084 p + 793 1084 p + 794 1084 p + 797 1084 p + 810 1084 p + 814 1084 p + 172 1083 p + 795 1083 p + 796 1083 p + 797 1083 p + 813 1083 p + 816 1083 p + 173 1082 p + 801 1082 p + 803 1082 p + 822 1082 p + 821 1082 p + 824 1082 p + 174 1081 p + 802 1081 p + 801 1081 p + 806 1081 p + 826 1081 p + 828 1081 p + 175 1080 p + 804 1080 p + 805 1080 p + 806 1080 p + 809 1080 p + 827 1080 p + 831 1080 p + 176 1079 p + 807 1079 p + 808 1079 p + 809 1079 p + 812 1079 p + 830 1079 p + 834 1079 p + 177 1078 p + 810 1078 p + 811 1078 p + 812 1078 p + 815 1078 p + 833 1078 p + 837 1078 p + 178 1077 p + 813 1077 p + 814 1077 p + 815 1077 p + 817 1077 p + 836 1077 p + 840 1077 p + 179 1076 p + 816 1076 p + 817 1076 p + 839 1076 p + 842 1076 p + 180 1075 p + 823 1075 p + 822 1075 p + 850 1075 p + 849 1075 p + 852 1075 p + 181 1074 p + 821 1074 p + 823 1074 p + 825 1074 p + 854 1074 p + 855 1074 p + 182 1073 p + 824 1073 p + 825 1073 p + 826 1073 p + 829 1073 p + 857 1073 p + 858 1073 p + 183 1072 p + 827 1072 p + 828 1072 p + 829 1072 p + 832 1072 p + 860 1072 p + 861 1072 p + 184 1071 p + 830 1071 p + 831 1071 p + 832 1071 p + 835 1071 p + 863 1071 p + 864 1071 p + 185 1070 p + 833 1070 p + 834 1070 p + 835 1070 p + 838 1070 p + 866 1070 p + 868 1070 p + 186 1069 p + 836 1069 p + 837 1069 p + 838 1069 p + 841 1069 p + 867 1069 p + 871 1069 p + 187 1068 p + 839 1068 p + 840 1068 p + 841 1068 p + 843 1068 p + 870 1068 p + 873 1068 p + 876 1068 p + 188 1067 p + 842 1067 p + 843 1067 p + 875 1067 p + 878 1067 p + 189 1066 p + 851 1066 p + 850 1066 p + 883 1066 p + 885 1066 p + 886 1066 p + 190 1065 p + 849 1065 p + 851 1065 p + 853 1065 p + 887 1065 p + 889 1065 p + 191 1064 p + 852 1064 p + 853 1064 p + 854 1064 p + 856 1064 p + 891 1064 p + 892 1064 p + 192 1063 p + 855 1063 p + 856 1063 p + 857 1063 p + 859 1063 p + 894 1063 p + 895 1063 p + 193 1062 p + 858 1062 p + 859 1062 p + 860 1062 p + 862 1062 p + 897 1062 p + 898 1062 p + 194 1061 p + 861 1061 p + 862 1061 p + 863 1061 p + 865 1061 p + 900 1061 p + 901 1061 p + 195 1060 p + 864 1060 p + 865 1060 p + 866 1060 p + 869 1060 p + 903 1060 p + 904 1060 p + 196 1059 p + 867 1059 p + 868 1059 p + 869 1059 p + 872 1059 p + 906 1059 p + 907 1059 p + 197 1058 p + 870 1058 p + 871 1058 p + 872 1058 p + 874 1058 p + 909 1058 p + 910 1058 p + 198 1057 p + 873 1057 p + 874 1057 p + 877 1057 p + 912 1057 p + 913 1057 p + 199 1056 p + 875 1056 p + 876 1056 p + 877 1056 p + 879 1056 p + 881 1056 p + 915 1056 p + 916 1056 p + 200 1055 p + 878 1055 p + 879 1055 p + 880 1055 p + 201 1054 p + 884 1054 p + 883 1054 p + 923 1054 p + 925 1054 p + 202 1053 p + 885 1053 p + 884 1053 p + 888 1053 p + 924 1053 p + 927 1053 p + 203 1052 p + 887 1052 p + 886 1052 p + 888 1052 p + 890 1052 p + 928 1052 p + 930 1052 p + 204 1051 p + 889 1051 p + 890 1051 p + 891 1051 p + 893 1051 p + 931 1051 p + 933 1051 p + 935 1051 p + 205 1050 p + 892 1050 p + 893 1050 p + 894 1050 p + 896 1050 p + 937 1050 p + 938 1050 p + 206 1049 p + 895 1049 p + 896 1049 p + 897 1049 p + 899 1049 p + 940 1049 p + 941 1049 p + 207 1048 p + 898 1048 p + 899 1048 p + 900 1048 p + 902 1048 p + 943 1048 p + 944 1048 p + 208 1047 p + 901 1047 p + 902 1047 p + 903 1047 p + 905 1047 p + 946 1047 p + 947 1047 p + 209 1046 p + 904 1046 p + 905 1046 p + 906 1046 p + 908 1046 p + 949 1046 p + 950 1046 p + 210 1045 p + 907 1045 p + 908 1045 p + 909 1045 p + 911 1045 p + 952 1045 p + 955 1045 p + 211 1044 p + 910 1044 p + 911 1044 p + 912 1044 p + 914 1044 p + 953 1044 p + 212 1043 p + 913 1043 p + 914 1043 p + 915 1043 p + 917 1043 p + 954 1043 p + 957 1043 p + 213 1042 p + 916 1042 p + 917 1042 p + 918 1042 p + 958 1042 p + 214 1041 p + 926 1041 p + 925 1041 p + 964 1041 p + 966 1041 p + 215 1040 p + 924 1040 p + 923 1040 p + 926 1040 p + 929 1040 p + 965 1040 p + 969 1040 p + 216 1039 p + 928 1039 p + 927 1039 p + 929 1039 p + 932 1039 p + 968 1039 p + 972 1039 p + 217 1038 p + 931 1038 p + 930 1038 p + 932 1038 p + 934 1038 p + 971 1038 p + 975 1038 p + 218 1037 p + 933 1037 p + 934 1037 p + 936 1037 p + 974 1037 p + 977 1037 p + 219 1036 p + 935 1036 p + 936 1036 p + 937 1036 p + 939 1036 p + 979 1036 p + 980 1036 p + 220 1035 p + 938 1035 p + 939 1035 p + 940 1035 p + 942 1035 p + 982 1035 p + 983 1035 p + 221 1034 p + 941 1034 p + 942 1034 p + 943 1034 p + 945 1034 p + 985 1034 p + 986 1034 p + 222 1033 p + 944 1033 p + 945 1033 p + 946 1033 p + 948 1033 p + 988 1033 p + 989 1033 p + 223 1032 p + 947 1032 p + 948 1032 p + 949 1032 p + 951 1032 p + 991 1032 p + 992 1032 p + 224 1031 p + 950 1031 p + 951 1031 p + 952 1031 p + 956 1031 p + 994 1031 p + 995 1031 p + 225 1030 p + 954 1030 p + 953 1030 p + 955 1030 p + 956 1030 p + 959 1030 p + 997 1030 p + 998 1030 p + 226 1029 p + 958 1029 p + 957 1029 p + 959 1029 p + 1000 1029 p + 227 1028 p + 967 1028 p + 966 1028 p + 1004 1028 p + 1006 1028 p + 228 1027 p + 965 1027 p + 964 1027 p + 967 1027 p + 970 1027 p + 1003 1027 p + 1008 1027 p + 229 1026 p + 968 1026 p + 969 1026 p + 970 1026 p + 973 1026 p + 1007 1026 p + 1011 1026 p + 230 1025 p + 971 1025 p + 972 1025 p + 973 1025 p + 976 1025 p + 1010 1025 p + 1014 1025 p + 231 1024 p + 974 1024 p + 975 1024 p + 976 1024 p + 978 1024 p + 1013 1024 p + 1017 1024 p + 232 1023 p + 977 1023 p + 978 1023 p + 979 1023 p + 981 1023 p + 1016 1023 p + 1019 1023 p + 233 1022 p + 980 1022 p + 981 1022 p + 982 1022 p + 984 1022 p + 1020 1022 p + 1022 1022 p + 234 1021 p + 983 1021 p + 984 1021 p + 985 1021 p + 987 1021 p + 1024 1021 p + 1025 1021 p + 235 1020 p + 986 1020 p + 987 1020 p + 988 1020 p + 990 1020 p + 1027 1020 p + 1028 1020 p + 236 1019 p + 989 1019 p + 990 1019 p + 991 1019 p + 993 1019 p + 1030 1019 p + 1031 1019 p + 237 1018 p + 992 1018 p + 993 1018 p + 994 1018 p + 996 1018 p + 1033 1018 p + 1034 1018 p + 238 1017 p + 995 1017 p + 996 1017 p + 997 1017 p + 999 1017 p + 1036 1017 p + 1037 1017 p + 239 1016 p + 998 1016 p + 999 1016 p + 1000 1016 p + 1039 1016 p + 240 1015 p + 1005 1015 p + 1006 1015 p + 1043 1015 p + 1045 1015 p + 241 1014 p + 1003 1014 p + 1004 1014 p + 1005 1014 p + 1009 1014 p + 1042 1014 p + 1047 1014 p + 242 1013 p + 1007 1013 p + 1008 1013 p + 1009 1013 p + 1012 1013 p + 1046 1013 p + 1050 1013 p + 243 1012 p + 1010 1012 p + 1011 1012 p + 1012 1012 p + 1015 1012 p + 1049 1012 p + 1053 1012 p + 244 1011 p + 1013 1011 p + 1014 1011 p + 1015 1011 p + 1018 1011 p + 1052 1011 p + 1056 1011 p + 245 1010 p + 1016 1010 p + 1017 1010 p + 1018 1010 p + 1021 1010 p + 1055 1010 p + 1059 1010 p + 246 1009 p + 1020 1009 p + 1019 1009 p + 1021 1009 p + 1023 1009 p + 1058 1009 p + 1061 1009 p + 247 1008 p + 1022 1008 p + 1023 1008 p + 1024 1008 p + 1026 1008 p + 1062 1008 p + 1064 1008 p + 248 1007 p + 1025 1007 p + 1026 1007 p + 1027 1007 p + 1029 1007 p + 1066 1007 p + 1067 1007 p + 249 1006 p + 1028 1006 p + 1029 1006 p + 1030 1006 p + 1032 1006 p + 1069 1006 p + 1070 1006 p + 250 1005 p + 1031 1005 p + 1032 1005 p + 1033 1005 p + 1035 1005 p + 1072 1005 p + 1073 1005 p + 251 1004 p + 1034 1004 p + 1035 1004 p + 1036 1004 p + 1038 1004 p + 1075 1004 p + 1076 1004 p + 252 1003 p + 1037 1003 p + 1038 1003 p + 1039 1003 p + 1078 1003 p + 253 1002 p + 1044 1002 p + 1045 1002 p + 1085 1002 p + 254 1001 p + 1042 1001 p + 1043 1001 p + 1044 1001 p + 1048 1001 p + 1084 1001 p + 1087 1001 p + 255 1000 p + 1046 1000 p + 1047 1000 p + 1048 1000 p + 1051 1000 p + 1086 1000 p + 1090 1000 p + 256 999 p + 1049 999 p + 1050 999 p + 1051 999 p + 1054 999 p + 1089 999 p + 1093 999 p + 257 998 p + 1052 998 p + 1053 998 p + 1054 998 p + 1057 998 p + 1092 998 p + 1096 998 p + 258 997 p + 1055 997 p + 1056 997 p + 1057 997 p + 1060 997 p + 1095 997 p + 1099 997 p + 259 996 p + 1058 996 p + 1059 996 p + 1060 996 p + 1063 996 p + 1098 996 p + 1102 996 p + 260 995 p + 1062 995 p + 1061 995 p + 1063 995 p + 1065 995 p + 1101 995 p + 1104 995 p + 261 994 p + 1064 994 p + 1065 994 p + 1066 994 p + 1068 994 p + 1105 994 p + 1107 994 p + 262 993 p + 1067 993 p + 1068 993 p + 1069 993 p + 1071 993 p + 1109 993 p + 1110 993 p + 263 992 p + 1070 992 p + 1071 992 p + 1072 992 p + 1074 992 p + 1112 992 p + 1113 992 p + 264 991 p + 1073 991 p + 1074 991 p + 1075 991 p + 1077 991 p + 1115 991 p + 1116 991 p + 265 990 p + 1076 990 p + 1077 990 p + 1078 990 p + 1118 990 p + 1120 990 p + 266 989 p + 1084 989 p + 1085 989 p + 1088 989 p + 1123 989 p + 267 988 p + 1086 988 p + 1087 988 p + 1088 988 p + 1091 988 p + 1122 988 p + 1125 988 p + 268 987 p + 1089 987 p + 1090 987 p + 1091 987 p + 1094 987 p + 1124 987 p + 1128 987 p + 269 986 p + 1092 986 p + 1093 986 p + 1094 986 p + 1097 986 p + 1127 986 p + 1131 986 p + 270 985 p + 1095 985 p + 1096 985 p + 1097 985 p + 1100 985 p + 1130 985 p + 1134 985 p + 271 984 p + 1098 984 p + 1099 984 p + 1100 984 p + 1103 984 p + 1133 984 p + 1137 984 p + 272 983 p + 1101 983 p + 1102 983 p + 1103 983 p + 1106 983 p + 1136 983 p + 1140 983 p + 273 982 p + 1105 982 p + 1104 982 p + 1106 982 p + 1108 982 p + 1139 982 p + 1143 982 p + 274 981 p + 1107 981 p + 1108 981 p + 1109 981 p + 1111 981 p + 1142 981 p + 1145 981 p + 275 980 p + 1110 980 p + 1111 980 p + 1112 980 p + 1114 980 p + 1146 980 p + 1148 980 p + 276 979 p + 1113 979 p + 1114 979 p + 1115 979 p + 1117 979 p + 1149 979 p + 1151 979 p + 277 978 p + 1116 978 p + 1117 978 p + 1118 978 p + 1119 978 p + 1153 978 p + 1154 978 p + 1156 978 p + 278 977 p + 1120 977 p + 1119 977 p + 1158 977 p + 1162 977 p + 279 976 p + 1122 976 p + 1123 976 p + 1126 976 p + 1169 976 p + 280 975 p + 1124 975 p + 1125 975 p + 1126 975 p + 1129 975 p + 1168 975 p + 1171 975 p + 281 974 p + 1127 974 p + 1128 974 p + 1129 974 p + 1132 974 p + 1170 974 p + 1174 974 p + 282 973 p + 1130 973 p + 1131 973 p + 1132 973 p + 1135 973 p + 1173 973 p + 1177 973 p + 283 972 p + 1133 972 p + 1134 972 p + 1135 972 p + 1138 972 p + 1176 972 p + 1180 972 p + 284 971 p + 1136 971 p + 1137 971 p + 1138 971 p + 1141 971 p + 1179 971 p + 1183 971 p + 285 970 p + 1139 970 p + 1140 970 p + 1141 970 p + 1144 970 p + 1182 970 p + 1186 970 p + 286 969 p + 1142 969 p + 1143 969 p + 1144 969 p + 1147 969 p + 1185 969 p + 1189 969 p + 287 968 p + 1146 968 p + 1145 968 p + 1147 968 p + 1150 968 p + 1188 968 p + 1191 968 p + 288 967 p + 1149 967 p + 1148 967 p + 1150 967 p + 1152 967 p + 1192 967 p + 1196 967 p + 289 966 p + 1151 966 p + 1152 966 p + 1153 966 p + 1155 966 p + 1194 966 p + 290 965 p + 1154 965 p + 1155 965 p + 1157 965 p + 1195 965 p + 1200 965 p + 291 964 p + 1156 964 p + 1157 964 p + 1158 964 p + 1160 964 p + 1159 964 p + 1198 964 p + 292 963 p + 1159 963 p + 1161 963 p + 1162 963 p + 293 962 p + 1168 962 p + 1169 962 p + 1172 962 p + 1204 962 p + 294 961 p + 1170 961 p + 1171 961 p + 1172 961 p + 1175 961 p + 1203 961 p + 1206 961 p + 295 960 p + 1173 960 p + 1174 960 p + 1175 960 p + 1178 960 p + 1205 960 p + 1209 960 p + 296 959 p + 1176 959 p + 1177 959 p + 1178 959 p + 1181 959 p + 1208 959 p + 1212 959 p + 297 958 p + 1179 958 p + 1180 958 p + 1181 958 p + 1184 958 p + 1211 958 p + 1215 958 p + 298 957 p + 1182 957 p + 1183 957 p + 1184 957 p + 1187 957 p + 1214 957 p + 1218 957 p + 299 956 p + 1185 956 p + 1186 956 p + 1187 956 p + 1190 956 p + 1217 956 p + 1221 956 p + 300 955 p + 1188 955 p + 1189 955 p + 1190 955 p + 1193 955 p + 1220 955 p + 1223 955 p + 301 954 p + 1192 954 p + 1191 954 p + 1193 954 p + 1197 954 p + 1224 954 p + 1226 954 p + 302 953 p + 1195 953 p + 1194 953 p + 1196 953 p + 1197 953 p + 1201 953 p + 1227 953 p + 1229 953 p + 303 952 p + 1199 952 p + 1198 952 p + 1200 952 p + 1201 952 p + 1230 952 p + 304 951 p + 1203 951 p + 1204 951 p + 1207 951 p + 1237 951 p + 305 950 p + 1205 950 p + 1206 950 p + 1207 950 p + 1210 950 p + 1236 950 p + 1239 950 p + 306 949 p + 1208 949 p + 1209 949 p + 1210 949 p + 1213 949 p + 1238 949 p + 1242 949 p + 307 948 p + 1211 948 p + 1212 948 p + 1213 948 p + 1216 948 p + 1241 948 p + 1245 948 p + 308 947 p + 1214 947 p + 1215 947 p + 1216 947 p + 1219 947 p + 1244 947 p + 1247 947 p + 309 946 p + 1217 946 p + 1218 946 p + 1219 946 p + 1222 946 p + 1246 946 p + 1249 946 p + 310 945 p + 1220 945 p + 1221 945 p + 1222 945 p + 1225 945 p + 1248 945 p + 1251 945 p + 311 944 p + 1224 944 p + 1223 944 p + 1225 944 p + 1228 944 p + 1250 944 p + 1254 944 p + 312 943 p + 1227 943 p + 1226 943 p + 1228 943 p + 1231 943 p + 1253 943 p + 313 942 p + 1230 942 p + 1229 942 p + 1231 942 p + 1252 942 p + 314 941 p + 1236 941 p + 1237 941 p + 1240 941 p + 1255 941 p + 315 940 p + 1235 940 p + 1234 940 p + 1238 940 p + 1239 940 p + 1240 940 p + 1243 940 p + 316 939 p + 1166 939 p + 1165 939 p + 1167 939 p + 1241 939 p + 1242 939 p + 1243 939 p + 317 938 p + 1082 938 p + 1081 938 p + 1083 938 p + 1167 938 p + 1244 938 p + 1245 938 p + 318 937 p + 1002 937 p + 1001 937 p + 1040 937 p + 1083 937 p + 1246 937 p + 1247 937 p + 319 936 p + 922 936 p + 921 936 p + 960 936 p + 1040 936 p + 1248 936 p + 1249 936 p + 320 935 p + 847 935 p + 846 935 p + 848 935 p + 960 935 p + 1250 935 p + 1251 935 p + 321 934 p + 819 934 p + 818 934 p + 848 934 p + 1252 934 p + 1253 934 p + 1254 934 p + 322 933 p + 1233 933 p + 1232 933 p + 1235 933 p + 1255 933 p + 323 932 p + 1164 932 p + 1163 932 p + 1166 932 p + 1202 932 p + 1232 932 p + 1234 932 p + 324 931 p + 1080 931 p + 1079 931 p + 1082 931 p + 1121 931 p + 1163 931 p + 1165 931 p + 325 930 p + 963 930 p + 962 930 p + 1002 930 p + 1041 930 p + 1079 930 p + 1081 930 p + 326 929 p + 920 929 p + 919 929 p + 922 929 p + 961 929 p + 962 929 p + 1001 929 p + 327 928 p + 845 928 p + 844 928 p + 847 928 p + 882 928 p + 919 928 p + 921 928 p + 328 927 p + 798 927 p + 800 927 p + 819 927 p + 820 927 p + 844 927 p + 846 927 p + 329 926 p + 800 926 p + 799 926 p + 818 926 p + 330 925 p + 331 925 p + 332 925 p + 333 925 p + 334 925 p + 4 925 p + 12 925 p + 330 924 p + 331 924 p + 332 924 p + 338 924 p + 335 924 p + 12 924 p + 5 924 p + 330 923 p + 331 923 p + 332 923 p + 1164 923 p + 1202 923 p + 4 923 p + 5 923 p + 333 922 p + 334 922 p + 330 922 p + 4 922 p + 11 922 p + 333 921 p + 334 921 p + 330 921 p + 357 921 p + 358 921 p + 11 921 p + 12 921 p + 335 920 p + 336 920 p + 337 920 p + 331 920 p + 338 920 p + 5 920 p + 13 920 p + 335 919 p + 336 919 p + 337 919 p + 342 919 p + 339 919 p + 13 919 p + 6 919 p + 335 918 p + 336 918 p + 337 918 p + 1080 918 p + 1121 918 p + 5 918 p + 6 918 p + 331 917 p + 338 917 p + 335 917 p + 361 917 p + 362 917 p + 12 917 p + 13 917 p + 339 916 p + 340 916 p + 341 916 p + 336 916 p + 342 916 p + 6 916 p + 14 916 p + 339 915 p + 340 915 p + 341 915 p + 346 915 p + 343 915 p + 14 915 p + 7 915 p + 339 914 p + 340 914 p + 341 914 p + 963 914 p + 1041 914 p + 6 914 p + 7 914 p + 336 913 p + 342 913 p + 339 913 p + 364 913 p + 365 913 p + 13 913 p + 14 913 p + 343 912 p + 344 912 p + 345 912 p + 340 912 p + 346 912 p + 7 912 p + 15 912 p + 343 911 p + 344 911 p + 345 911 p + 350 911 p + 347 911 p + 15 911 p + 8 911 p + 343 910 p + 344 910 p + 345 910 p + 920 910 p + 961 910 p + 7 910 p + 8 910 p + 340 909 p + 346 909 p + 343 909 p + 367 909 p + 368 909 p + 14 909 p + 15 909 p + 347 908 p + 348 908 p + 349 908 p + 344 908 p + 350 908 p + 8 908 p + 16 908 p + 347 907 p + 348 907 p + 349 907 p + 354 907 p + 351 907 p + 16 907 p + 9 907 p + 347 906 p + 348 906 p + 349 906 p + 845 906 p + 882 906 p + 8 906 p + 9 906 p + 344 905 p + 350 905 p + 347 905 p + 370 905 p + 371 905 p + 15 905 p + 16 905 p + 351 904 p + 352 904 p + 353 904 p + 348 904 p + 354 904 p + 9 904 p + 17 904 p + 351 903 p + 352 903 p + 353 903 p + 355 903 p + 356 903 p + 17 903 p + 10 903 p + 351 902 p + 352 902 p + 353 902 p + 798 902 p + 820 902 p + 9 902 p + 10 902 p + 348 901 p + 354 901 p + 351 901 p + 373 901 p + 374 901 p + 16 901 p + 17 901 p + 355 900 p + 356 900 p + 352 900 p + 376 900 p + 377 900 p + 17 900 p + 18 900 p + 355 899 p + 356 899 p + 352 899 p + 18 899 p + 10 899 p + 357 898 p + 358 898 p + 334 898 p + 359 898 p + 360 898 p + 11 898 p + 20 898 p + 357 897 p + 358 897 p + 334 897 p + 363 897 p + 361 897 p + 20 897 p + 12 897 p + 359 896 p + 360 896 p + 357 896 p + 11 896 p + 19 896 p + 359 895 p + 360 895 p + 357 895 p + 379 895 p + 380 895 p + 19 895 p + 20 895 p + 361 894 p + 362 894 p + 338 894 p + 358 894 p + 363 894 p + 12 894 p + 21 894 p + 361 893 p + 362 893 p + 338 893 p + 366 893 p + 364 893 p + 21 893 p + 13 893 p + 358 892 p + 363 892 p + 361 892 p + 383 892 p + 384 892 p + 20 892 p + 21 892 p + 364 891 p + 365 891 p + 342 891 p + 362 891 p + 366 891 p + 13 891 p + 22 891 p + 364 890 p + 365 890 p + 342 890 p + 369 890 p + 367 890 p + 22 890 p + 14 890 p + 362 889 p + 366 889 p + 364 889 p + 386 889 p + 387 889 p + 21 889 p + 22 889 p + 367 888 p + 368 888 p + 346 888 p + 365 888 p + 369 888 p + 14 888 p + 23 888 p + 367 887 p + 368 887 p + 346 887 p + 372 887 p + 370 887 p + 23 887 p + 15 887 p + 365 886 p + 369 886 p + 367 886 p + 389 886 p + 390 886 p + 22 886 p + 23 886 p + 370 885 p + 371 885 p + 350 885 p + 368 885 p + 372 885 p + 15 885 p + 24 885 p + 370 884 p + 371 884 p + 350 884 p + 375 884 p + 373 884 p + 24 884 p + 16 884 p + 368 883 p + 372 883 p + 370 883 p + 392 883 p + 393 883 p + 23 883 p + 24 883 p + 373 882 p + 374 882 p + 354 882 p + 371 882 p + 375 882 p + 16 882 p + 25 882 p + 373 881 p + 374 881 p + 354 881 p + 378 881 p + 376 881 p + 25 881 p + 17 881 p + 371 880 p + 375 880 p + 373 880 p + 395 880 p + 396 880 p + 24 880 p + 25 880 p + 376 879 p + 377 879 p + 355 879 p + 374 879 p + 378 879 p + 17 879 p + 26 879 p + 376 878 p + 377 878 p + 355 878 p + 26 878 p + 18 878 p + 374 877 p + 378 877 p + 376 877 p + 398 877 p + 399 877 p + 25 877 p + 26 877 p + 379 876 p + 380 876 p + 360 876 p + 381 876 p + 382 876 p + 19 876 p + 28 876 p + 379 875 p + 380 875 p + 360 875 p + 385 875 p + 383 875 p + 28 875 p + 20 875 p + 381 874 p + 382 874 p + 379 874 p + 19 874 p + 27 874 p + 381 873 p + 382 873 p + 379 873 p + 405 873 p + 406 873 p + 27 873 p + 28 873 p + 383 872 p + 384 872 p + 363 872 p + 380 872 p + 385 872 p + 20 872 p + 29 872 p + 383 871 p + 384 871 p + 363 871 p + 388 871 p + 386 871 p + 29 871 p + 21 871 p + 380 870 p + 385 870 p + 383 870 p + 409 870 p + 410 870 p + 28 870 p + 29 870 p + 386 869 p + 387 869 p + 366 869 p + 384 869 p + 388 869 p + 21 869 p + 30 869 p + 386 868 p + 387 868 p + 366 868 p + 391 868 p + 389 868 p + 30 868 p + 22 868 p + 384 867 p + 388 867 p + 386 867 p + 412 867 p + 413 867 p + 29 867 p + 30 867 p + 389 866 p + 390 866 p + 369 866 p + 387 866 p + 391 866 p + 22 866 p + 31 866 p + 389 865 p + 390 865 p + 369 865 p + 394 865 p + 392 865 p + 31 865 p + 23 865 p + 387 864 p + 391 864 p + 389 864 p + 415 864 p + 416 864 p + 30 864 p + 31 864 p + 392 863 p + 393 863 p + 372 863 p + 390 863 p + 394 863 p + 23 863 p + 32 863 p + 392 862 p + 393 862 p + 372 862 p + 397 862 p + 395 862 p + 32 862 p + 24 862 p + 390 861 p + 394 861 p + 392 861 p + 418 861 p + 419 861 p + 31 861 p + 32 861 p + 395 860 p + 396 860 p + 375 860 p + 393 860 p + 397 860 p + 24 860 p + 33 860 p + 395 859 p + 396 859 p + 375 859 p + 400 859 p + 398 859 p + 33 859 p + 25 859 p + 393 858 p + 397 858 p + 395 858 p + 421 858 p + 422 858 p + 32 858 p + 33 858 p + 398 857 p + 399 857 p + 378 857 p + 396 857 p + 400 857 p + 25 857 p + 34 857 p + 398 856 p + 399 856 p + 378 856 p + 401 856 p + 402 856 p + 34 856 p + 26 856 p + 396 855 p + 400 855 p + 398 855 p + 424 855 p + 425 855 p + 33 855 p + 34 855 p + 401 854 p + 402 854 p + 399 854 p + 427 854 p + 428 854 p + 34 854 p + 35 854 p + 401 853 p + 402 853 p + 399 853 p + 403 853 p + 404 853 p + 35 853 p + 26 853 p + 403 852 p + 404 852 p + 402 852 p + 430 852 p + 431 852 p + 35 852 p + 36 852 p + 403 851 p + 404 851 p + 402 851 p + 36 851 p + 26 851 p + 405 850 p + 382 850 p + 406 850 p + 411 850 p + 410 850 p + 38 850 p + 28 850 p + 405 849 p + 382 849 p + 406 849 p + 407 849 p + 408 849 p + 38 849 p + 27 849 p + 407 848 p + 406 848 p + 408 848 p + 435 848 p + 436 848 p + 37 848 p + 38 848 p + 407 847 p + 406 847 p + 408 847 p + 37 847 p + 27 847 p + 409 846 p + 385 846 p + 410 846 p + 414 846 p + 413 846 p + 39 846 p + 29 846 p + 409 845 p + 385 845 p + 410 845 p + 411 845 p + 405 845 p + 39 845 p + 28 845 p + 411 844 p + 410 844 p + 405 844 p + 439 844 p + 440 844 p + 38 844 p + 39 844 p + 412 843 p + 388 843 p + 413 843 p + 417 843 p + 415 843 p + 40 843 p + 30 843 p + 412 842 p + 388 842 p + 413 842 p + 414 842 p + 409 842 p + 40 842 p + 29 842 p + 414 841 p + 413 841 p + 409 841 p + 442 841 p + 443 841 p + 39 841 p + 40 841 p + 415 840 p + 416 840 p + 391 840 p + 412 840 p + 417 840 p + 30 840 p + 41 840 p + 415 839 p + 416 839 p + 391 839 p + 420 839 p + 418 839 p + 41 839 p + 31 839 p + 412 838 p + 417 838 p + 415 838 p + 445 838 p + 446 838 p + 40 838 p + 41 838 p + 418 837 p + 419 837 p + 394 837 p + 416 837 p + 420 837 p + 31 837 p + 42 837 p + 418 836 p + 419 836 p + 394 836 p + 423 836 p + 421 836 p + 42 836 p + 32 836 p + 416 835 p + 420 835 p + 418 835 p + 448 835 p + 449 835 p + 41 835 p + 42 835 p + 421 834 p + 422 834 p + 397 834 p + 419 834 p + 423 834 p + 32 834 p + 43 834 p + 421 833 p + 422 833 p + 397 833 p + 426 833 p + 424 833 p + 43 833 p + 33 833 p + 419 832 p + 423 832 p + 421 832 p + 451 832 p + 452 832 p + 42 832 p + 43 832 p + 424 831 p + 425 831 p + 400 831 p + 422 831 p + 426 831 p + 33 831 p + 44 831 p + 424 830 p + 425 830 p + 400 830 p + 429 830 p + 427 830 p + 44 830 p + 34 830 p + 422 829 p + 426 829 p + 424 829 p + 454 829 p + 455 829 p + 43 829 p + 44 829 p + 427 828 p + 428 828 p + 401 828 p + 425 828 p + 429 828 p + 34 828 p + 45 828 p + 427 827 p + 428 827 p + 401 827 p + 432 827 p + 430 827 p + 45 827 p + 35 827 p + 425 826 p + 429 826 p + 427 826 p + 457 826 p + 458 826 p + 44 826 p + 45 826 p + 430 825 p + 431 825 p + 403 825 p + 428 825 p + 432 825 p + 35 825 p + 46 825 p + 430 824 p + 431 824 p + 403 824 p + 433 824 p + 434 824 p + 46 824 p + 36 824 p + 428 823 p + 432 823 p + 430 823 p + 460 823 p + 461 823 p + 45 823 p + 46 823 p + 433 822 p + 434 822 p + 431 822 p + 465 822 p + 466 822 p + 46 822 p + 47 822 p + 433 821 p + 434 821 p + 431 821 p + 47 821 p + 36 821 p + 435 820 p + 407 820 p + 436 820 p + 441 820 p + 440 820 p + 49 820 p + 38 820 p + 435 819 p + 407 819 p + 436 819 p + 437 819 p + 438 819 p + 49 819 p + 37 819 p + 437 818 p + 436 818 p + 438 818 p + 474 818 p + 475 818 p + 48 818 p + 49 818 p + 437 817 p + 436 817 p + 438 817 p + 48 817 p + 37 817 p + 439 816 p + 411 816 p + 440 816 p + 444 816 p + 443 816 p + 50 816 p + 39 816 p + 439 815 p + 411 815 p + 440 815 p + 441 815 p + 435 815 p + 50 815 p + 38 815 p + 441 814 p + 440 814 p + 435 814 p + 478 814 p + 479 814 p + 49 814 p + 50 814 p + 442 813 p + 414 813 p + 443 813 p + 447 813 p + 446 813 p + 51 813 p + 40 813 p + 442 812 p + 414 812 p + 443 812 p + 444 812 p + 439 812 p + 51 812 p + 39 812 p + 444 811 p + 443 811 p + 439 811 p + 481 811 p + 482 811 p + 50 811 p + 51 811 p + 445 810 p + 417 810 p + 446 810 p + 450 810 p + 449 810 p + 52 810 p + 41 810 p + 445 809 p + 417 809 p + 446 809 p + 447 809 p + 442 809 p + 52 809 p + 40 809 p + 447 808 p + 446 808 p + 442 808 p + 484 808 p + 485 808 p + 51 808 p + 52 808 p + 448 807 p + 420 807 p + 449 807 p + 453 807 p + 452 807 p + 53 807 p + 42 807 p + 448 806 p + 420 806 p + 449 806 p + 450 806 p + 445 806 p + 53 806 p + 41 806 p + 450 805 p + 449 805 p + 445 805 p + 487 805 p + 488 805 p + 52 805 p + 53 805 p + 451 804 p + 423 804 p + 452 804 p + 456 804 p + 455 804 p + 54 804 p + 43 804 p + 451 803 p + 423 803 p + 452 803 p + 453 803 p + 448 803 p + 54 803 p + 42 803 p + 453 802 p + 452 802 p + 448 802 p + 490 802 p + 491 802 p + 53 802 p + 54 802 p + 454 801 p + 426 801 p + 455 801 p + 459 801 p + 457 801 p + 55 801 p + 44 801 p + 454 800 p + 426 800 p + 455 800 p + 456 800 p + 451 800 p + 55 800 p + 43 800 p + 456 799 p + 455 799 p + 451 799 p + 493 799 p + 494 799 p + 54 799 p + 55 799 p + 457 798 p + 458 798 p + 429 798 p + 454 798 p + 459 798 p + 44 798 p + 56 798 p + 457 797 p + 458 797 p + 429 797 p + 462 797 p + 460 797 p + 56 797 p + 45 797 p + 454 796 p + 459 796 p + 457 796 p + 496 796 p + 497 796 p + 55 796 p + 56 796 p + 460 795 p + 461 795 p + 432 795 p + 458 795 p + 462 795 p + 45 795 p + 57 795 p + 460 794 p + 461 794 p + 432 794 p + 463 794 p + 464 794 p + 57 794 p + 46 794 p + 458 793 p + 462 793 p + 460 793 p + 499 793 p + 500 793 p + 56 793 p + 57 793 p + 461 792 p + 463 792 p + 464 792 p + 502 792 p + 503 792 p + 57 792 p + 58 792 p + 461 791 p + 463 791 p + 464 791 p + 467 791 p + 465 791 p + 46 791 p + 58 791 p + 465 790 p + 466 790 p + 433 790 p + 464 790 p + 467 790 p + 46 790 p + 59 790 p + 465 789 p + 466 789 p + 433 789 p + 471 789 p + 470 789 p + 59 789 p + 47 789 p + 464 788 p + 467 788 p + 465 788 p + 506 788 p + 507 788 p + 58 788 p + 59 788 p + 468 787 p + 469 787 p + 470 787 p + 472 787 p + 473 787 p + 60 787 p + 2 787 p + 468 786 p + 469 786 p + 470 786 p + 2 786 p + 47 786 p + 468 785 p + 469 785 p + 470 785 p + 471 785 p + 466 785 p + 60 785 p + 47 785 p + 471 784 p + 470 784 p + 466 784 p + 505 784 p + 506 784 p + 59 784 p + 60 784 p + 472 783 p + 468 783 p + 473 783 p + 61 783 p + 2 783 p + 472 782 p + 468 782 p + 473 782 p + 509 782 p + 511 782 p + 61 782 p + 60 782 p + 474 781 p + 437 781 p + 475 781 p + 480 781 p + 479 781 p + 63 781 p + 49 781 p + 474 780 p + 437 780 p + 475 780 p + 476 780 p + 477 780 p + 63 780 p + 48 780 p + 476 779 p + 475 779 p + 477 779 p + 512 779 p + 513 779 p + 62 779 p + 63 779 p + 476 778 p + 475 778 p + 477 778 p + 62 778 p + 48 778 p + 478 777 p + 441 777 p + 479 777 p + 483 777 p + 482 777 p + 64 777 p + 50 777 p + 478 776 p + 441 776 p + 479 776 p + 480 776 p + 474 776 p + 64 776 p + 49 776 p + 480 775 p + 479 775 p + 474 775 p + 516 775 p + 517 775 p + 63 775 p + 64 775 p + 481 774 p + 444 774 p + 482 774 p + 486 774 p + 485 774 p + 65 774 p + 51 774 p + 481 773 p + 444 773 p + 482 773 p + 483 773 p + 478 773 p + 65 773 p + 50 773 p + 483 772 p + 482 772 p + 478 772 p + 519 772 p + 520 772 p + 64 772 p + 65 772 p + 484 771 p + 447 771 p + 485 771 p + 489 771 p + 488 771 p + 66 771 p + 52 771 p + 484 770 p + 447 770 p + 485 770 p + 486 770 p + 481 770 p + 66 770 p + 51 770 p + 486 769 p + 485 769 p + 481 769 p + 522 769 p + 523 769 p + 65 769 p + 66 769 p + 487 768 p + 450 768 p + 488 768 p + 492 768 p + 491 768 p + 67 768 p + 53 768 p + 487 767 p + 450 767 p + 488 767 p + 489 767 p + 484 767 p + 67 767 p + 52 767 p + 489 766 p + 488 766 p + 484 766 p + 525 766 p + 526 766 p + 66 766 p + 67 766 p + 490 765 p + 453 765 p + 491 765 p + 495 765 p + 494 765 p + 68 765 p + 54 765 p + 490 764 p + 453 764 p + 491 764 p + 492 764 p + 487 764 p + 68 764 p + 53 764 p + 492 763 p + 491 763 p + 487 763 p + 528 763 p + 529 763 p + 67 763 p + 68 763 p + 493 762 p + 456 762 p + 494 762 p + 498 762 p + 497 762 p + 69 762 p + 55 762 p + 493 761 p + 456 761 p + 494 761 p + 495 761 p + 490 761 p + 69 761 p + 54 761 p + 495 760 p + 494 760 p + 490 760 p + 531 760 p + 532 760 p + 68 760 p + 69 760 p + 496 759 p + 459 759 p + 497 759 p + 501 759 p + 500 759 p + 70 759 p + 56 759 p + 496 758 p + 459 758 p + 497 758 p + 498 758 p + 493 758 p + 70 758 p + 55 758 p + 498 757 p + 497 757 p + 493 757 p + 534 757 p + 535 757 p + 69 757 p + 70 757 p + 499 756 p + 462 756 p + 500 756 p + 504 756 p + 503 756 p + 71 756 p + 57 756 p + 499 755 p + 462 755 p + 500 755 p + 501 755 p + 496 755 p + 71 755 p + 56 755 p + 501 754 p + 500 754 p + 496 754 p + 537 754 p + 538 754 p + 70 754 p + 71 754 p + 502 753 p + 463 753 p + 503 753 p + 508 753 p + 507 753 p + 72 753 p + 58 753 p + 502 752 p + 463 752 p + 503 752 p + 504 752 p + 499 752 p + 72 752 p + 57 752 p + 504 751 p + 503 751 p + 499 751 p + 540 751 p + 541 751 p + 71 751 p + 72 751 p + 505 750 p + 471 750 p + 506 750 p + 509 750 p + 510 750 p + 73 750 p + 60 750 p + 505 749 p + 471 749 p + 506 749 p + 467 749 p + 507 749 p + 73 749 p + 59 749 p + 506 748 p + 467 748 p + 507 748 p + 508 748 p + 502 748 p + 73 748 p + 58 748 p + 508 747 p + 507 747 p + 502 747 p + 543 747 p + 544 747 p + 72 747 p + 73 747 p + 509 746 p + 505 746 p + 510 746 p + 473 746 p + 511 746 p + 74 746 p + 60 746 p + 509 745 p + 505 745 p + 510 745 p + 546 745 p + 547 745 p + 74 745 p + 73 745 p + 473 744 p + 509 744 p + 511 744 p + 61 744 p + 74 744 p + 512 743 p + 476 743 p + 513 743 p + 518 743 p + 517 743 p + 76 743 p + 63 743 p + 512 742 p + 476 742 p + 513 742 p + 514 742 p + 515 742 p + 76 742 p + 62 742 p + 514 741 p + 513 741 p + 515 741 p + 549 741 p + 550 741 p + 75 741 p + 76 741 p + 514 740 p + 513 740 p + 515 740 p + 75 740 p + 62 740 p + 516 739 p + 480 739 p + 517 739 p + 521 739 p + 520 739 p + 77 739 p + 64 739 p + 516 738 p + 480 738 p + 517 738 p + 518 738 p + 512 738 p + 77 738 p + 63 738 p + 518 737 p + 517 737 p + 512 737 p + 551 737 p + 552 737 p + 76 737 p + 77 737 p + 519 736 p + 483 736 p + 520 736 p + 524 736 p + 523 736 p + 78 736 p + 65 736 p + 519 735 p + 483 735 p + 520 735 p + 521 735 p + 516 735 p + 78 735 p + 64 735 p + 521 734 p + 520 734 p + 516 734 p + 554 734 p + 555 734 p + 77 734 p + 78 734 p + 522 733 p + 486 733 p + 523 733 p + 527 733 p + 526 733 p + 79 733 p + 66 733 p + 522 732 p + 486 732 p + 523 732 p + 524 732 p + 519 732 p + 79 732 p + 65 732 p + 524 731 p + 523 731 p + 519 731 p + 557 731 p + 558 731 p + 78 731 p + 79 731 p + 525 730 p + 489 730 p + 526 730 p + 530 730 p + 529 730 p + 80 730 p + 67 730 p + 525 729 p + 489 729 p + 526 729 p + 527 729 p + 522 729 p + 80 729 p + 66 729 p + 527 728 p + 526 728 p + 522 728 p + 560 728 p + 561 728 p + 79 728 p + 80 728 p + 528 727 p + 492 727 p + 529 727 p + 533 727 p + 532 727 p + 81 727 p + 68 727 p + 528 726 p + 492 726 p + 529 726 p + 530 726 p + 525 726 p + 81 726 p + 67 726 p + 530 725 p + 529 725 p + 525 725 p + 563 725 p + 564 725 p + 80 725 p + 81 725 p + 531 724 p + 495 724 p + 532 724 p + 536 724 p + 535 724 p + 82 724 p + 69 724 p + 531 723 p + 495 723 p + 532 723 p + 533 723 p + 528 723 p + 82 723 p + 68 723 p + 533 722 p + 532 722 p + 528 722 p + 566 722 p + 567 722 p + 81 722 p + 82 722 p + 534 721 p + 498 721 p + 535 721 p + 539 721 p + 538 721 p + 83 721 p + 70 721 p + 534 720 p + 498 720 p + 535 720 p + 536 720 p + 531 720 p + 83 720 p + 69 720 p + 536 719 p + 535 719 p + 531 719 p + 569 719 p + 570 719 p + 82 719 p + 83 719 p + 537 718 p + 501 718 p + 538 718 p + 542 718 p + 541 718 p + 84 718 p + 71 718 p + 537 717 p + 501 717 p + 538 717 p + 539 717 p + 534 717 p + 84 717 p + 70 717 p + 539 716 p + 538 716 p + 534 716 p + 572 716 p + 573 716 p + 83 716 p + 84 716 p + 540 715 p + 504 715 p + 541 715 p + 545 715 p + 544 715 p + 85 715 p + 72 715 p + 540 714 p + 504 714 p + 541 714 p + 542 714 p + 537 714 p + 85 714 p + 71 714 p + 542 713 p + 541 713 p + 537 713 p + 575 713 p + 576 713 p + 84 713 p + 85 713 p + 543 712 p + 508 712 p + 544 712 p + 548 712 p + 547 712 p + 86 712 p + 73 712 p + 543 711 p + 508 711 p + 544 711 p + 545 711 p + 540 711 p + 86 711 p + 72 711 p + 545 710 p + 544 710 p + 540 710 p + 578 710 p + 579 710 p + 85 710 p + 86 710 p + 546 709 p + 510 709 p + 547 709 p + 87 709 p + 74 709 p + 546 708 p + 510 708 p + 547 708 p + 548 708 p + 543 708 p + 87 708 p + 73 708 p + 548 707 p + 547 707 p + 543 707 p + 581 707 p + 582 707 p + 86 707 p + 87 707 p + 549 706 p + 514 706 p + 550 706 p + 553 706 p + 552 706 p + 88 706 p + 76 706 p + 549 705 p + 514 705 p + 550 705 p + 88 705 p + 75 705 p + 551 704 p + 518 704 p + 552 704 p + 556 704 p + 555 704 p + 89 704 p + 77 704 p + 551 703 p + 518 703 p + 552 703 p + 553 703 p + 549 703 p + 89 703 p + 76 703 p + 553 702 p + 552 702 p + 549 702 p + 586 702 p + 587 702 p + 88 702 p + 89 702 p + 554 701 p + 521 701 p + 555 701 p + 559 701 p + 558 701 p + 90 701 p + 78 701 p + 554 700 p + 521 700 p + 555 700 p + 556 700 p + 551 700 p + 90 700 p + 77 700 p + 556 699 p + 555 699 p + 551 699 p + 588 699 p + 589 699 p + 89 699 p + 90 699 p + 557 698 p + 524 698 p + 558 698 p + 562 698 p + 561 698 p + 91 698 p + 79 698 p + 557 697 p + 524 697 p + 558 697 p + 559 697 p + 554 697 p + 91 697 p + 78 697 p + 559 696 p + 558 696 p + 554 696 p + 591 696 p + 592 696 p + 90 696 p + 91 696 p + 560 695 p + 527 695 p + 561 695 p + 565 695 p + 564 695 p + 92 695 p + 80 695 p + 560 694 p + 527 694 p + 561 694 p + 562 694 p + 557 694 p + 92 694 p + 79 694 p + 562 693 p + 561 693 p + 557 693 p + 594 693 p + 595 693 p + 91 693 p + 92 693 p + 563 692 p + 530 692 p + 564 692 p + 568 692 p + 567 692 p + 93 692 p + 81 692 p + 563 691 p + 530 691 p + 564 691 p + 565 691 p + 560 691 p + 93 691 p + 80 691 p + 565 690 p + 564 690 p + 560 690 p + 597 690 p + 598 690 p + 92 690 p + 93 690 p + 566 689 p + 533 689 p + 567 689 p + 571 689 p + 570 689 p + 94 689 p + 82 689 p + 566 688 p + 533 688 p + 567 688 p + 568 688 p + 563 688 p + 94 688 p + 81 688 p + 568 687 p + 567 687 p + 563 687 p + 600 687 p + 601 687 p + 93 687 p + 94 687 p + 569 686 p + 536 686 p + 570 686 p + 574 686 p + 573 686 p + 95 686 p + 83 686 p + 569 685 p + 536 685 p + 570 685 p + 571 685 p + 566 685 p + 95 685 p + 82 685 p + 571 684 p + 570 684 p + 566 684 p + 603 684 p + 604 684 p + 94 684 p + 95 684 p + 572 683 p + 539 683 p + 573 683 p + 577 683 p + 576 683 p + 96 683 p + 84 683 p + 572 682 p + 539 682 p + 573 682 p + 574 682 p + 569 682 p + 96 682 p + 83 682 p + 574 681 p + 573 681 p + 569 681 p + 606 681 p + 607 681 p + 95 681 p + 96 681 p + 575 680 p + 542 680 p + 576 680 p + 580 680 p + 579 680 p + 97 680 p + 85 680 p + 575 679 p + 542 679 p + 576 679 p + 577 679 p + 572 679 p + 97 679 p + 84 679 p + 577 678 p + 576 678 p + 572 678 p + 609 678 p + 610 678 p + 96 678 p + 97 678 p + 578 677 p + 545 677 p + 579 677 p + 583 677 p + 582 677 p + 98 677 p + 86 677 p + 578 676 p + 545 676 p + 579 676 p + 580 676 p + 575 676 p + 98 676 p + 85 676 p + 580 675 p + 579 675 p + 575 675 p + 612 675 p + 613 675 p + 97 675 p + 98 675 p + 581 674 p + 548 674 p + 582 674 p + 584 674 p + 585 674 p + 99 674 p + 87 674 p + 581 673 p + 548 673 p + 582 673 p + 583 673 p + 578 673 p + 99 673 p + 86 673 p + 583 672 p + 582 672 p + 578 672 p + 615 672 p + 616 672 p + 98 672 p + 99 672 p + 584 671 p + 581 671 p + 585 671 p + 100 671 p + 87 671 p + 584 670 p + 581 670 p + 585 670 p + 618 670 p + 619 670 p + 100 670 p + 99 670 p + 586 669 p + 553 669 p + 587 669 p + 590 669 p + 589 669 p + 101 669 p + 89 669 p + 586 668 p + 553 668 p + 587 668 p + 101 668 p + 88 668 p + 588 667 p + 556 667 p + 589 667 p + 593 667 p + 592 667 p + 102 667 p + 90 667 p + 588 666 p + 556 666 p + 589 666 p + 590 666 p + 586 666 p + 102 666 p + 89 666 p + 590 665 p + 589 665 p + 586 665 p + 623 665 p + 624 665 p + 101 665 p + 102 665 p + 591 664 p + 559 664 p + 592 664 p + 596 664 p + 595 664 p + 103 664 p + 91 664 p + 591 663 p + 559 663 p + 592 663 p + 593 663 p + 588 663 p + 103 663 p + 90 663 p + 593 662 p + 592 662 p + 588 662 p + 625 662 p + 626 662 p + 102 662 p + 103 662 p + 594 661 p + 562 661 p + 595 661 p + 599 661 p + 598 661 p + 104 661 p + 92 661 p + 594 660 p + 562 660 p + 595 660 p + 596 660 p + 591 660 p + 104 660 p + 91 660 p + 596 659 p + 595 659 p + 591 659 p + 628 659 p + 629 659 p + 103 659 p + 104 659 p + 597 658 p + 565 658 p + 598 658 p + 602 658 p + 601 658 p + 105 658 p + 93 658 p + 597 657 p + 565 657 p + 598 657 p + 599 657 p + 594 657 p + 105 657 p + 92 657 p + 599 656 p + 598 656 p + 594 656 p + 631 656 p + 632 656 p + 104 656 p + 105 656 p + 600 655 p + 568 655 p + 601 655 p + 605 655 p + 604 655 p + 106 655 p + 94 655 p + 600 654 p + 568 654 p + 601 654 p + 602 654 p + 597 654 p + 106 654 p + 93 654 p + 602 653 p + 601 653 p + 597 653 p + 634 653 p + 635 653 p + 105 653 p + 106 653 p + 603 652 p + 571 652 p + 604 652 p + 608 652 p + 607 652 p + 107 652 p + 95 652 p + 603 651 p + 571 651 p + 604 651 p + 605 651 p + 600 651 p + 107 651 p + 94 651 p + 605 650 p + 604 650 p + 600 650 p + 637 650 p + 638 650 p + 106 650 p + 107 650 p + 606 649 p + 574 649 p + 607 649 p + 611 649 p + 610 649 p + 108 649 p + 96 649 p + 606 648 p + 574 648 p + 607 648 p + 608 648 p + 603 648 p + 108 648 p + 95 648 p + 608 647 p + 607 647 p + 603 647 p + 640 647 p + 641 647 p + 107 647 p + 108 647 p + 609 646 p + 577 646 p + 610 646 p + 614 646 p + 613 646 p + 109 646 p + 97 646 p + 609 645 p + 577 645 p + 610 645 p + 611 645 p + 606 645 p + 109 645 p + 96 645 p + 611 644 p + 610 644 p + 606 644 p + 643 644 p + 644 644 p + 108 644 p + 109 644 p + 612 643 p + 580 643 p + 613 643 p + 617 643 p + 616 643 p + 110 643 p + 98 643 p + 612 642 p + 580 642 p + 613 642 p + 614 642 p + 609 642 p + 110 642 p + 97 642 p + 614 641 p + 613 641 p + 609 641 p + 646 641 p + 647 641 p + 109 641 p + 110 641 p + 615 640 p + 583 640 p + 616 640 p + 620 640 p + 619 640 p + 111 640 p + 99 640 p + 615 639 p + 583 639 p + 616 639 p + 617 639 p + 612 639 p + 111 639 p + 98 639 p + 617 638 p + 616 638 p + 612 638 p + 649 638 p + 650 638 p + 110 638 p + 111 638 p + 618 637 p + 585 637 p + 619 637 p + 621 637 p + 622 637 p + 112 637 p + 100 637 p + 618 636 p + 585 636 p + 619 636 p + 620 636 p + 615 636 p + 112 636 p + 99 636 p + 620 635 p + 619 635 p + 615 635 p + 652 635 p + 653 635 p + 111 635 p + 112 635 p + 621 634 p + 618 634 p + 622 634 p + 113 634 p + 100 634 p + 621 633 p + 618 633 p + 622 633 p + 655 633 p + 656 633 p + 113 633 p + 112 633 p + 623 632 p + 590 632 p + 624 632 p + 627 632 p + 626 632 p + 114 632 p + 102 632 p + 623 631 p + 590 631 p + 624 631 p + 114 631 p + 101 631 p + 625 630 p + 593 630 p + 626 630 p + 630 630 p + 629 630 p + 115 630 p + 103 630 p + 625 629 p + 593 629 p + 626 629 p + 627 629 p + 623 629 p + 115 629 p + 102 629 p + 627 628 p + 626 628 p + 623 628 p + 660 628 p + 661 628 p + 114 628 p + 115 628 p + 628 627 p + 596 627 p + 629 627 p + 633 627 p + 632 627 p + 116 627 p + 104 627 p + 628 626 p + 596 626 p + 629 626 p + 630 626 p + 625 626 p + 116 626 p + 103 626 p + 630 625 p + 629 625 p + 625 625 p + 662 625 p + 663 625 p + 115 625 p + 116 625 p + 631 624 p + 599 624 p + 632 624 p + 636 624 p + 635 624 p + 117 624 p + 105 624 p + 631 623 p + 599 623 p + 632 623 p + 633 623 p + 628 623 p + 117 623 p + 104 623 p + 633 622 p + 632 622 p + 628 622 p + 665 622 p + 666 622 p + 116 622 p + 117 622 p + 634 621 p + 602 621 p + 635 621 p + 639 621 p + 638 621 p + 118 621 p + 106 621 p + 634 620 p + 602 620 p + 635 620 p + 636 620 p + 631 620 p + 118 620 p + 105 620 p + 636 619 p + 635 619 p + 631 619 p + 668 619 p + 669 619 p + 117 619 p + 118 619 p + 637 618 p + 605 618 p + 638 618 p + 642 618 p + 641 618 p + 119 618 p + 107 618 p + 637 617 p + 605 617 p + 638 617 p + 639 617 p + 634 617 p + 119 617 p + 106 617 p + 639 616 p + 638 616 p + 634 616 p + 671 616 p + 668 616 p + 118 616 p + 119 616 p + 640 615 p + 608 615 p + 641 615 p + 645 615 p + 644 615 p + 120 615 p + 108 615 p + 640 614 p + 608 614 p + 641 614 p + 642 614 p + 637 614 p + 120 614 p + 107 614 p + 642 613 p + 641 613 p + 637 613 p + 672 613 p + 673 613 p + 119 613 p + 120 613 p + 643 612 p + 611 612 p + 644 612 p + 648 612 p + 647 612 p + 121 612 p + 109 612 p + 643 611 p + 611 611 p + 644 611 p + 645 611 p + 640 611 p + 121 611 p + 108 611 p + 645 610 p + 644 610 p + 640 610 p + 675 610 p + 676 610 p + 120 610 p + 121 610 p + 646 609 p + 614 609 p + 647 609 p + 651 609 p + 650 609 p + 122 609 p + 110 609 p + 646 608 p + 614 608 p + 647 608 p + 648 608 p + 643 608 p + 122 608 p + 109 608 p + 648 607 p + 647 607 p + 643 607 p + 678 607 p + 679 607 p + 121 607 p + 122 607 p + 649 606 p + 617 606 p + 650 606 p + 654 606 p + 653 606 p + 123 606 p + 111 606 p + 649 605 p + 617 605 p + 650 605 p + 651 605 p + 646 605 p + 123 605 p + 110 605 p + 651 604 p + 650 604 p + 646 604 p + 681 604 p + 682 604 p + 122 604 p + 123 604 p + 652 603 p + 620 603 p + 653 603 p + 657 603 p + 656 603 p + 124 603 p + 112 603 p + 652 602 p + 620 602 p + 653 602 p + 654 602 p + 649 602 p + 124 602 p + 111 602 p + 654 601 p + 653 601 p + 649 601 p + 684 601 p + 685 601 p + 123 601 p + 124 601 p + 655 600 p + 622 600 p + 656 600 p + 658 600 p + 659 600 p + 125 600 p + 113 600 p + 655 599 p + 622 599 p + 656 599 p + 657 599 p + 652 599 p + 125 599 p + 112 599 p + 657 598 p + 656 598 p + 652 598 p + 687 598 p + 688 598 p + 124 598 p + 125 598 p + 658 597 p + 655 597 p + 659 597 p + 126 597 p + 113 597 p + 658 596 p + 655 596 p + 659 596 p + 692 596 p + 693 596 p + 126 596 p + 125 596 p + 660 595 p + 627 595 p + 661 595 p + 664 595 p + 663 595 p + 127 595 p + 115 595 p + 660 594 p + 627 594 p + 661 594 p + 127 594 p + 114 594 p + 662 593 p + 630 593 p + 663 593 p + 667 593 p + 666 593 p + 128 593 p + 116 593 p + 662 592 p + 630 592 p + 663 592 p + 664 592 p + 660 592 p + 128 592 p + 115 592 p + 664 591 p + 663 591 p + 660 591 p + 697 591 p + 698 591 p + 127 591 p + 128 591 p + 665 590 p + 633 590 p + 666 590 p + 670 590 p + 669 590 p + 129 590 p + 117 590 p + 665 589 p + 633 589 p + 666 589 p + 667 589 p + 662 589 p + 129 589 p + 116 589 p + 667 588 p + 666 588 p + 662 588 p + 699 588 p + 697 588 p + 128 588 p + 129 588 p + 668 587 p + 636 587 p + 669 587 p + 671 587 p + 639 587 p + 130 587 p + 118 587 p + 668 586 p + 636 586 p + 669 586 p + 670 586 p + 665 586 p + 130 586 p + 117 586 p + 670 585 p + 669 585 p + 665 585 p + 700 585 p + 701 585 p + 129 585 p + 130 585 p + 671 584 p + 639 584 p + 668 584 p + 674 584 p + 673 584 p + 130 584 p + 119 584 p + 672 583 p + 642 583 p + 673 583 p + 677 583 p + 676 583 p + 131 583 p + 120 583 p + 672 582 p + 642 582 p + 673 582 p + 674 582 p + 671 582 p + 131 582 p + 119 582 p + 674 581 p + 673 581 p + 671 581 p + 703 581 p + 704 581 p + 130 581 p + 131 581 p + 675 580 p + 645 580 p + 676 580 p + 680 580 p + 679 580 p + 132 580 p + 121 580 p + 675 579 p + 645 579 p + 676 579 p + 677 579 p + 672 579 p + 132 579 p + 120 579 p + 677 578 p + 676 578 p + 672 578 p + 706 578 p + 707 578 p + 131 578 p + 132 578 p + 678 577 p + 648 577 p + 679 577 p + 683 577 p + 682 577 p + 133 577 p + 122 577 p + 678 576 p + 648 576 p + 679 576 p + 680 576 p + 675 576 p + 133 576 p + 121 576 p + 680 575 p + 679 575 p + 675 575 p + 709 575 p + 710 575 p + 132 575 p + 133 575 p + 681 574 p + 651 574 p + 682 574 p + 686 574 p + 685 574 p + 134 574 p + 123 574 p + 681 573 p + 651 573 p + 682 573 p + 683 573 p + 678 573 p + 134 573 p + 122 573 p + 683 572 p + 682 572 p + 678 572 p + 712 572 p + 713 572 p + 133 572 p + 134 572 p + 684 571 p + 654 571 p + 685 571 p + 689 571 p + 688 571 p + 135 571 p + 124 571 p + 684 570 p + 654 570 p + 685 570 p + 686 570 p + 681 570 p + 135 570 p + 123 570 p + 686 569 p + 685 569 p + 681 569 p + 715 569 p + 716 569 p + 134 569 p + 135 569 p + 687 568 p + 657 568 p + 688 568 p + 690 568 p + 691 568 p + 136 568 p + 125 568 p + 687 567 p + 657 567 p + 688 567 p + 689 567 p + 684 567 p + 136 567 p + 124 567 p + 689 566 p + 688 566 p + 684 566 p + 718 566 p + 719 566 p + 135 566 p + 136 566 p + 690 565 p + 691 565 p + 687 565 p + 721 565 p + 722 565 p + 136 565 p + 137 565 p + 690 564 p + 691 564 p + 687 564 p + 694 564 p + 693 564 p + 137 564 p + 125 564 p + 692 563 p + 659 563 p + 693 563 p + 695 563 p + 696 563 p + 138 563 p + 126 563 p + 692 562 p + 659 562 p + 693 562 p + 694 562 p + 691 562 p + 138 562 p + 125 562 p + 694 561 p + 693 561 p + 691 561 p + 724 561 p + 725 561 p + 137 561 p + 138 561 p + 695 560 p + 692 560 p + 696 560 p + 139 560 p + 126 560 p + 695 559 p + 692 559 p + 696 559 p + 727 559 p + 728 559 p + 139 559 p + 138 559 p + 697 558 p + 664 558 p + 698 558 p + 699 558 p + 667 558 p + 140 558 p + 128 558 p + 697 557 p + 664 557 p + 698 557 p + 140 557 p + 127 557 p + 699 556 p + 667 556 p + 697 556 p + 702 556 p + 701 556 p + 140 556 p + 129 556 p + 700 555 p + 670 555 p + 701 555 p + 705 555 p + 704 555 p + 141 555 p + 130 555 p + 700 554 p + 670 554 p + 701 554 p + 702 554 p + 699 554 p + 141 554 p + 129 554 p + 702 553 p + 701 553 p + 699 553 p + 734 553 p + 735 553 p + 140 553 p + 141 553 p + 703 552 p + 674 552 p + 704 552 p + 708 552 p + 707 552 p + 142 552 p + 131 552 p + 703 551 p + 674 551 p + 704 551 p + 705 551 p + 700 551 p + 142 551 p + 130 551 p + 705 550 p + 704 550 p + 700 550 p + 736 550 p + 734 550 p + 141 550 p + 142 550 p + 706 549 p + 677 549 p + 707 549 p + 711 549 p + 710 549 p + 143 549 p + 132 549 p + 706 548 p + 677 548 p + 707 548 p + 708 548 p + 703 548 p + 143 548 p + 131 548 p + 708 547 p + 707 547 p + 703 547 p + 737 547 p + 738 547 p + 142 547 p + 143 547 p + 709 546 p + 680 546 p + 710 546 p + 714 546 p + 713 546 p + 144 546 p + 133 546 p + 709 545 p + 680 545 p + 710 545 p + 711 545 p + 706 545 p + 144 545 p + 132 545 p + 711 544 p + 710 544 p + 706 544 p + 740 544 p + 741 544 p + 143 544 p + 144 544 p + 712 543 p + 683 543 p + 713 543 p + 717 543 p + 716 543 p + 145 543 p + 134 543 p + 712 542 p + 683 542 p + 713 542 p + 714 542 p + 709 542 p + 145 542 p + 133 542 p + 714 541 p + 713 541 p + 709 541 p + 743 541 p + 744 541 p + 144 541 p + 145 541 p + 715 540 p + 686 540 p + 716 540 p + 720 540 p + 719 540 p + 146 540 p + 135 540 p + 715 539 p + 686 539 p + 716 539 p + 717 539 p + 712 539 p + 146 539 p + 134 539 p + 717 538 p + 716 538 p + 712 538 p + 746 538 p + 747 538 p + 145 538 p + 146 538 p + 718 537 p + 689 537 p + 719 537 p + 723 537 p + 722 537 p + 147 537 p + 136 537 p + 718 536 p + 689 536 p + 719 536 p + 720 536 p + 715 536 p + 147 536 p + 135 536 p + 720 535 p + 719 535 p + 715 535 p + 749 535 p + 750 535 p + 146 535 p + 147 535 p + 721 534 p + 690 534 p + 722 534 p + 726 534 p + 725 534 p + 148 534 p + 137 534 p + 721 533 p + 690 533 p + 722 533 p + 723 533 p + 718 533 p + 148 533 p + 136 533 p + 723 532 p + 722 532 p + 718 532 p + 752 532 p + 753 532 p + 147 532 p + 148 532 p + 724 531 p + 694 531 p + 725 531 p + 729 531 p + 728 531 p + 149 531 p + 138 531 p + 724 530 p + 694 530 p + 725 530 p + 726 530 p + 721 530 p + 149 530 p + 137 530 p + 726 529 p + 725 529 p + 721 529 p + 756 529 p + 757 529 p + 148 529 p + 149 529 p + 727 528 p + 696 528 p + 728 528 p + 730 528 p + 731 528 p + 150 528 p + 139 528 p + 727 527 p + 696 527 p + 728 527 p + 729 527 p + 724 527 p + 150 527 p + 138 527 p + 729 526 p + 728 526 p + 724 526 p + 755 526 p + 756 526 p + 149 526 p + 150 526 p + 730 525 p + 727 525 p + 731 525 p + 3 525 p + 139 525 p + 730 524 p + 727 524 p + 731 524 p + 732 524 p + 733 524 p + 3 524 p + 150 524 p + 732 523 p + 731 523 p + 733 523 p + 151 523 p + 3 523 p + 732 522 p + 731 522 p + 733 522 p + 759 522 p + 761 522 p + 151 522 p + 150 522 p + 734 521 p + 702 521 p + 735 521 p + 736 521 p + 705 521 p + 152 521 p + 141 521 p + 734 520 p + 702 520 p + 735 520 p + 152 520 p + 140 520 p + 736 519 p + 705 519 p + 734 519 p + 739 519 p + 738 519 p + 152 519 p + 142 519 p + 737 518 p + 708 518 p + 738 518 p + 742 518 p + 741 518 p + 153 518 p + 143 518 p + 737 517 p + 708 517 p + 738 517 p + 739 517 p + 736 517 p + 153 517 p + 142 517 p + 739 516 p + 738 516 p + 736 516 p + 762 516 p + 763 516 p + 152 516 p + 153 516 p + 740 515 p + 711 515 p + 741 515 p + 745 515 p + 744 515 p + 154 515 p + 144 515 p + 740 514 p + 711 514 p + 741 514 p + 742 514 p + 737 514 p + 154 514 p + 143 514 p + 742 513 p + 741 513 p + 737 513 p + 764 513 p + 762 513 p + 153 513 p + 154 513 p + 743 512 p + 714 512 p + 744 512 p + 748 512 p + 747 512 p + 155 512 p + 145 512 p + 743 511 p + 714 511 p + 744 511 p + 745 511 p + 740 511 p + 155 511 p + 144 511 p + 745 510 p + 744 510 p + 740 510 p + 765 510 p + 766 510 p + 154 510 p + 155 510 p + 746 509 p + 717 509 p + 747 509 p + 751 509 p + 750 509 p + 156 509 p + 146 509 p + 746 508 p + 717 508 p + 747 508 p + 748 508 p + 743 508 p + 156 508 p + 145 508 p + 748 507 p + 747 507 p + 743 507 p + 768 507 p + 769 507 p + 155 507 p + 156 507 p + 749 506 p + 720 506 p + 750 506 p + 754 506 p + 753 506 p + 157 506 p + 147 506 p + 749 505 p + 720 505 p + 750 505 p + 751 505 p + 746 505 p + 157 505 p + 146 505 p + 751 504 p + 750 504 p + 746 504 p + 771 504 p + 772 504 p + 156 504 p + 157 504 p + 752 503 p + 723 503 p + 753 503 p + 758 503 p + 757 503 p + 158 503 p + 148 503 p + 752 502 p + 723 502 p + 753 502 p + 754 502 p + 749 502 p + 158 502 p + 147 502 p + 754 501 p + 753 501 p + 749 501 p + 774 501 p + 775 501 p + 157 501 p + 158 501 p + 755 500 p + 729 500 p + 756 500 p + 759 500 p + 760 500 p + 159 500 p + 150 500 p + 755 499 p + 729 499 p + 756 499 p + 726 499 p + 757 499 p + 159 499 p + 149 499 p + 756 498 p + 726 498 p + 757 498 p + 758 498 p + 752 498 p + 159 498 p + 148 498 p + 758 497 p + 757 497 p + 752 497 p + 777 497 p + 778 497 p + 158 497 p + 159 497 p + 759 496 p + 755 496 p + 760 496 p + 733 496 p + 761 496 p + 160 496 p + 150 496 p + 759 495 p + 755 495 p + 760 495 p + 780 495 p + 781 495 p + 160 495 p + 159 495 p + 733 494 p + 759 494 p + 761 494 p + 151 494 p + 160 494 p + 762 493 p + 739 493 p + 763 493 p + 764 493 p + 742 493 p + 161 493 p + 153 493 p + 762 492 p + 739 492 p + 763 492 p + 161 492 p + 152 492 p + 764 491 p + 742 491 p + 762 491 p + 767 491 p + 766 491 p + 161 491 p + 154 491 p + 765 490 p + 745 490 p + 766 490 p + 770 490 p + 769 490 p + 162 490 p + 155 490 p + 765 489 p + 745 489 p + 766 489 p + 767 489 p + 764 489 p + 162 489 p + 154 489 p + 767 488 p + 766 488 p + 764 488 p + 783 488 p + 784 488 p + 161 488 p + 162 488 p + 768 487 p + 748 487 p + 769 487 p + 773 487 p + 772 487 p + 163 487 p + 156 487 p + 768 486 p + 748 486 p + 769 486 p + 770 486 p + 765 486 p + 163 486 p + 155 486 p + 770 485 p + 769 485 p + 765 485 p + 785 485 p + 783 485 p + 162 485 p + 163 485 p + 771 484 p + 751 484 p + 772 484 p + 776 484 p + 775 484 p + 164 484 p + 157 484 p + 771 483 p + 751 483 p + 772 483 p + 773 483 p + 768 483 p + 164 483 p + 156 483 p + 773 482 p + 772 482 p + 768 482 p + 786 482 p + 787 482 p + 163 482 p + 164 482 p + 774 481 p + 754 481 p + 775 481 p + 779 481 p + 778 481 p + 165 481 p + 158 481 p + 774 480 p + 754 480 p + 775 480 p + 776 480 p + 771 480 p + 165 480 p + 157 480 p + 776 479 p + 775 479 p + 771 479 p + 789 479 p + 790 479 p + 164 479 p + 165 479 p + 777 478 p + 758 478 p + 778 478 p + 782 478 p + 781 478 p + 166 478 p + 159 478 p + 777 477 p + 758 477 p + 778 477 p + 779 477 p + 774 477 p + 166 477 p + 158 477 p + 779 476 p + 778 476 p + 774 476 p + 792 476 p + 793 476 p + 165 476 p + 166 476 p + 780 475 p + 760 475 p + 781 475 p + 167 475 p + 160 475 p + 780 474 p + 760 474 p + 781 474 p + 782 474 p + 777 474 p + 167 474 p + 159 474 p + 782 473 p + 781 473 p + 777 473 p + 795 473 p + 796 473 p + 166 473 p + 167 473 p + 783 472 p + 767 472 p + 784 472 p + 785 472 p + 770 472 p + 168 472 p + 162 472 p + 783 471 p + 767 471 p + 784 471 p + 168 471 p + 161 471 p + 785 470 p + 770 470 p + 783 470 p + 788 470 p + 787 470 p + 168 470 p + 163 470 p + 786 469 p + 773 469 p + 787 469 p + 791 469 p + 790 469 p + 169 469 p + 164 469 p + 786 468 p + 773 468 p + 787 468 p + 788 468 p + 785 468 p + 169 468 p + 163 468 p + 788 467 p + 787 467 p + 785 467 p + 804 467 p + 805 467 p + 168 467 p + 169 467 p + 789 466 p + 776 466 p + 790 466 p + 794 466 p + 793 466 p + 170 466 p + 165 466 p + 789 465 p + 776 465 p + 790 465 p + 791 465 p + 786 465 p + 170 465 p + 164 465 p + 791 464 p + 790 464 p + 786 464 p + 807 464 p + 808 464 p + 169 464 p + 170 464 p + 792 463 p + 779 463 p + 793 463 p + 797 463 p + 796 463 p + 171 463 p + 166 463 p + 792 462 p + 779 462 p + 793 462 p + 794 462 p + 789 462 p + 171 462 p + 165 462 p + 794 461 p + 793 461 p + 789 461 p + 810 461 p + 811 461 p + 170 461 p + 171 461 p + 795 460 p + 782 460 p + 796 460 p + 172 460 p + 167 460 p + 795 459 p + 782 459 p + 796 459 p + 797 459 p + 792 459 p + 172 459 p + 166 459 p + 797 458 p + 796 458 p + 792 458 p + 813 458 p + 814 458 p + 171 458 p + 172 458 p + 798 457 p + 799 457 p + 800 457 p + 353 457 p + 820 457 p + 328 457 p + 10 457 p + 798 456 p + 799 456 p + 800 456 p + 10 456 p + 329 456 p + 798 455 p + 799 455 p + 800 455 p + 818 455 p + 819 455 p + 328 455 p + 329 455 p + 801 454 p + 802 454 p + 803 454 p + 824 454 p + 826 454 p + 173 454 p + 174 454 p + 801 453 p + 802 453 p + 803 453 p + 806 453 p + 805 453 p + 174 453 p + 168 453 p + 801 452 p + 802 452 p + 803 452 p + 173 452 p + 168 452 p + 804 451 p + 788 451 p + 805 451 p + 809 451 p + 808 451 p + 175 451 p + 169 451 p + 804 450 p + 788 450 p + 805 450 p + 806 450 p + 802 450 p + 175 450 p + 168 450 p + 806 449 p + 805 449 p + 802 449 p + 827 449 p + 828 449 p + 174 449 p + 175 449 p + 807 448 p + 791 448 p + 808 448 p + 812 448 p + 811 448 p + 176 448 p + 170 448 p + 807 447 p + 791 447 p + 808 447 p + 809 447 p + 804 447 p + 176 447 p + 169 447 p + 809 446 p + 808 446 p + 804 446 p + 830 446 p + 831 446 p + 175 446 p + 176 446 p + 810 445 p + 794 445 p + 811 445 p + 815 445 p + 814 445 p + 177 445 p + 171 445 p + 810 444 p + 794 444 p + 811 444 p + 812 444 p + 807 444 p + 177 444 p + 170 444 p + 812 443 p + 811 443 p + 807 443 p + 833 443 p + 834 443 p + 176 443 p + 177 443 p + 813 442 p + 797 442 p + 814 442 p + 816 442 p + 817 442 p + 178 442 p + 172 442 p + 813 441 p + 797 441 p + 814 441 p + 815 441 p + 810 441 p + 178 441 p + 171 441 p + 815 440 p + 814 440 p + 810 440 p + 836 440 p + 837 440 p + 177 440 p + 178 440 p + 816 439 p + 813 439 p + 817 439 p + 179 439 p + 172 439 p + 816 438 p + 813 438 p + 817 438 p + 839 438 p + 840 438 p + 179 438 p + 178 438 p + 800 437 p + 818 437 p + 819 437 p + 329 437 p + 321 437 p + 800 436 p + 818 436 p + 819 436 p + 846 436 p + 848 436 p + 328 436 p + 321 436 p + 353 435 p + 798 435 p + 820 435 p + 844 435 p + 845 435 p + 9 435 p + 328 435 p + 821 434 p + 822 434 p + 823 434 p + 824 434 p + 825 434 p + 181 434 p + 173 434 p + 821 433 p + 822 433 p + 823 433 p + 173 433 p + 180 433 p + 821 432 p + 822 432 p + 823 432 p + 852 432 p + 854 432 p + 181 432 p + 180 432 p + 824 431 p + 821 431 p + 825 431 p + 801 431 p + 826 431 p + 182 431 p + 173 431 p + 824 430 p + 821 430 p + 825 430 p + 855 430 p + 857 430 p + 182 430 p + 181 430 p + 801 429 p + 824 429 p + 826 429 p + 829 429 p + 828 429 p + 174 429 p + 182 429 p + 827 428 p + 806 428 p + 828 428 p + 832 428 p + 831 428 p + 183 428 p + 175 428 p + 827 427 p + 806 427 p + 828 427 p + 829 427 p + 826 427 p + 183 427 p + 174 427 p + 829 426 p + 828 426 p + 826 426 p + 858 426 p + 860 426 p + 182 426 p + 183 426 p + 830 425 p + 809 425 p + 831 425 p + 835 425 p + 834 425 p + 184 425 p + 176 425 p + 830 424 p + 809 424 p + 831 424 p + 832 424 p + 827 424 p + 184 424 p + 175 424 p + 832 423 p + 831 423 p + 827 423 p + 861 423 p + 863 423 p + 183 423 p + 184 423 p + 833 422 p + 812 422 p + 834 422 p + 838 422 p + 837 422 p + 185 422 p + 177 422 p + 833 421 p + 812 421 p + 834 421 p + 835 421 p + 830 421 p + 185 421 p + 176 421 p + 835 420 p + 834 420 p + 830 420 p + 864 420 p + 866 420 p + 184 420 p + 185 420 p + 836 419 p + 815 419 p + 837 419 p + 841 419 p + 840 419 p + 186 419 p + 178 419 p + 836 418 p + 815 418 p + 837 418 p + 838 418 p + 833 418 p + 186 418 p + 177 418 p + 838 417 p + 837 417 p + 833 417 p + 867 417 p + 868 417 p + 185 417 p + 186 417 p + 839 416 p + 817 416 p + 840 416 p + 842 416 p + 843 416 p + 187 416 p + 179 416 p + 839 415 p + 817 415 p + 840 415 p + 841 415 p + 836 415 p + 187 415 p + 178 415 p + 841 414 p + 840 414 p + 836 414 p + 870 414 p + 871 414 p + 186 414 p + 187 414 p + 842 413 p + 839 413 p + 843 413 p + 188 413 p + 179 413 p + 842 412 p + 839 412 p + 843 412 p + 875 412 p + 876 412 p + 188 412 p + 187 412 p + 820 411 p + 844 411 p + 845 411 p + 846 411 p + 847 411 p + 328 411 p + 327 411 p + 820 410 p + 844 410 p + 845 410 p + 349 410 p + 882 410 p + 9 410 p + 327 410 p + 844 409 p + 846 409 p + 847 409 p + 819 409 p + 848 409 p + 328 409 p + 320 409 p + 844 408 p + 846 408 p + 847 408 p + 960 408 p + 921 408 p + 327 408 p + 320 408 p + 846 407 p + 819 407 p + 848 407 p + 1250 407 p + 1254 407 p + 320 407 p + 321 407 p + 849 406 p + 850 406 p + 851 406 p + 852 406 p + 853 406 p + 190 406 p + 180 406 p + 849 405 p + 850 405 p + 851 405 p + 180 405 p + 189 405 p + 849 404 p + 850 404 p + 851 404 p + 886 404 p + 887 404 p + 190 404 p + 189 404 p + 852 403 p + 849 403 p + 853 403 p + 823 403 p + 854 403 p + 191 403 p + 180 403 p + 852 402 p + 849 402 p + 853 402 p + 889 402 p + 891 402 p + 191 402 p + 190 402 p + 823 401 p + 852 401 p + 854 401 p + 855 401 p + 856 401 p + 181 401 p + 191 401 p + 855 400 p + 854 400 p + 856 400 p + 825 400 p + 857 400 p + 192 400 p + 181 400 p + 855 399 p + 854 399 p + 856 399 p + 892 399 p + 894 399 p + 192 399 p + 191 399 p + 825 398 p + 855 398 p + 857 398 p + 858 398 p + 859 398 p + 182 398 p + 192 398 p + 858 397 p + 857 397 p + 859 397 p + 829 397 p + 860 397 p + 193 397 p + 182 397 p + 858 396 p + 857 396 p + 859 396 p + 895 396 p + 897 396 p + 193 396 p + 192 396 p + 829 395 p + 858 395 p + 860 395 p + 861 395 p + 862 395 p + 183 395 p + 193 395 p + 861 394 p + 860 394 p + 862 394 p + 832 394 p + 863 394 p + 194 394 p + 183 394 p + 861 393 p + 860 393 p + 862 393 p + 898 393 p + 900 393 p + 194 393 p + 193 393 p + 832 392 p + 861 392 p + 863 392 p + 864 392 p + 865 392 p + 184 392 p + 194 392 p + 864 391 p + 863 391 p + 865 391 p + 835 391 p + 866 391 p + 195 391 p + 184 391 p + 864 390 p + 863 390 p + 865 390 p + 901 390 p + 903 390 p + 195 390 p + 194 390 p + 835 389 p + 864 389 p + 866 389 p + 869 389 p + 868 389 p + 185 389 p + 195 389 p + 867 388 p + 838 388 p + 868 388 p + 872 388 p + 871 388 p + 196 388 p + 186 388 p + 867 387 p + 838 387 p + 868 387 p + 869 387 p + 866 387 p + 196 387 p + 185 387 p + 869 386 p + 868 386 p + 866 386 p + 904 386 p + 906 386 p + 195 386 p + 196 386 p + 870 385 p + 841 385 p + 871 385 p + 873 385 p + 874 385 p + 197 385 p + 187 385 p + 870 384 p + 841 384 p + 871 384 p + 872 384 p + 867 384 p + 197 384 p + 186 384 p + 872 383 p + 871 383 p + 867 383 p + 907 383 p + 909 383 p + 196 383 p + 197 383 p + 873 382 p + 870 382 p + 874 382 p + 877 382 p + 876 382 p + 198 382 p + 187 382 p + 873 381 p + 870 381 p + 874 381 p + 910 381 p + 912 381 p + 198 381 p + 197 381 p + 875 380 p + 843 380 p + 876 380 p + 878 380 p + 879 380 p + 199 380 p + 188 380 p + 875 379 p + 843 379 p + 876 379 p + 877 379 p + 873 379 p + 199 379 p + 187 379 p + 877 378 p + 876 378 p + 873 378 p + 913 378 p + 915 378 p + 198 378 p + 199 378 p + 878 377 p + 875 377 p + 879 377 p + 200 377 p + 188 377 p + 878 376 p + 875 376 p + 879 376 p + 880 376 p + 881 376 p + 200 376 p + 199 376 p + 880 375 p + 879 375 p + 881 375 p + 0 375 p + 200 375 p + 880 374 p + 879 374 p + 881 374 p + 916 374 p + 918 374 p + 0 374 p + 199 374 p + 349 373 p + 845 373 p + 882 373 p + 919 373 p + 920 373 p + 8 373 p + 327 373 p + 883 372 p + 884 372 p + 885 372 p + 189 372 p + 201 372 p + 883 371 p + 884 371 p + 885 371 p + 923 371 p + 924 371 p + 201 371 p + 202 371 p + 883 370 p + 884 370 p + 885 370 p + 888 370 p + 886 370 p + 189 370 p + 202 370 p + 886 369 p + 887 369 p + 851 369 p + 885 369 p + 888 369 p + 189 369 p + 203 369 p + 886 368 p + 887 368 p + 851 368 p + 889 368 p + 890 368 p + 203 368 p + 190 368 p + 885 367 p + 888 367 p + 886 367 p + 927 367 p + 928 367 p + 202 367 p + 203 367 p + 889 366 p + 887 366 p + 890 366 p + 853 366 p + 891 366 p + 204 366 p + 190 366 p + 889 365 p + 887 365 p + 890 365 p + 930 365 p + 931 365 p + 204 365 p + 203 365 p + 853 364 p + 889 364 p + 891 364 p + 892 364 p + 893 364 p + 191 364 p + 204 364 p + 892 363 p + 891 363 p + 893 363 p + 856 363 p + 894 363 p + 205 363 p + 191 363 p + 892 362 p + 891 362 p + 893 362 p + 935 362 p + 937 362 p + 205 362 p + 204 362 p + 856 361 p + 892 361 p + 894 361 p + 895 361 p + 896 361 p + 192 361 p + 205 361 p + 895 360 p + 894 360 p + 896 360 p + 859 360 p + 897 360 p + 206 360 p + 192 360 p + 895 359 p + 894 359 p + 896 359 p + 938 359 p + 940 359 p + 206 359 p + 205 359 p + 859 358 p + 895 358 p + 897 358 p + 898 358 p + 899 358 p + 193 358 p + 206 358 p + 898 357 p + 897 357 p + 899 357 p + 862 357 p + 900 357 p + 207 357 p + 193 357 p + 898 356 p + 897 356 p + 899 356 p + 941 356 p + 943 356 p + 207 356 p + 206 356 p + 862 355 p + 898 355 p + 900 355 p + 901 355 p + 902 355 p + 194 355 p + 207 355 p + 901 354 p + 900 354 p + 902 354 p + 865 354 p + 903 354 p + 208 354 p + 194 354 p + 901 353 p + 900 353 p + 902 353 p + 944 353 p + 946 353 p + 208 353 p + 207 353 p + 865 352 p + 901 352 p + 903 352 p + 904 352 p + 905 352 p + 195 352 p + 208 352 p + 904 351 p + 903 351 p + 905 351 p + 869 351 p + 906 351 p + 209 351 p + 195 351 p + 904 350 p + 903 350 p + 905 350 p + 947 350 p + 949 350 p + 209 350 p + 208 350 p + 869 349 p + 904 349 p + 906 349 p + 907 349 p + 908 349 p + 196 349 p + 209 349 p + 907 348 p + 906 348 p + 908 348 p + 872 348 p + 909 348 p + 210 348 p + 196 348 p + 907 347 p + 906 347 p + 908 347 p + 950 347 p + 952 347 p + 210 347 p + 209 347 p + 872 346 p + 907 346 p + 909 346 p + 910 346 p + 911 346 p + 197 346 p + 210 346 p + 910 345 p + 909 345 p + 911 345 p + 874 345 p + 912 345 p + 211 345 p + 197 345 p + 910 344 p + 909 344 p + 911 344 p + 955 344 p + 953 344 p + 211 344 p + 210 344 p + 874 343 p + 910 343 p + 912 343 p + 913 343 p + 914 343 p + 198 343 p + 211 343 p + 913 342 p + 912 342 p + 914 342 p + 877 342 p + 915 342 p + 212 342 p + 198 342 p + 913 341 p + 912 341 p + 914 341 p + 953 341 p + 954 341 p + 212 341 p + 211 341 p + 877 340 p + 913 340 p + 915 340 p + 916 340 p + 917 340 p + 199 340 p + 212 340 p + 916 339 p + 915 339 p + 917 339 p + 881 339 p + 918 339 p + 213 339 p + 199 339 p + 916 338 p + 915 338 p + 917 338 p + 957 338 p + 958 338 p + 213 338 p + 212 338 p + 881 337 p + 916 337 p + 918 337 p + 0 337 p + 213 337 p + 882 336 p + 919 336 p + 920 336 p + 921 336 p + 922 336 p + 327 336 p + 326 336 p + 882 335 p + 919 335 p + 920 335 p + 345 335 p + 961 335 p + 8 335 p + 326 335 p + 919 334 p + 921 334 p + 922 334 p + 847 334 p + 960 334 p + 327 334 p + 319 334 p + 919 333 p + 921 333 p + 922 333 p + 1040 333 p + 1001 333 p + 326 333 p + 319 333 p + 923 332 p + 924 332 p + 884 332 p + 925 332 p + 926 332 p + 201 332 p + 215 332 p + 923 331 p + 924 331 p + 884 331 p + 929 331 p + 927 331 p + 215 331 p + 202 331 p + 925 330 p + 926 330 p + 923 330 p + 201 330 p + 214 330 p + 925 329 p + 926 329 p + 923 329 p + 964 329 p + 965 329 p + 214 329 p + 215 329 p + 927 328 p + 928 328 p + 888 328 p + 924 328 p + 929 328 p + 202 328 p + 216 328 p + 927 327 p + 928 327 p + 888 327 p + 932 327 p + 930 327 p + 216 327 p + 203 327 p + 924 326 p + 929 326 p + 927 326 p + 968 326 p + 969 326 p + 215 326 p + 216 326 p + 930 325 p + 931 325 p + 890 325 p + 928 325 p + 932 325 p + 203 325 p + 217 325 p + 930 324 p + 931 324 p + 890 324 p + 933 324 p + 934 324 p + 217 324 p + 204 324 p + 928 323 p + 932 323 p + 930 323 p + 971 323 p + 972 323 p + 216 323 p + 217 323 p + 933 322 p + 931 322 p + 934 322 p + 935 322 p + 936 322 p + 218 322 p + 204 322 p + 933 321 p + 931 321 p + 934 321 p + 974 321 p + 975 321 p + 218 321 p + 217 321 p + 935 320 p + 933 320 p + 936 320 p + 893 320 p + 937 320 p + 219 320 p + 204 320 p + 935 319 p + 933 319 p + 936 319 p + 977 319 p + 979 319 p + 219 319 p + 218 319 p + 893 318 p + 935 318 p + 937 318 p + 938 318 p + 939 318 p + 205 318 p + 219 318 p + 938 317 p + 937 317 p + 939 317 p + 896 317 p + 940 317 p + 220 317 p + 205 317 p + 938 316 p + 937 316 p + 939 316 p + 980 316 p + 982 316 p + 220 316 p + 219 316 p + 896 315 p + 938 315 p + 940 315 p + 941 315 p + 942 315 p + 206 315 p + 220 315 p + 941 314 p + 940 314 p + 942 314 p + 899 314 p + 943 314 p + 221 314 p + 206 314 p + 941 313 p + 940 313 p + 942 313 p + 983 313 p + 985 313 p + 221 313 p + 220 313 p + 899 312 p + 941 312 p + 943 312 p + 944 312 p + 945 312 p + 207 312 p + 221 312 p + 944 311 p + 943 311 p + 945 311 p + 902 311 p + 946 311 p + 222 311 p + 207 311 p + 944 310 p + 943 310 p + 945 310 p + 986 310 p + 988 310 p + 222 310 p + 221 310 p + 902 309 p + 944 309 p + 946 309 p + 947 309 p + 948 309 p + 208 309 p + 222 309 p + 947 308 p + 946 308 p + 948 308 p + 905 308 p + 949 308 p + 223 308 p + 208 308 p + 947 307 p + 946 307 p + 948 307 p + 989 307 p + 991 307 p + 223 307 p + 222 307 p + 905 306 p + 947 306 p + 949 306 p + 950 306 p + 951 306 p + 209 306 p + 223 306 p + 950 305 p + 949 305 p + 951 305 p + 908 305 p + 952 305 p + 224 305 p + 209 305 p + 950 304 p + 949 304 p + 951 304 p + 992 304 p + 994 304 p + 224 304 p + 223 304 p + 908 303 p + 950 303 p + 952 303 p + 955 303 p + 956 303 p + 210 303 p + 224 303 p + 914 302 p + 953 302 p + 954 302 p + 911 302 p + 955 302 p + 211 302 p + 225 302 p + 914 301 p + 953 301 p + 954 301 p + 959 301 p + 957 301 p + 212 301 p + 225 301 p + 955 300 p + 952 300 p + 956 300 p + 911 300 p + 953 300 p + 225 300 p + 210 300 p + 955 299 p + 952 299 p + 956 299 p + 995 299 p + 997 299 p + 225 299 p + 224 299 p + 957 298 p + 958 298 p + 917 298 p + 954 298 p + 959 298 p + 212 298 p + 226 298 p + 957 297 p + 958 297 p + 917 297 p + 226 297 p + 213 297 p + 954 296 p + 959 296 p + 957 296 p + 998 296 p + 1000 296 p + 225 296 p + 226 296 p + 847 295 p + 960 295 p + 921 295 p + 1251 295 p + 1248 295 p + 320 295 p + 319 295 p + 345 294 p + 920 294 p + 961 294 p + 962 294 p + 963 294 p + 7 294 p + 326 294 p + 961 293 p + 962 293 p + 963 293 p + 1001 293 p + 1002 293 p + 326 293 p + 325 293 p + 961 292 p + 962 292 p + 963 292 p + 341 292 p + 1041 292 p + 7 292 p + 325 292 p + 964 291 p + 965 291 p + 926 291 p + 966 291 p + 967 291 p + 214 291 p + 228 291 p + 964 290 p + 965 290 p + 926 290 p + 970 290 p + 969 290 p + 228 290 p + 215 290 p + 966 289 p + 967 289 p + 964 289 p + 214 289 p + 227 289 p + 966 288 p + 967 288 p + 964 288 p + 1003 288 p + 1004 288 p + 227 288 p + 228 288 p + 968 287 p + 929 287 p + 969 287 p + 973 287 p + 972 287 p + 229 287 p + 216 287 p + 968 286 p + 929 286 p + 969 286 p + 970 286 p + 965 286 p + 229 286 p + 215 286 p + 970 285 p + 969 285 p + 965 285 p + 1007 285 p + 1008 285 p + 228 285 p + 229 285 p + 971 284 p + 932 284 p + 972 284 p + 976 284 p + 975 284 p + 230 284 p + 217 284 p + 971 283 p + 932 283 p + 972 283 p + 973 283 p + 968 283 p + 230 283 p + 216 283 p + 973 282 p + 972 282 p + 968 282 p + 1010 282 p + 1011 282 p + 229 282 p + 230 282 p + 974 281 p + 934 281 p + 975 281 p + 977 281 p + 978 281 p + 231 281 p + 218 281 p + 974 280 p + 934 280 p + 975 280 p + 976 280 p + 971 280 p + 231 280 p + 217 280 p + 976 279 p + 975 279 p + 971 279 p + 1013 279 p + 1014 279 p + 230 279 p + 231 279 p + 977 278 p + 974 278 p + 978 278 p + 936 278 p + 979 278 p + 232 278 p + 218 278 p + 977 277 p + 974 277 p + 978 277 p + 1016 277 p + 1017 277 p + 232 277 p + 231 277 p + 936 276 p + 977 276 p + 979 276 p + 980 276 p + 981 276 p + 219 276 p + 232 276 p + 980 275 p + 979 275 p + 981 275 p + 939 275 p + 982 275 p + 233 275 p + 219 275 p + 980 274 p + 979 274 p + 981 274 p + 1019 274 p + 1020 274 p + 233 274 p + 232 274 p + 939 273 p + 980 273 p + 982 273 p + 983 273 p + 984 273 p + 220 273 p + 233 273 p + 983 272 p + 982 272 p + 984 272 p + 942 272 p + 985 272 p + 234 272 p + 220 272 p + 983 271 p + 982 271 p + 984 271 p + 1022 271 p + 1024 271 p + 234 271 p + 233 271 p + 942 270 p + 983 270 p + 985 270 p + 986 270 p + 987 270 p + 221 270 p + 234 270 p + 986 269 p + 985 269 p + 987 269 p + 945 269 p + 988 269 p + 235 269 p + 221 269 p + 986 268 p + 985 268 p + 987 268 p + 1025 268 p + 1027 268 p + 235 268 p + 234 268 p + 945 267 p + 986 267 p + 988 267 p + 989 267 p + 990 267 p + 222 267 p + 235 267 p + 989 266 p + 988 266 p + 990 266 p + 948 266 p + 991 266 p + 236 266 p + 222 266 p + 989 265 p + 988 265 p + 990 265 p + 1028 265 p + 1030 265 p + 236 265 p + 235 265 p + 948 264 p + 989 264 p + 991 264 p + 992 264 p + 993 264 p + 223 264 p + 236 264 p + 992 263 p + 991 263 p + 993 263 p + 951 263 p + 994 263 p + 237 263 p + 223 263 p + 992 262 p + 991 262 p + 993 262 p + 1031 262 p + 1033 262 p + 237 262 p + 236 262 p + 951 261 p + 992 261 p + 994 261 p + 995 261 p + 996 261 p + 224 261 p + 237 261 p + 995 260 p + 994 260 p + 996 260 p + 956 260 p + 997 260 p + 238 260 p + 224 260 p + 995 259 p + 994 259 p + 996 259 p + 1034 259 p + 1036 259 p + 238 259 p + 237 259 p + 956 258 p + 995 258 p + 997 258 p + 998 258 p + 999 258 p + 225 258 p + 238 258 p + 998 257 p + 997 257 p + 999 257 p + 959 257 p + 1000 257 p + 239 257 p + 225 257 p + 998 256 p + 997 256 p + 999 256 p + 1037 256 p + 1039 256 p + 239 256 p + 238 256 p + 959 255 p + 998 255 p + 1000 255 p + 226 255 p + 239 255 p + 962 254 p + 1001 254 p + 1002 254 p + 922 254 p + 1040 254 p + 326 254 p + 318 254 p + 962 253 p + 1001 253 p + 1002 253 p + 1083 253 p + 1081 253 p + 325 253 p + 318 253 p + 1003 252 p + 967 252 p + 1004 252 p + 1009 252 p + 1008 252 p + 241 252 p + 228 252 p + 1003 251 p + 967 251 p + 1004 251 p + 1005 251 p + 1006 251 p + 241 251 p + 227 251 p + 1005 250 p + 1004 250 p + 1006 250 p + 1042 250 p + 1043 250 p + 240 250 p + 241 250 p + 1005 249 p + 1004 249 p + 1006 249 p + 240 249 p + 227 249 p + 1007 248 p + 970 248 p + 1008 248 p + 1012 248 p + 1011 248 p + 242 248 p + 229 248 p + 1007 247 p + 970 247 p + 1008 247 p + 1009 247 p + 1003 247 p + 242 247 p + 228 247 p + 1009 246 p + 1008 246 p + 1003 246 p + 1046 246 p + 1047 246 p + 241 246 p + 242 246 p + 1010 245 p + 973 245 p + 1011 245 p + 1015 245 p + 1014 245 p + 243 245 p + 230 245 p + 1010 244 p + 973 244 p + 1011 244 p + 1012 244 p + 1007 244 p + 243 244 p + 229 244 p + 1012 243 p + 1011 243 p + 1007 243 p + 1049 243 p + 1050 243 p + 242 243 p + 243 243 p + 1013 242 p + 976 242 p + 1014 242 p + 1018 242 p + 1017 242 p + 244 242 p + 231 242 p + 1013 241 p + 976 241 p + 1014 241 p + 1015 241 p + 1010 241 p + 244 241 p + 230 241 p + 1015 240 p + 1014 240 p + 1010 240 p + 1052 240 p + 1053 240 p + 243 240 p + 244 240 p + 1016 239 p + 978 239 p + 1017 239 p + 1021 239 p + 1019 239 p + 245 239 p + 232 239 p + 1016 238 p + 978 238 p + 1017 238 p + 1018 238 p + 1013 238 p + 245 238 p + 231 238 p + 1018 237 p + 1017 237 p + 1013 237 p + 1055 237 p + 1056 237 p + 244 237 p + 245 237 p + 1019 236 p + 1020 236 p + 981 236 p + 1016 236 p + 1021 236 p + 232 236 p + 246 236 p + 1019 235 p + 1020 235 p + 981 235 p + 1022 235 p + 1023 235 p + 246 235 p + 233 235 p + 1016 234 p + 1021 234 p + 1019 234 p + 1058 234 p + 1059 234 p + 245 234 p + 246 234 p + 1022 233 p + 1020 233 p + 1023 233 p + 984 233 p + 1024 233 p + 247 233 p + 233 233 p + 1022 232 p + 1020 232 p + 1023 232 p + 1061 232 p + 1062 232 p + 247 232 p + 246 232 p + 984 231 p + 1022 231 p + 1024 231 p + 1025 231 p + 1026 231 p + 234 231 p + 247 231 p + 1025 230 p + 1024 230 p + 1026 230 p + 987 230 p + 1027 230 p + 248 230 p + 234 230 p + 1025 229 p + 1024 229 p + 1026 229 p + 1064 229 p + 1066 229 p + 248 229 p + 247 229 p + 987 228 p + 1025 228 p + 1027 228 p + 1028 228 p + 1029 228 p + 235 228 p + 248 228 p + 1028 227 p + 1027 227 p + 1029 227 p + 990 227 p + 1030 227 p + 249 227 p + 235 227 p + 1028 226 p + 1027 226 p + 1029 226 p + 1067 226 p + 1069 226 p + 249 226 p + 248 226 p + 990 225 p + 1028 225 p + 1030 225 p + 1031 225 p + 1032 225 p + 236 225 p + 249 225 p + 1031 224 p + 1030 224 p + 1032 224 p + 993 224 p + 1033 224 p + 250 224 p + 236 224 p + 1031 223 p + 1030 223 p + 1032 223 p + 1070 223 p + 1072 223 p + 250 223 p + 249 223 p + 993 222 p + 1031 222 p + 1033 222 p + 1034 222 p + 1035 222 p + 237 222 p + 250 222 p + 1034 221 p + 1033 221 p + 1035 221 p + 996 221 p + 1036 221 p + 251 221 p + 237 221 p + 1034 220 p + 1033 220 p + 1035 220 p + 1073 220 p + 1075 220 p + 251 220 p + 250 220 p + 996 219 p + 1034 219 p + 1036 219 p + 1037 219 p + 1038 219 p + 238 219 p + 251 219 p + 1037 218 p + 1036 218 p + 1038 218 p + 999 218 p + 1039 218 p + 252 218 p + 238 218 p + 1037 217 p + 1036 217 p + 1038 217 p + 1076 217 p + 1078 217 p + 252 217 p + 251 217 p + 999 216 p + 1037 216 p + 1039 216 p + 239 216 p + 252 216 p + 922 215 p + 1040 215 p + 1001 215 p + 1249 215 p + 1246 215 p + 319 215 p + 318 215 p + 341 214 p + 963 214 p + 1041 214 p + 1079 214 p + 1080 214 p + 6 214 p + 325 214 p + 1042 213 p + 1005 213 p + 1043 213 p + 1048 213 p + 1047 213 p + 254 213 p + 241 213 p + 1042 212 p + 1005 212 p + 1043 212 p + 1044 212 p + 1045 212 p + 254 212 p + 240 212 p + 1044 211 p + 1043 211 p + 1045 211 p + 1084 211 p + 1085 211 p + 253 211 p + 254 211 p + 1044 210 p + 1043 210 p + 1045 210 p + 253 210 p + 240 210 p + 1046 209 p + 1009 209 p + 1047 209 p + 1051 209 p + 1050 209 p + 255 209 p + 242 209 p + 1046 208 p + 1009 208 p + 1047 208 p + 1048 208 p + 1042 208 p + 255 208 p + 241 208 p + 1048 207 p + 1047 207 p + 1042 207 p + 1086 207 p + 1087 207 p + 254 207 p + 255 207 p + 1049 206 p + 1012 206 p + 1050 206 p + 1054 206 p + 1053 206 p + 256 206 p + 243 206 p + 1049 205 p + 1012 205 p + 1050 205 p + 1051 205 p + 1046 205 p + 256 205 p + 242 205 p + 1051 204 p + 1050 204 p + 1046 204 p + 1089 204 p + 1090 204 p + 255 204 p + 256 204 p + 1052 203 p + 1015 203 p + 1053 203 p + 1057 203 p + 1056 203 p + 257 203 p + 244 203 p + 1052 202 p + 1015 202 p + 1053 202 p + 1054 202 p + 1049 202 p + 257 202 p + 243 202 p + 1054 201 p + 1053 201 p + 1049 201 p + 1092 201 p + 1093 201 p + 256 201 p + 257 201 p + 1055 200 p + 1018 200 p + 1056 200 p + 1060 200 p + 1059 200 p + 258 200 p + 245 200 p + 1055 199 p + 1018 199 p + 1056 199 p + 1057 199 p + 1052 199 p + 258 199 p + 244 199 p + 1057 198 p + 1056 198 p + 1052 198 p + 1095 198 p + 1096 198 p + 257 198 p + 258 198 p + 1058 197 p + 1021 197 p + 1059 197 p + 1063 197 p + 1061 197 p + 259 197 p + 246 197 p + 1058 196 p + 1021 196 p + 1059 196 p + 1060 196 p + 1055 196 p + 259 196 p + 245 196 p + 1060 195 p + 1059 195 p + 1055 195 p + 1098 195 p + 1099 195 p + 258 195 p + 259 195 p + 1061 194 p + 1062 194 p + 1023 194 p + 1058 194 p + 1063 194 p + 246 194 p + 260 194 p + 1061 193 p + 1062 193 p + 1023 193 p + 1064 193 p + 1065 193 p + 260 193 p + 247 193 p + 1058 192 p + 1063 192 p + 1061 192 p + 1101 192 p + 1102 192 p + 259 192 p + 260 192 p + 1064 191 p + 1062 191 p + 1065 191 p + 1026 191 p + 1066 191 p + 261 191 p + 247 191 p + 1064 190 p + 1062 190 p + 1065 190 p + 1104 190 p + 1105 190 p + 261 190 p + 260 190 p + 1026 189 p + 1064 189 p + 1066 189 p + 1067 189 p + 1068 189 p + 248 189 p + 261 189 p + 1067 188 p + 1066 188 p + 1068 188 p + 1029 188 p + 1069 188 p + 262 188 p + 248 188 p + 1067 187 p + 1066 187 p + 1068 187 p + 1107 187 p + 1109 187 p + 262 187 p + 261 187 p + 1029 186 p + 1067 186 p + 1069 186 p + 1070 186 p + 1071 186 p + 249 186 p + 262 186 p + 1070 185 p + 1069 185 p + 1071 185 p + 1032 185 p + 1072 185 p + 263 185 p + 249 185 p + 1070 184 p + 1069 184 p + 1071 184 p + 1110 184 p + 1112 184 p + 263 184 p + 262 184 p + 1032 183 p + 1070 183 p + 1072 183 p + 1073 183 p + 1074 183 p + 250 183 p + 263 183 p + 1073 182 p + 1072 182 p + 1074 182 p + 1035 182 p + 1075 182 p + 264 182 p + 250 182 p + 1073 181 p + 1072 181 p + 1074 181 p + 1113 181 p + 1115 181 p + 264 181 p + 263 181 p + 1035 180 p + 1073 180 p + 1075 180 p + 1076 180 p + 1077 180 p + 251 180 p + 264 180 p + 1076 179 p + 1075 179 p + 1077 179 p + 1038 179 p + 1078 179 p + 265 179 p + 251 179 p + 1076 178 p + 1075 178 p + 1077 178 p + 1116 178 p + 1118 178 p + 265 178 p + 264 178 p + 1038 177 p + 1076 177 p + 1078 177 p + 252 177 p + 265 177 p + 1041 176 p + 1079 176 p + 1080 176 p + 1081 176 p + 1082 176 p + 325 176 p + 324 176 p + 1041 175 p + 1079 175 p + 1080 175 p + 337 175 p + 1121 175 p + 6 175 p + 324 175 p + 1079 174 p + 1081 174 p + 1082 174 p + 1002 174 p + 1083 174 p + 325 174 p + 317 174 p + 1079 173 p + 1081 173 p + 1082 173 p + 1167 173 p + 1165 173 p + 324 173 p + 317 173 p + 1002 172 p + 1083 172 p + 1081 172 p + 1247 172 p + 1244 172 p + 318 172 p + 317 172 p + 1084 171 p + 1044 171 p + 1085 171 p + 1088 171 p + 1087 171 p + 266 171 p + 254 171 p + 1084 170 p + 1044 170 p + 1085 170 p + 266 170 p + 253 170 p + 1086 169 p + 1048 169 p + 1087 169 p + 1091 169 p + 1090 169 p + 267 169 p + 255 169 p + 1086 168 p + 1048 168 p + 1087 168 p + 1088 168 p + 1084 168 p + 267 168 p + 254 168 p + 1088 167 p + 1087 167 p + 1084 167 p + 1122 167 p + 1123 167 p + 266 167 p + 267 167 p + 1089 166 p + 1051 166 p + 1090 166 p + 1094 166 p + 1093 166 p + 268 166 p + 256 166 p + 1089 165 p + 1051 165 p + 1090 165 p + 1091 165 p + 1086 165 p + 268 165 p + 255 165 p + 1091 164 p + 1090 164 p + 1086 164 p + 1124 164 p + 1125 164 p + 267 164 p + 268 164 p + 1092 163 p + 1054 163 p + 1093 163 p + 1097 163 p + 1096 163 p + 269 163 p + 257 163 p + 1092 162 p + 1054 162 p + 1093 162 p + 1094 162 p + 1089 162 p + 269 162 p + 256 162 p + 1094 161 p + 1093 161 p + 1089 161 p + 1127 161 p + 1128 161 p + 268 161 p + 269 161 p + 1095 160 p + 1057 160 p + 1096 160 p + 1100 160 p + 1099 160 p + 270 160 p + 258 160 p + 1095 159 p + 1057 159 p + 1096 159 p + 1097 159 p + 1092 159 p + 270 159 p + 257 159 p + 1097 158 p + 1096 158 p + 1092 158 p + 1130 158 p + 1131 158 p + 269 158 p + 270 158 p + 1098 157 p + 1060 157 p + 1099 157 p + 1103 157 p + 1102 157 p + 271 157 p + 259 157 p + 1098 156 p + 1060 156 p + 1099 156 p + 1100 156 p + 1095 156 p + 271 156 p + 258 156 p + 1100 155 p + 1099 155 p + 1095 155 p + 1133 155 p + 1134 155 p + 270 155 p + 271 155 p + 1101 154 p + 1063 154 p + 1102 154 p + 1106 154 p + 1104 154 p + 272 154 p + 260 154 p + 1101 153 p + 1063 153 p + 1102 153 p + 1103 153 p + 1098 153 p + 272 153 p + 259 153 p + 1103 152 p + 1102 152 p + 1098 152 p + 1136 152 p + 1137 152 p + 271 152 p + 272 152 p + 1104 151 p + 1105 151 p + 1065 151 p + 1101 151 p + 1106 151 p + 260 151 p + 273 151 p + 1104 150 p + 1105 150 p + 1065 150 p + 1107 150 p + 1108 150 p + 273 150 p + 261 150 p + 1101 149 p + 1106 149 p + 1104 149 p + 1139 149 p + 1140 149 p + 272 149 p + 273 149 p + 1107 148 p + 1105 148 p + 1108 148 p + 1068 148 p + 1109 148 p + 274 148 p + 261 148 p + 1107 147 p + 1105 147 p + 1108 147 p + 1142 147 p + 1143 147 p + 274 147 p + 273 147 p + 1068 146 p + 1107 146 p + 1109 146 p + 1110 146 p + 1111 146 p + 262 146 p + 274 146 p + 1110 145 p + 1109 145 p + 1111 145 p + 1071 145 p + 1112 145 p + 275 145 p + 262 145 p + 1110 144 p + 1109 144 p + 1111 144 p + 1145 144 p + 1146 144 p + 275 144 p + 274 144 p + 1071 143 p + 1110 143 p + 1112 143 p + 1113 143 p + 1114 143 p + 263 143 p + 275 143 p + 1113 142 p + 1112 142 p + 1114 142 p + 1074 142 p + 1115 142 p + 276 142 p + 263 142 p + 1113 141 p + 1112 141 p + 1114 141 p + 1148 141 p + 1149 141 p + 276 141 p + 275 141 p + 1074 140 p + 1113 140 p + 1115 140 p + 1116 140 p + 1117 140 p + 264 140 p + 276 140 p + 1116 139 p + 1115 139 p + 1117 139 p + 1077 139 p + 1118 139 p + 277 139 p + 264 139 p + 1116 138 p + 1115 138 p + 1117 138 p + 1151 138 p + 1153 138 p + 277 138 p + 276 138 p + 1077 137 p + 1116 137 p + 1118 137 p + 1119 137 p + 1120 137 p + 265 137 p + 277 137 p + 1118 136 p + 1119 136 p + 1120 136 p + 1156 136 p + 1158 136 p + 277 136 p + 278 136 p + 1118 135 p + 1119 135 p + 1120 135 p + 265 135 p + 278 135 p + 337 134 p + 1080 134 p + 1121 134 p + 1163 134 p + 1164 134 p + 5 134 p + 324 134 p + 1122 133 p + 1088 133 p + 1123 133 p + 1126 133 p + 1125 133 p + 279 133 p + 267 133 p + 1122 132 p + 1088 132 p + 1123 132 p + 279 132 p + 266 132 p + 1124 131 p + 1091 131 p + 1125 131 p + 1129 131 p + 1128 131 p + 280 131 p + 268 131 p + 1124 130 p + 1091 130 p + 1125 130 p + 1126 130 p + 1122 130 p + 280 130 p + 267 130 p + 1126 129 p + 1125 129 p + 1122 129 p + 1168 129 p + 1169 129 p + 279 129 p + 280 129 p + 1127 128 p + 1094 128 p + 1128 128 p + 1132 128 p + 1131 128 p + 281 128 p + 269 128 p + 1127 127 p + 1094 127 p + 1128 127 p + 1129 127 p + 1124 127 p + 281 127 p + 268 127 p + 1129 126 p + 1128 126 p + 1124 126 p + 1170 126 p + 1171 126 p + 280 126 p + 281 126 p + 1130 125 p + 1097 125 p + 1131 125 p + 1135 125 p + 1134 125 p + 282 125 p + 270 125 p + 1130 124 p + 1097 124 p + 1131 124 p + 1132 124 p + 1127 124 p + 282 124 p + 269 124 p + 1132 123 p + 1131 123 p + 1127 123 p + 1173 123 p + 1174 123 p + 281 123 p + 282 123 p + 1133 122 p + 1100 122 p + 1134 122 p + 1138 122 p + 1137 122 p + 283 122 p + 271 122 p + 1133 121 p + 1100 121 p + 1134 121 p + 1135 121 p + 1130 121 p + 283 121 p + 270 121 p + 1135 120 p + 1134 120 p + 1130 120 p + 1176 120 p + 1177 120 p + 282 120 p + 283 120 p + 1136 119 p + 1103 119 p + 1137 119 p + 1141 119 p + 1140 119 p + 284 119 p + 272 119 p + 1136 118 p + 1103 118 p + 1137 118 p + 1138 118 p + 1133 118 p + 284 118 p + 271 118 p + 1138 117 p + 1137 117 p + 1133 117 p + 1179 117 p + 1180 117 p + 283 117 p + 284 117 p + 1139 116 p + 1106 116 p + 1140 116 p + 1144 116 p + 1143 116 p + 285 116 p + 273 116 p + 1139 115 p + 1106 115 p + 1140 115 p + 1141 115 p + 1136 115 p + 285 115 p + 272 115 p + 1141 114 p + 1140 114 p + 1136 114 p + 1182 114 p + 1183 114 p + 284 114 p + 285 114 p + 1142 113 p + 1108 113 p + 1143 113 p + 1147 113 p + 1145 113 p + 286 113 p + 274 113 p + 1142 112 p + 1108 112 p + 1143 112 p + 1144 112 p + 1139 112 p + 286 112 p + 273 112 p + 1144 111 p + 1143 111 p + 1139 111 p + 1185 111 p + 1186 111 p + 285 111 p + 286 111 p + 1145 110 p + 1146 110 p + 1111 110 p + 1142 110 p + 1147 110 p + 274 110 p + 287 110 p + 1145 109 p + 1146 109 p + 1111 109 p + 1150 109 p + 1148 109 p + 287 109 p + 275 109 p + 1142 108 p + 1147 108 p + 1145 108 p + 1188 108 p + 1189 108 p + 286 108 p + 287 108 p + 1148 107 p + 1149 107 p + 1114 107 p + 1146 107 p + 1150 107 p + 275 107 p + 288 107 p + 1148 106 p + 1149 106 p + 1114 106 p + 1151 106 p + 1152 106 p + 288 106 p + 276 106 p + 1146 105 p + 1150 105 p + 1148 105 p + 1191 105 p + 1192 105 p + 287 105 p + 288 105 p + 1151 104 p + 1149 104 p + 1152 104 p + 1117 104 p + 1153 104 p + 289 104 p + 276 104 p + 1151 103 p + 1149 103 p + 1152 103 p + 1196 103 p + 1194 103 p + 289 103 p + 288 103 p + 1117 102 p + 1151 102 p + 1153 102 p + 1154 102 p + 1155 102 p + 277 102 p + 289 102 p + 1154 101 p + 1153 101 p + 1155 101 p + 1156 101 p + 1157 101 p + 290 101 p + 277 101 p + 1154 100 p + 1153 100 p + 1155 100 p + 1194 100 p + 1195 100 p + 290 100 p + 289 100 p + 1156 99 p + 1154 99 p + 1157 99 p + 1119 99 p + 1158 99 p + 291 99 p + 277 99 p + 1156 98 p + 1154 98 p + 1157 98 p + 1200 98 p + 1198 98 p + 291 98 p + 290 98 p + 1119 97 p + 1156 97 p + 1158 97 p + 1159 97 p + 1162 97 p + 278 97 p + 291 97 p + 1159 96 p + 1160 96 p + 1161 96 p + 1158 96 p + 1162 96 p + 292 96 p + 291 96 p + 1159 95 p + 1160 95 p + 1161 95 p + 1198 95 p + 1199 95 p + 291 95 p + 1 95 p + 1159 94 p + 1160 94 p + 1161 94 p + 292 94 p + 1 94 p + 1158 93 p + 1159 93 p + 1162 93 p + 278 93 p + 292 93 p + 1121 92 p + 1163 92 p + 1164 92 p + 1165 92 p + 1166 92 p + 324 92 p + 323 92 p + 1121 91 p + 1163 91 p + 1164 91 p + 332 91 p + 1202 91 p + 5 91 p + 323 91 p + 1163 90 p + 1165 90 p + 1166 90 p + 1082 90 p + 1167 90 p + 324 90 p + 316 90 p + 1163 89 p + 1165 89 p + 1166 89 p + 1243 89 p + 1234 89 p + 323 89 p + 316 89 p + 1082 88 p + 1167 88 p + 1165 88 p + 1245 88 p + 1241 88 p + 317 88 p + 316 88 p + 1168 87 p + 1126 87 p + 1169 87 p + 1172 87 p + 1171 87 p + 293 87 p + 280 87 p + 1168 86 p + 1126 86 p + 1169 86 p + 293 86 p + 279 86 p + 1170 85 p + 1129 85 p + 1171 85 p + 1175 85 p + 1174 85 p + 294 85 p + 281 85 p + 1170 84 p + 1129 84 p + 1171 84 p + 1172 84 p + 1168 84 p + 294 84 p + 280 84 p + 1172 83 p + 1171 83 p + 1168 83 p + 1203 83 p + 1204 83 p + 293 83 p + 294 83 p + 1173 82 p + 1132 82 p + 1174 82 p + 1178 82 p + 1177 82 p + 295 82 p + 282 82 p + 1173 81 p + 1132 81 p + 1174 81 p + 1175 81 p + 1170 81 p + 295 81 p + 281 81 p + 1175 80 p + 1174 80 p + 1170 80 p + 1205 80 p + 1206 80 p + 294 80 p + 295 80 p + 1176 79 p + 1135 79 p + 1177 79 p + 1181 79 p + 1180 79 p + 296 79 p + 283 79 p + 1176 78 p + 1135 78 p + 1177 78 p + 1178 78 p + 1173 78 p + 296 78 p + 282 78 p + 1178 77 p + 1177 77 p + 1173 77 p + 1208 77 p + 1209 77 p + 295 77 p + 296 77 p + 1179 76 p + 1138 76 p + 1180 76 p + 1184 76 p + 1183 76 p + 297 76 p + 284 76 p + 1179 75 p + 1138 75 p + 1180 75 p + 1181 75 p + 1176 75 p + 297 75 p + 283 75 p + 1181 74 p + 1180 74 p + 1176 74 p + 1211 74 p + 1212 74 p + 296 74 p + 297 74 p + 1182 73 p + 1141 73 p + 1183 73 p + 1187 73 p + 1186 73 p + 298 73 p + 285 73 p + 1182 72 p + 1141 72 p + 1183 72 p + 1184 72 p + 1179 72 p + 298 72 p + 284 72 p + 1184 71 p + 1183 71 p + 1179 71 p + 1214 71 p + 1215 71 p + 297 71 p + 298 71 p + 1185 70 p + 1144 70 p + 1186 70 p + 1190 70 p + 1189 70 p + 299 70 p + 286 70 p + 1185 69 p + 1144 69 p + 1186 69 p + 1187 69 p + 1182 69 p + 299 69 p + 285 69 p + 1187 68 p + 1186 68 p + 1182 68 p + 1217 68 p + 1218 68 p + 298 68 p + 299 68 p + 1188 67 p + 1147 67 p + 1189 67 p + 1193 67 p + 1191 67 p + 300 67 p + 287 67 p + 1188 66 p + 1147 66 p + 1189 66 p + 1190 66 p + 1185 66 p + 300 66 p + 286 66 p + 1190 65 p + 1189 65 p + 1185 65 p + 1220 65 p + 1221 65 p + 299 65 p + 300 65 p + 1191 64 p + 1192 64 p + 1150 64 p + 1188 64 p + 1193 64 p + 287 64 p + 301 64 p + 1191 63 p + 1192 63 p + 1150 63 p + 1197 63 p + 1196 63 p + 301 63 p + 288 63 p + 1188 62 p + 1193 62 p + 1191 62 p + 1223 62 p + 1224 62 p + 300 62 p + 301 62 p + 1194 61 p + 1195 61 p + 1155 61 p + 1196 61 p + 1152 61 p + 289 61 p + 302 61 p + 1194 60 p + 1195 60 p + 1155 60 p + 1201 60 p + 1200 60 p + 302 60 p + 290 60 p + 1196 59 p + 1194 59 p + 1152 59 p + 1192 59 p + 1197 59 p + 288 59 p + 302 59 p + 1192 58 p + 1197 58 p + 1196 58 p + 1226 58 p + 1227 58 p + 301 58 p + 302 58 p + 1198 57 p + 1199 57 p + 1160 57 p + 1200 57 p + 1157 57 p + 291 57 p + 303 57 p + 1198 56 p + 1199 56 p + 1160 56 p + 303 56 p + 1 56 p + 1200 55 p + 1198 55 p + 1157 55 p + 1195 55 p + 1201 55 p + 290 55 p + 303 55 p + 1195 54 p + 1201 54 p + 1200 54 p + 1229 54 p + 1230 54 p + 302 54 p + 303 54 p + 332 53 p + 1164 53 p + 1202 53 p + 1232 53 p + 1233 53 p + 4 53 p + 323 53 p + 1203 52 p + 1172 52 p + 1204 52 p + 1207 52 p + 1206 52 p + 304 52 p + 294 52 p + 1203 51 p + 1172 51 p + 1204 51 p + 304 51 p + 293 51 p + 1205 50 p + 1175 50 p + 1206 50 p + 1210 50 p + 1209 50 p + 305 50 p + 295 50 p + 1205 49 p + 1175 49 p + 1206 49 p + 1207 49 p + 1203 49 p + 305 49 p + 294 49 p + 1207 48 p + 1206 48 p + 1203 48 p + 1236 48 p + 1237 48 p + 304 48 p + 305 48 p + 1208 47 p + 1178 47 p + 1209 47 p + 1213 47 p + 1212 47 p + 306 47 p + 296 47 p + 1208 46 p + 1178 46 p + 1209 46 p + 1210 46 p + 1205 46 p + 306 46 p + 295 46 p + 1210 45 p + 1209 45 p + 1205 45 p + 1238 45 p + 1239 45 p + 305 45 p + 306 45 p + 1211 44 p + 1181 44 p + 1212 44 p + 1216 44 p + 1215 44 p + 307 44 p + 297 44 p + 1211 43 p + 1181 43 p + 1212 43 p + 1213 43 p + 1208 43 p + 307 43 p + 296 43 p + 1213 42 p + 1212 42 p + 1208 42 p + 1241 42 p + 1242 42 p + 306 42 p + 307 42 p + 1214 41 p + 1184 41 p + 1215 41 p + 1219 41 p + 1218 41 p + 308 41 p + 298 41 p + 1214 40 p + 1184 40 p + 1215 40 p + 1216 40 p + 1211 40 p + 308 40 p + 297 40 p + 1216 39 p + 1215 39 p + 1211 39 p + 1244 39 p + 1245 39 p + 307 39 p + 308 39 p + 1217 38 p + 1187 38 p + 1218 38 p + 1222 38 p + 1221 38 p + 309 38 p + 299 38 p + 1217 37 p + 1187 37 p + 1218 37 p + 1219 37 p + 1214 37 p + 309 37 p + 298 37 p + 1219 36 p + 1218 36 p + 1214 36 p + 1246 36 p + 1247 36 p + 308 36 p + 309 36 p + 1220 35 p + 1190 35 p + 1221 35 p + 1225 35 p + 1223 35 p + 310 35 p + 300 35 p + 1220 34 p + 1190 34 p + 1221 34 p + 1222 34 p + 1217 34 p + 310 34 p + 299 34 p + 1222 33 p + 1221 33 p + 1217 33 p + 1248 33 p + 1249 33 p + 309 33 p + 310 33 p + 1223 32 p + 1224 32 p + 1193 32 p + 1220 32 p + 1225 32 p + 300 32 p + 311 32 p + 1223 31 p + 1224 31 p + 1193 31 p + 1228 31 p + 1226 31 p + 311 31 p + 301 31 p + 1220 30 p + 1225 30 p + 1223 30 p + 1250 30 p + 1251 30 p + 310 30 p + 311 30 p + 1226 29 p + 1227 29 p + 1197 29 p + 1224 29 p + 1228 29 p + 301 29 p + 312 29 p + 1226 28 p + 1227 28 p + 1197 28 p + 1231 28 p + 1229 28 p + 312 28 p + 302 28 p + 1224 27 p + 1228 27 p + 1226 27 p + 1254 27 p + 1253 27 p + 311 27 p + 312 27 p + 1229 26 p + 1230 26 p + 1201 26 p + 1227 26 p + 1231 26 p + 302 26 p + 313 26 p + 1229 25 p + 1230 25 p + 1201 25 p + 313 25 p + 303 25 p + 1227 24 p + 1231 24 p + 1229 24 p + 1252 24 p + 1253 24 p + 312 24 p + 313 24 p + 1202 23 p + 1232 23 p + 1233 23 p + 1234 23 p + 1235 23 p + 323 23 p + 322 23 p + 1202 22 p + 1232 22 p + 1233 22 p + 4 22 p + 322 22 p + 1232 21 p + 1234 21 p + 1235 21 p + 1166 21 p + 1243 21 p + 323 21 p + 315 21 p + 1232 20 p + 1234 20 p + 1235 20 p + 1240 20 p + 1255 20 p + 322 20 p + 315 20 p + 1236 19 p + 1207 19 p + 1237 19 p + 1240 19 p + 1239 19 p + 314 19 p + 305 19 p + 1236 18 p + 1207 18 p + 1237 18 p + 314 18 p + 304 18 p + 1238 17 p + 1210 17 p + 1239 17 p + 1243 17 p + 1242 17 p + 315 17 p + 306 17 p + 1238 16 p + 1210 16 p + 1239 16 p + 1240 16 p + 1236 16 p + 315 16 p + 305 16 p + 1240 15 p + 1239 15 p + 1236 15 p + 1235 15 p + 1255 15 p + 314 15 p + 315 15 p + 1241 14 p + 1213 14 p + 1242 14 p + 1167 14 p + 1245 14 p + 316 14 p + 307 14 p + 1241 13 p + 1213 13 p + 1242 13 p + 1243 13 p + 1238 13 p + 316 13 p + 306 13 p + 1243 12 p + 1242 12 p + 1238 12 p + 1166 12 p + 1234 12 p + 315 12 p + 316 12 p + 1244 11 p + 1216 11 p + 1245 11 p + 1083 11 p + 1247 11 p + 317 11 p + 308 11 p + 1244 10 p + 1216 10 p + 1245 10 p + 1167 10 p + 1241 10 p + 317 10 p + 307 10 p + 1246 9 p + 1219 9 p + 1247 9 p + 1040 9 p + 1249 9 p + 318 9 p + 309 9 p + 1246 8 p + 1219 8 p + 1247 8 p + 1083 8 p + 1244 8 p + 318 8 p + 308 8 p + 1248 7 p + 1222 7 p + 1249 7 p + 960 7 p + 1251 7 p + 319 7 p + 310 7 p + 1248 6 p + 1222 6 p + 1249 6 p + 1040 6 p + 1246 6 p + 319 6 p + 309 6 p + 1250 5 p + 1225 5 p + 1251 5 p + 848 5 p + 1254 5 p + 320 5 p + 311 5 p + 1250 4 p + 1225 4 p + 1251 4 p + 960 4 p + 1248 4 p + 320 4 p + 310 4 p + 1252 3 p + 1231 3 p + 1253 3 p + 321 3 p + 313 3 p + 1252 2 p + 1231 2 p + 1253 2 p + 1254 2 p + 1228 2 p + 321 2 p + 312 2 p + 1254 1 p + 1253 1 p + 1228 1 p + 1250 1 p + 848 1 p + 311 1 p + 321 1 p + 1235 0 p + 1240 0 p + 1255 0 p + 322 0 p + 314 0 p +showpage +%%EndDocument + @endspecial eop +%%Page: 26 26 +26 25 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(26)60 +132 y @beginspecial 40 @vscale 40 @hscale -20 @hoffset -180 +@voffset @setspecial +%%BeginDocument: msh.ps.9 +%! +%%Creator: PSPLTM routine +%%BoundingBox: 217.47 1.96 1337.01 581.70 +%%EndComments +/cm {72 mul 2.54 div} def +/mc {72 div 2.54 mul} def +/pnum { 72 div 2.54 mul 20 string +cvs print ( ) print} def +/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def +gsave + /Helvetica findfont 4.54545E-02 cm scalefont setfont + 10.7950 cm 0.272727 cm moveto +(Finite element mesh) Cshow + 3.17500 cm 0.181818 cm translate + 15.2400 cm 11.0000 div dup scale + 0.01 setlinewidth + 0.00 0.00 moveto + 0.00 0.29 lineto +closepath stroke + 0.00 0.00 moveto + 0.13 0.29 lineto +closepath stroke + 0.00 0.00 moveto + 0.36 0.19 lineto +closepath stroke + 0.00 0.00 moveto + 0.36 0.00 lineto +closepath stroke + 11.00 0.00 moveto + 10.06 0.57 lineto +closepath stroke + 11.00 0.00 moveto + 11.00 0.47 lineto +closepath stroke + 11.00 0.00 moveto + 9.08 0.00 lineto +closepath stroke + 11.00 5.50 moveto + 11.00 5.03 lineto +closepath stroke + 11.00 5.50 moveto + 10.06 4.93 lineto +closepath stroke + 11.00 5.50 moveto + 9.08 5.50 lineto +closepath stroke + 0.00 5.50 moveto + 0.36 5.50 lineto +closepath stroke + 0.00 5.50 moveto + 0.36 5.31 lineto +closepath stroke + 0.00 5.50 moveto + 0.13 5.21 lineto +closepath stroke + 0.00 5.50 moveto + 0.00 5.21 lineto +closepath stroke + 2.10 2.75 moveto + 2.19 2.83 lineto +closepath stroke + 2.10 2.75 moveto + 2.20 2.75 lineto +closepath stroke + 2.10 2.75 moveto + 2.09 2.81 lineto +closepath stroke + 2.10 2.75 moveto + 2.19 2.67 lineto +closepath stroke + 2.10 2.75 moveto + 2.09 2.69 lineto +closepath stroke + 2.30 2.75 moveto + 2.20 2.75 lineto +closepath stroke + 2.30 2.75 moveto + 2.29 2.83 lineto +closepath stroke + 2.30 2.75 moveto + 2.40 2.86 lineto +closepath stroke + 2.30 2.75 moveto + 2.41 2.75 lineto +closepath stroke + 2.30 2.75 moveto + 2.29 2.67 lineto +closepath stroke + 2.30 2.75 moveto + 2.40 2.64 lineto +closepath stroke + 2.52 2.75 moveto + 2.41 2.75 lineto +closepath stroke + 2.52 2.75 moveto + 2.51 2.86 lineto +closepath stroke + 2.52 2.75 moveto + 2.63 2.88 lineto +closepath stroke + 2.52 2.75 moveto + 2.64 2.75 lineto +closepath stroke + 2.52 2.75 moveto + 2.51 2.64 lineto +closepath stroke + 2.52 2.75 moveto + 2.63 2.62 lineto +closepath stroke + 2.76 2.75 moveto + 2.64 2.75 lineto +closepath stroke + 2.76 2.75 moveto + 2.75 2.88 lineto +closepath stroke + 2.76 2.75 moveto + 2.88 2.91 lineto +closepath stroke + 2.76 2.75 moveto + 2.90 2.75 lineto +closepath stroke + 2.76 2.75 moveto + 2.75 2.62 lineto +closepath stroke + 2.76 2.75 moveto + 2.88 2.59 lineto +closepath stroke + 3.03 2.75 moveto + 2.90 2.75 lineto +closepath stroke + 3.03 2.75 moveto + 3.01 2.91 lineto +closepath stroke + 3.03 2.75 moveto + 3.15 2.94 lineto +closepath stroke + 3.03 2.75 moveto + 3.17 2.75 lineto +closepath stroke + 3.03 2.75 moveto + 3.01 2.59 lineto +closepath stroke + 3.03 2.75 moveto + 3.15 2.56 lineto +closepath stroke + 3.32 2.75 moveto + 3.17 2.75 lineto +closepath stroke + 3.32 2.75 moveto + 3.30 2.94 lineto +closepath stroke + 3.32 2.75 moveto + 3.46 2.97 lineto +closepath stroke + 3.32 2.75 moveto + 3.48 2.75 lineto +closepath stroke + 3.32 2.75 moveto + 3.30 2.56 lineto +closepath stroke + 3.32 2.75 moveto + 3.46 2.53 lineto +closepath stroke + 3.64 2.75 moveto + 3.48 2.75 lineto +closepath stroke + 3.64 2.75 moveto + 3.62 2.97 lineto +closepath stroke + 3.64 2.75 moveto + 3.79 3.01 lineto +closepath stroke + 3.64 2.75 moveto + 3.82 2.75 lineto +closepath stroke + 3.64 2.75 moveto + 3.62 2.53 lineto +closepath stroke + 3.64 2.75 moveto + 3.79 2.49 lineto +closepath stroke + 4.00 2.75 moveto + 3.82 2.75 lineto +closepath stroke + 4.00 2.75 moveto + 3.97 3.01 lineto +closepath stroke + 4.00 2.75 moveto + 4.16 3.05 lineto +closepath stroke + 4.00 2.75 moveto + 4.19 2.75 lineto +closepath stroke + 4.00 2.75 moveto + 3.97 2.49 lineto +closepath stroke + 4.00 2.75 moveto + 4.16 2.45 lineto +closepath stroke + 4.39 2.75 moveto + 4.19 2.75 lineto +closepath stroke + 4.39 2.75 moveto + 4.36 3.05 lineto +closepath stroke + 4.39 2.75 moveto + 4.57 3.09 lineto +closepath stroke + 4.39 2.75 moveto + 4.60 2.75 lineto +closepath stroke + 4.39 2.75 moveto + 4.36 2.45 lineto +closepath stroke + 4.39 2.75 moveto + 4.57 2.41 lineto +closepath stroke + 4.82 2.75 moveto + 4.60 2.75 lineto +closepath stroke + 4.82 2.75 moveto + 4.78 3.09 lineto +closepath stroke + 4.82 2.75 moveto + 5.01 3.14 lineto +closepath stroke + 4.82 2.75 moveto + 5.05 2.75 lineto +closepath stroke + 4.82 2.75 moveto + 4.78 2.41 lineto +closepath stroke + 4.82 2.75 moveto + 5.01 2.36 lineto +closepath stroke + 5.29 2.75 moveto + 5.05 2.75 lineto +closepath stroke + 5.29 2.75 moveto + 5.25 3.14 lineto +closepath stroke + 5.29 2.75 moveto + 5.50 3.20 lineto +closepath stroke + 5.29 2.75 moveto + 5.55 2.75 lineto +closepath stroke + 5.29 2.75 moveto + 5.50 2.30 lineto +closepath stroke + 5.29 2.75 moveto + 5.25 2.36 lineto +closepath stroke + 5.81 2.75 moveto + 5.76 3.20 lineto +closepath stroke + 5.81 2.75 moveto + 6.09 2.75 lineto +closepath stroke + 5.81 2.75 moveto + 5.55 2.75 lineto +closepath stroke + 5.81 2.75 moveto + 5.76 2.30 lineto +closepath stroke + 6.38 2.75 moveto + 6.09 2.75 lineto +closepath stroke + 6.38 2.75 moveto + 6.04 3.20 lineto +closepath stroke + 6.38 2.75 moveto + 6.32 3.26 lineto +closepath stroke + 6.38 2.75 moveto + 6.69 2.75 lineto +closepath stroke + 6.38 2.75 moveto + 6.32 2.24 lineto +closepath stroke + 6.38 2.75 moveto + 6.04 2.30 lineto +closepath stroke + 7.00 2.75 moveto + 6.69 2.75 lineto +closepath stroke + 7.00 2.75 moveto + 6.64 3.26 lineto +closepath stroke + 7.00 2.75 moveto + 6.94 3.32 lineto +closepath stroke + 7.00 2.75 moveto + 7.28 3.39 lineto +closepath stroke + 7.00 2.75 moveto + 7.35 2.75 lineto +closepath stroke + 7.00 2.75 moveto + 6.94 2.18 lineto +closepath stroke + 7.00 2.75 moveto + 6.64 2.24 lineto +closepath stroke + 7.69 2.75 moveto + 7.35 2.75 lineto +closepath stroke + 7.69 2.75 moveto + 7.63 3.39 lineto +closepath stroke + 7.69 2.75 moveto + 8.00 3.47 lineto +closepath stroke + 7.69 2.75 moveto + 8.07 2.75 lineto +closepath stroke + 7.69 2.75 moveto + 8.00 2.03 lineto +closepath stroke + 7.69 2.75 moveto + 7.63 2.11 lineto +closepath stroke + 7.69 2.75 moveto + 7.29 2.18 lineto +closepath stroke + 8.45 2.75 moveto + 8.07 2.75 lineto +closepath stroke + 8.45 2.75 moveto + 8.38 3.47 lineto +closepath stroke + 8.45 2.75 moveto + 8.79 3.56 lineto +closepath stroke + 8.45 2.75 moveto + 8.87 2.75 lineto +closepath stroke + 8.45 2.75 moveto + 8.79 1.94 lineto +closepath stroke + 8.45 2.75 moveto + 8.38 2.03 lineto +closepath stroke + 9.29 2.75 moveto + 8.87 2.75 lineto +closepath stroke + 9.29 2.75 moveto + 9.20 3.56 lineto +closepath stroke + 9.29 2.75 moveto + 10.14 3.66 lineto +closepath stroke + 9.29 2.75 moveto + 10.14 2.75 lineto +closepath stroke + 9.29 2.75 moveto + 10.14 1.84 lineto +closepath stroke + 9.29 2.75 moveto + 9.20 1.94 lineto +closepath stroke + 11.00 2.75 moveto + 10.14 2.75 lineto +closepath stroke + 11.00 2.75 moveto + 11.00 3.66 lineto +closepath stroke + 11.00 2.75 moveto + 11.00 1.84 lineto +closepath stroke + 2.09 2.87 moveto + 2.18 2.90 lineto +closepath stroke + 2.09 2.87 moveto + 2.09 2.81 lineto +closepath stroke + 2.09 2.87 moveto + 2.07 2.93 lineto +closepath stroke + 2.28 2.92 moveto + 2.29 2.83 lineto +closepath stroke + 2.28 2.92 moveto + 2.19 2.83 lineto +closepath stroke + 2.28 2.92 moveto + 2.18 2.90 lineto +closepath stroke + 2.28 2.92 moveto + 2.39 2.94 lineto +closepath stroke + 2.28 2.92 moveto + 2.17 2.96 lineto +closepath stroke + 2.28 2.92 moveto + 2.26 3.00 lineto +closepath stroke + 2.50 2.96 moveto + 2.51 2.86 lineto +closepath stroke + 2.50 2.96 moveto + 2.40 2.86 lineto +closepath stroke + 2.50 2.96 moveto + 2.39 2.94 lineto +closepath stroke + 2.50 2.96 moveto + 2.62 2.99 lineto +closepath stroke + 2.50 2.96 moveto + 2.36 3.02 lineto +closepath stroke + 2.50 2.96 moveto + 2.46 3.06 lineto +closepath stroke + 2.73 3.01 moveto + 2.75 2.88 lineto +closepath stroke + 2.73 3.01 moveto + 2.63 2.88 lineto +closepath stroke + 2.73 3.01 moveto + 2.62 2.99 lineto +closepath stroke + 2.73 3.01 moveto + 2.86 3.04 lineto +closepath stroke + 2.73 3.01 moveto + 2.58 3.09 lineto +closepath stroke + 2.73 3.01 moveto + 2.69 3.14 lineto +closepath stroke + 2.99 3.07 moveto + 3.01 2.91 lineto +closepath stroke + 2.99 3.07 moveto + 2.88 2.91 lineto +closepath stroke + 2.99 3.07 moveto + 2.86 3.04 lineto +closepath stroke + 2.99 3.07 moveto + 3.14 3.10 lineto +closepath stroke + 2.99 3.07 moveto + 2.82 3.17 lineto +closepath stroke + 2.99 3.07 moveto + 2.95 3.22 lineto +closepath stroke + 3.28 3.13 moveto + 3.30 2.94 lineto +closepath stroke + 3.28 3.13 moveto + 3.15 2.94 lineto +closepath stroke + 3.28 3.13 moveto + 3.14 3.10 lineto +closepath stroke + 3.28 3.13 moveto + 3.44 3.16 lineto +closepath stroke + 3.28 3.13 moveto + 3.09 3.25 lineto +closepath stroke + 3.28 3.13 moveto + 3.22 3.31 lineto +closepath stroke + 3.60 3.20 moveto + 3.62 2.97 lineto +closepath stroke + 3.60 3.20 moveto + 3.46 2.97 lineto +closepath stroke + 3.60 3.20 moveto + 3.44 3.16 lineto +closepath stroke + 3.60 3.20 moveto + 3.77 3.23 lineto +closepath stroke + 3.60 3.20 moveto + 3.38 3.34 lineto +closepath stroke + 3.60 3.20 moveto + 3.53 3.41 lineto +closepath stroke + 3.94 3.27 moveto + 3.97 3.01 lineto +closepath stroke + 3.94 3.27 moveto + 3.79 3.01 lineto +closepath stroke + 3.94 3.27 moveto + 3.77 3.23 lineto +closepath stroke + 3.94 3.27 moveto + 4.13 3.31 lineto +closepath stroke + 3.94 3.27 moveto + 3.70 3.45 lineto +closepath stroke + 3.94 3.27 moveto + 3.86 3.52 lineto +closepath stroke + 4.32 3.35 moveto + 4.36 3.05 lineto +closepath stroke + 4.32 3.35 moveto + 4.16 3.05 lineto +closepath stroke + 4.32 3.35 moveto + 4.13 3.31 lineto +closepath stroke + 4.32 3.35 moveto + 4.53 3.39 lineto +closepath stroke + 4.32 3.35 moveto + 4.05 3.56 lineto +closepath stroke + 4.32 3.35 moveto + 4.23 3.64 lineto +closepath stroke + 4.74 3.44 moveto + 4.78 3.09 lineto +closepath stroke + 4.74 3.44 moveto + 4.57 3.09 lineto +closepath stroke + 4.74 3.44 moveto + 4.53 3.39 lineto +closepath stroke + 4.74 3.44 moveto + 4.97 3.49 lineto +closepath stroke + 4.74 3.44 moveto + 4.44 3.68 lineto +closepath stroke + 4.74 3.44 moveto + 4.64 3.77 lineto +closepath stroke + 5.20 3.54 moveto + 5.25 3.14 lineto +closepath stroke + 5.20 3.54 moveto + 5.01 3.14 lineto +closepath stroke + 5.20 3.54 moveto + 4.97 3.49 lineto +closepath stroke + 5.20 3.54 moveto + 5.46 3.59 lineto +closepath stroke + 5.20 3.54 moveto + 4.87 3.82 lineto +closepath stroke + 5.20 3.54 moveto + 5.08 3.91 lineto +closepath stroke + 5.71 3.65 moveto + 6.04 3.20 lineto +closepath stroke + 5.71 3.65 moveto + 5.76 3.20 lineto +closepath stroke + 5.71 3.65 moveto + 5.50 3.20 lineto +closepath stroke + 5.71 3.65 moveto + 5.46 3.59 lineto +closepath stroke + 5.71 3.65 moveto + 5.99 3.70 lineto +closepath stroke + 5.71 3.65 moveto + 5.34 3.97 lineto +closepath stroke + 5.71 3.65 moveto + 5.57 4.07 lineto +closepath stroke + 6.27 3.76 moveto + 6.64 3.26 lineto +closepath stroke + 6.27 3.76 moveto + 6.32 3.26 lineto +closepath stroke + 6.27 3.76 moveto + 5.99 3.70 lineto +closepath stroke + 6.27 3.76 moveto + 6.58 3.83 lineto +closepath stroke + 6.27 3.76 moveto + 5.85 4.13 lineto +closepath stroke + 6.27 3.76 moveto + 6.11 4.25 lineto +closepath stroke + 6.88 3.89 moveto + 6.94 3.32 lineto +closepath stroke + 6.88 3.89 moveto + 6.58 3.83 lineto +closepath stroke + 6.88 3.89 moveto + 7.22 3.97 lineto +closepath stroke + 6.88 3.89 moveto + 6.42 4.31 lineto +closepath stroke + 6.88 3.89 moveto + 6.71 4.44 lineto +closepath stroke + 7.56 4.04 moveto + 7.63 3.39 lineto +closepath stroke + 7.56 4.04 moveto + 7.28 3.39 lineto +closepath stroke + 7.56 4.04 moveto + 7.22 3.97 lineto +closepath stroke + 7.56 4.04 moveto + 7.93 4.12 lineto +closepath stroke + 7.56 4.04 moveto + 7.04 4.51 lineto +closepath stroke + 7.56 4.04 moveto + 7.36 4.77 lineto +closepath stroke + 8.30 4.20 moveto + 8.38 3.47 lineto +closepath stroke + 8.30 4.20 moveto + 8.00 3.47 lineto +closepath stroke + 8.30 4.20 moveto + 7.93 4.12 lineto +closepath stroke + 8.30 4.20 moveto + 8.71 4.28 lineto +closepath stroke + 8.30 4.20 moveto + 7.73 4.85 lineto +closepath stroke + 9.12 4.37 moveto + 9.20 3.56 lineto +closepath stroke + 9.12 4.37 moveto + 8.79 3.56 lineto +closepath stroke + 9.12 4.37 moveto + 8.71 4.28 lineto +closepath stroke + 9.12 4.37 moveto + 10.06 4.93 lineto +closepath stroke + 9.12 4.37 moveto + 10.06 4.47 lineto +closepath stroke + 9.12 4.37 moveto + 8.14 4.93 lineto +closepath stroke + 11.00 4.56 moveto + 10.06 4.47 lineto +closepath stroke + 11.00 4.56 moveto + 11.00 5.03 lineto +closepath stroke + 11.00 4.56 moveto + 11.00 3.66 lineto +closepath stroke + 11.00 4.56 moveto + 10.14 3.66 lineto +closepath stroke + 2.05 2.99 moveto + 2.17 2.96 lineto +closepath stroke + 2.05 2.99 moveto + 2.07 2.93 lineto +closepath stroke + 2.05 2.99 moveto + 2.14 3.03 lineto +closepath stroke + 2.05 2.99 moveto + 2.10 3.11 lineto +closepath stroke + 2.05 2.99 moveto + 2.02 3.05 lineto +closepath stroke + 2.23 3.08 moveto + 2.36 3.02 lineto +closepath stroke + 2.23 3.08 moveto + 2.26 3.00 lineto +closepath stroke + 2.23 3.08 moveto + 2.14 3.03 lineto +closepath stroke + 2.23 3.08 moveto + 2.33 3.12 lineto +closepath stroke + 2.23 3.08 moveto + 2.19 3.15 lineto +closepath stroke + 2.23 3.08 moveto + 2.28 3.21 lineto +closepath stroke + 2.43 3.16 moveto + 2.58 3.09 lineto +closepath stroke + 2.43 3.16 moveto + 2.46 3.06 lineto +closepath stroke + 2.43 3.16 moveto + 2.33 3.12 lineto +closepath stroke + 2.43 3.16 moveto + 2.54 3.21 lineto +closepath stroke + 2.43 3.16 moveto + 2.38 3.26 lineto +closepath stroke + 2.43 3.16 moveto + 2.48 3.33 lineto +closepath stroke + 2.65 3.26 moveto + 2.82 3.17 lineto +closepath stroke + 2.65 3.26 moveto + 2.69 3.14 lineto +closepath stroke + 2.65 3.26 moveto + 2.54 3.21 lineto +closepath stroke + 2.65 3.26 moveto + 2.77 3.32 lineto +closepath stroke + 2.65 3.26 moveto + 2.59 3.38 lineto +closepath stroke + 2.65 3.26 moveto + 2.69 3.46 lineto +closepath stroke + 2.90 3.37 moveto + 3.09 3.25 lineto +closepath stroke + 2.90 3.37 moveto + 2.95 3.22 lineto +closepath stroke + 2.90 3.37 moveto + 2.77 3.32 lineto +closepath stroke + 2.90 3.37 moveto + 3.03 3.43 lineto +closepath stroke + 2.90 3.37 moveto + 2.82 3.51 lineto +closepath stroke + 2.90 3.37 moveto + 2.93 3.60 lineto +closepath stroke + 3.16 3.49 moveto + 3.38 3.34 lineto +closepath stroke + 3.16 3.49 moveto + 3.22 3.31 lineto +closepath stroke + 3.16 3.49 moveto + 3.03 3.43 lineto +closepath stroke + 3.16 3.49 moveto + 3.31 3.56 lineto +closepath stroke + 3.16 3.49 moveto + 3.07 3.66 lineto +closepath stroke + 3.16 3.49 moveto + 3.20 3.75 lineto +closepath stroke + 3.46 3.62 moveto + 3.70 3.45 lineto +closepath stroke + 3.46 3.62 moveto + 3.53 3.41 lineto +closepath stroke + 3.46 3.62 moveto + 3.31 3.56 lineto +closepath stroke + 3.46 3.62 moveto + 3.62 3.69 lineto +closepath stroke + 3.46 3.62 moveto + 3.35 3.82 lineto +closepath stroke + 3.78 3.77 moveto + 4.05 3.56 lineto +closepath stroke + 3.78 3.77 moveto + 3.86 3.52 lineto +closepath stroke + 3.78 3.77 moveto + 3.62 3.69 lineto +closepath stroke + 3.78 3.77 moveto + 3.96 3.85 lineto +closepath stroke + 3.78 3.77 moveto + 3.51 3.89 lineto +closepath stroke + 3.78 3.77 moveto + 3.65 3.99 lineto +closepath stroke + 3.78 3.77 moveto + 3.81 4.11 lineto +closepath stroke + 4.14 3.92 moveto + 4.44 3.68 lineto +closepath stroke + 4.14 3.92 moveto + 4.23 3.64 lineto +closepath stroke + 4.14 3.92 moveto + 3.96 3.85 lineto +closepath stroke + 4.14 3.92 moveto + 4.33 4.01 lineto +closepath stroke + 4.14 3.92 moveto + 3.99 4.19 lineto +closepath stroke + 4.14 3.92 moveto + 4.16 4.31 lineto +closepath stroke + 4.53 4.10 moveto + 4.87 3.82 lineto +closepath stroke + 4.53 4.10 moveto + 4.64 3.77 lineto +closepath stroke + 4.53 4.10 moveto + 4.33 4.01 lineto +closepath stroke + 4.53 4.10 moveto + 4.74 4.19 lineto +closepath stroke + 4.53 4.10 moveto + 4.36 4.40 lineto +closepath stroke + 4.53 4.10 moveto + 4.55 4.54 lineto +closepath stroke + 4.96 4.29 moveto + 5.34 3.97 lineto +closepath stroke + 4.96 4.29 moveto + 5.08 3.91 lineto +closepath stroke + 4.96 4.29 moveto + 4.74 4.19 lineto +closepath stroke + 4.96 4.29 moveto + 5.20 4.40 lineto +closepath stroke + 4.96 4.29 moveto + 4.76 4.63 lineto +closepath stroke + 5.43 4.50 moveto + 5.85 4.13 lineto +closepath stroke + 5.43 4.50 moveto + 5.57 4.07 lineto +closepath stroke + 5.43 4.50 moveto + 5.20 4.40 lineto +closepath stroke + 5.43 4.50 moveto + 5.69 4.62 lineto +closepath stroke + 5.43 4.50 moveto + 5.00 4.74 lineto +closepath stroke + 5.43 4.50 moveto + 5.21 5.00 lineto +closepath stroke + 5.96 4.73 moveto + 6.42 4.31 lineto +closepath stroke + 5.96 4.73 moveto + 6.11 4.25 lineto +closepath stroke + 5.96 4.73 moveto + 5.69 4.62 lineto +closepath stroke + 5.96 4.73 moveto + 6.24 4.86 lineto +closepath stroke + 5.96 4.73 moveto + 5.47 5.12 lineto +closepath stroke + 6.53 4.99 moveto + 7.04 4.51 lineto +closepath stroke + 6.53 4.99 moveto + 6.71 4.44 lineto +closepath stroke + 6.53 4.99 moveto + 6.24 4.86 lineto +closepath stroke + 6.53 4.99 moveto + 6.84 5.24 lineto +closepath stroke + 6.53 4.99 moveto + 5.76 5.24 lineto +closepath stroke + 7.16 5.50 moveto + 9.08 5.50 lineto +closepath stroke + 7.16 5.50 moveto + 8.14 4.93 lineto +closepath stroke + 7.16 5.50 moveto + 7.73 4.85 lineto +closepath stroke + 7.16 5.50 moveto + 7.36 4.77 lineto +closepath stroke + 7.16 5.50 moveto + 6.84 5.24 lineto +closepath stroke + 7.16 5.50 moveto + 6.07 5.50 lineto +closepath stroke + 1.99 3.10 moveto + 2.07 3.16 lineto +closepath stroke + 1.99 3.10 moveto + 2.02 3.05 lineto +closepath stroke + 1.99 3.10 moveto + 2.01 3.22 lineto +closepath stroke + 1.99 3.10 moveto + 1.94 3.15 lineto +closepath stroke + 2.15 3.22 moveto + 2.19 3.15 lineto +closepath stroke + 2.15 3.22 moveto + 2.10 3.11 lineto +closepath stroke + 2.15 3.22 moveto + 2.07 3.16 lineto +closepath stroke + 2.15 3.22 moveto + 2.24 3.28 lineto +closepath stroke + 2.15 3.22 moveto + 2.09 3.28 lineto +closepath stroke + 2.15 3.22 moveto + 2.16 3.36 lineto +closepath stroke + 2.33 3.35 moveto + 2.38 3.26 lineto +closepath stroke + 2.33 3.35 moveto + 2.28 3.21 lineto +closepath stroke + 2.33 3.35 moveto + 2.24 3.28 lineto +closepath stroke + 2.33 3.35 moveto + 2.42 3.42 lineto +closepath stroke + 2.33 3.35 moveto + 2.25 3.43 lineto +closepath stroke + 2.33 3.35 moveto + 2.33 3.52 lineto +closepath stroke + 2.52 3.49 moveto + 2.59 3.38 lineto +closepath stroke + 2.52 3.49 moveto + 2.48 3.33 lineto +closepath stroke + 2.52 3.49 moveto + 2.42 3.42 lineto +closepath stroke + 2.52 3.49 moveto + 2.63 3.57 lineto +closepath stroke + 2.52 3.49 moveto + 2.43 3.59 lineto +closepath stroke + 2.52 3.49 moveto + 2.52 3.69 lineto +closepath stroke + 2.74 3.65 moveto + 2.82 3.51 lineto +closepath stroke + 2.74 3.65 moveto + 2.69 3.46 lineto +closepath stroke + 2.74 3.65 moveto + 2.63 3.57 lineto +closepath stroke + 2.74 3.65 moveto + 2.85 3.73 lineto +closepath stroke + 2.74 3.65 moveto + 2.63 3.77 lineto +closepath stroke + 2.74 3.65 moveto + 2.73 3.88 lineto +closepath stroke + 2.97 3.82 moveto + 3.07 3.66 lineto +closepath stroke + 2.97 3.82 moveto + 2.93 3.60 lineto +closepath stroke + 2.97 3.82 moveto + 2.85 3.73 lineto +closepath stroke + 2.97 3.82 moveto + 3.10 3.92 lineto +closepath stroke + 2.97 3.82 moveto + 2.85 3.96 lineto +closepath stroke + 2.97 3.82 moveto + 2.95 4.08 lineto +closepath stroke + 3.23 4.01 moveto + 3.51 3.89 lineto +closepath stroke + 3.23 4.01 moveto + 3.35 3.82 lineto +closepath stroke + 3.23 4.01 moveto + 3.20 3.75 lineto +closepath stroke + 3.23 4.01 moveto + 3.10 3.92 lineto +closepath stroke + 3.23 4.01 moveto + 3.38 4.11 lineto +closepath stroke + 3.23 4.01 moveto + 3.08 4.18 lineto +closepath stroke + 3.52 4.22 moveto + 3.65 3.99 lineto +closepath stroke + 3.52 4.22 moveto + 3.38 4.11 lineto +closepath stroke + 3.52 4.22 moveto + 3.68 4.33 lineto +closepath stroke + 3.52 4.22 moveto + 3.23 4.28 lineto +closepath stroke + 3.52 4.22 moveto + 3.35 4.41 lineto +closepath stroke + 3.84 4.45 moveto + 3.99 4.19 lineto +closepath stroke + 3.84 4.45 moveto + 3.81 4.11 lineto +closepath stroke + 3.84 4.45 moveto + 3.68 4.33 lineto +closepath stroke + 3.84 4.45 moveto + 4.01 4.57 lineto +closepath stroke + 3.84 4.45 moveto + 3.50 4.53 lineto +closepath stroke + 3.84 4.45 moveto + 3.63 4.67 lineto +closepath stroke + 4.18 4.70 moveto + 4.36 4.40 lineto +closepath stroke + 4.18 4.70 moveto + 4.16 4.31 lineto +closepath stroke + 4.18 4.70 moveto + 4.01 4.57 lineto +closepath stroke + 4.18 4.70 moveto + 4.37 4.84 lineto +closepath stroke + 4.18 4.70 moveto + 3.81 4.80 lineto +closepath stroke + 4.18 4.70 moveto + 3.95 5.10 lineto +closepath stroke + 4.56 4.98 moveto + 4.76 4.63 lineto +closepath stroke + 4.56 4.98 moveto + 4.55 4.54 lineto +closepath stroke + 4.56 4.98 moveto + 4.37 4.84 lineto +closepath stroke + 4.56 4.98 moveto + 5.00 4.74 lineto +closepath stroke + 4.56 4.98 moveto + 4.77 5.24 lineto +closepath stroke + 4.56 4.98 moveto + 4.14 5.24 lineto +closepath stroke + 4.98 5.50 moveto + 5.76 5.24 lineto +closepath stroke + 4.98 5.50 moveto + 5.47 5.12 lineto +closepath stroke + 4.98 5.50 moveto + 6.07 5.50 lineto +closepath stroke + 4.98 5.50 moveto + 5.21 5.00 lineto +closepath stroke + 4.98 5.50 moveto + 4.77 5.24 lineto +closepath stroke + 4.98 5.50 moveto + 4.35 5.50 lineto +closepath stroke + 1.90 3.20 moveto + 1.97 3.27 lineto +closepath stroke + 1.90 3.20 moveto + 1.94 3.15 lineto +closepath stroke + 1.90 3.20 moveto + 1.90 3.32 lineto +closepath stroke + 1.90 3.20 moveto + 1.85 3.23 lineto +closepath stroke + 2.04 3.34 moveto + 2.09 3.28 lineto +closepath stroke + 2.04 3.34 moveto + 2.01 3.22 lineto +closepath stroke + 2.04 3.34 moveto + 1.97 3.27 lineto +closepath stroke + 2.04 3.34 moveto + 2.11 3.43 lineto +closepath stroke + 2.04 3.34 moveto + 1.97 3.39 lineto +closepath stroke + 2.18 3.51 moveto + 2.25 3.43 lineto +closepath stroke + 2.18 3.51 moveto + 2.16 3.36 lineto +closepath stroke + 2.18 3.51 moveto + 2.11 3.43 lineto +closepath stroke + 2.18 3.51 moveto + 2.26 3.60 lineto +closepath stroke + 2.18 3.51 moveto + 2.04 3.48 lineto +closepath stroke + 2.18 3.51 moveto + 2.10 3.57 lineto +closepath stroke + 2.18 3.51 moveto + 2.16 3.68 lineto +closepath stroke + 2.34 3.69 moveto + 2.43 3.59 lineto +closepath stroke + 2.34 3.69 moveto + 2.33 3.52 lineto +closepath stroke + 2.34 3.69 moveto + 2.26 3.60 lineto +closepath stroke + 2.34 3.69 moveto + 2.43 3.79 lineto +closepath stroke + 2.34 3.69 moveto + 2.24 3.77 lineto +closepath stroke + 2.52 3.89 moveto + 2.63 3.77 lineto +closepath stroke + 2.52 3.89 moveto + 2.52 3.69 lineto +closepath stroke + 2.52 3.89 moveto + 2.43 3.79 lineto +closepath stroke + 2.52 3.89 moveto + 2.62 3.99 lineto +closepath stroke + 2.52 3.89 moveto + 2.33 3.86 lineto +closepath stroke + 2.52 3.89 moveto + 2.39 3.98 lineto +closepath stroke + 2.72 4.10 moveto + 2.85 3.96 lineto +closepath stroke + 2.72 4.10 moveto + 2.73 3.88 lineto +closepath stroke + 2.72 4.10 moveto + 2.62 3.99 lineto +closepath stroke + 2.72 4.10 moveto + 2.83 4.22 lineto +closepath stroke + 2.72 4.10 moveto + 2.49 4.09 lineto +closepath stroke + 2.72 4.10 moveto + 2.56 4.22 lineto +closepath stroke + 2.93 4.34 moveto + 3.23 4.28 lineto +closepath stroke + 2.93 4.34 moveto + 3.08 4.18 lineto +closepath stroke + 2.93 4.34 moveto + 2.95 4.08 lineto +closepath stroke + 2.93 4.34 moveto + 2.83 4.22 lineto +closepath stroke + 2.93 4.34 moveto + 3.05 4.47 lineto +closepath stroke + 2.93 4.34 moveto + 2.67 4.33 lineto +closepath stroke + 2.93 4.34 moveto + 2.75 4.47 lineto +closepath stroke + 2.93 4.34 moveto + 2.84 4.63 lineto +closepath stroke + 3.17 4.61 moveto + 3.50 4.53 lineto +closepath stroke + 3.17 4.61 moveto + 3.35 4.41 lineto +closepath stroke + 3.17 4.61 moveto + 3.05 4.47 lineto +closepath stroke + 3.17 4.61 moveto + 3.30 4.75 lineto +closepath stroke + 3.17 4.61 moveto + 2.96 4.76 lineto +closepath stroke + 3.43 4.90 moveto + 3.81 4.80 lineto +closepath stroke + 3.43 4.90 moveto + 3.63 4.67 lineto +closepath stroke + 3.43 4.90 moveto + 3.30 4.75 lineto +closepath stroke + 3.43 4.90 moveto + 3.58 5.20 lineto +closepath stroke + 3.43 4.90 moveto + 3.09 4.90 lineto +closepath stroke + 3.43 4.90 moveto + 3.19 5.20 lineto +closepath stroke + 3.72 5.50 moveto + 4.14 5.24 lineto +closepath stroke + 3.72 5.50 moveto + 3.95 5.10 lineto +closepath stroke + 3.72 5.50 moveto + 3.58 5.20 lineto +closepath stroke + 3.72 5.50 moveto + 4.35 5.50 lineto +closepath stroke + 3.72 5.50 moveto + 3.33 5.50 lineto +closepath stroke + 1.80 3.27 moveto + 1.85 3.36 lineto +closepath stroke + 1.80 3.27 moveto + 1.85 3.23 lineto +closepath stroke + 1.80 3.27 moveto + 1.77 3.39 lineto +closepath stroke + 1.80 3.27 moveto + 1.74 3.30 lineto +closepath stroke + 1.90 3.44 moveto + 1.97 3.39 lineto +closepath stroke + 1.90 3.44 moveto + 1.90 3.32 lineto +closepath stroke + 1.90 3.44 moveto + 1.85 3.36 lineto +closepath stroke + 1.90 3.44 moveto + 2.04 3.48 lineto +closepath stroke + 1.90 3.44 moveto + 1.95 3.54 lineto +closepath stroke + 1.90 3.44 moveto + 1.82 3.48 lineto +closepath stroke + 2.01 3.63 moveto + 2.10 3.57 lineto +closepath stroke + 2.01 3.63 moveto + 1.95 3.54 lineto +closepath stroke + 2.01 3.63 moveto + 2.07 3.74 lineto +closepath stroke + 2.01 3.63 moveto + 1.88 3.57 lineto +closepath stroke + 2.01 3.63 moveto + 1.91 3.68 lineto +closepath stroke + 2.13 3.84 moveto + 2.33 3.86 lineto +closepath stroke + 2.13 3.84 moveto + 2.24 3.77 lineto +closepath stroke + 2.13 3.84 moveto + 2.16 3.68 lineto +closepath stroke + 2.13 3.84 moveto + 2.07 3.74 lineto +closepath stroke + 2.13 3.84 moveto + 2.20 3.96 lineto +closepath stroke + 2.13 3.84 moveto + 1.97 3.78 lineto +closepath stroke + 2.13 3.84 moveto + 2.01 3.90 lineto +closepath stroke + 2.26 4.07 moveto + 2.49 4.09 lineto +closepath stroke + 2.26 4.07 moveto + 2.39 3.98 lineto +closepath stroke + 2.26 4.07 moveto + 2.20 3.96 lineto +closepath stroke + 2.26 4.07 moveto + 2.34 4.20 lineto +closepath stroke + 2.26 4.07 moveto + 2.08 4.01 lineto +closepath stroke + 2.26 4.07 moveto + 2.12 4.14 lineto +closepath stroke + 2.26 4.07 moveto + 2.16 4.28 lineto +closepath stroke + 2.41 4.33 moveto + 2.67 4.33 lineto +closepath stroke + 2.41 4.33 moveto + 2.56 4.22 lineto +closepath stroke + 2.41 4.33 moveto + 2.34 4.20 lineto +closepath stroke + 2.41 4.33 moveto + 2.49 4.47 lineto +closepath stroke + 2.41 4.33 moveto + 2.24 4.40 lineto +closepath stroke + 2.41 4.33 moveto + 2.29 4.56 lineto +closepath stroke + 2.57 4.61 moveto + 2.75 4.47 lineto +closepath stroke + 2.57 4.61 moveto + 2.49 4.47 lineto +closepath stroke + 2.57 4.61 moveto + 2.66 4.76 lineto +closepath stroke + 2.57 4.61 moveto + 2.37 4.70 lineto +closepath stroke + 2.57 4.61 moveto + 2.42 4.87 lineto +closepath stroke + 2.75 4.91 moveto + 3.09 4.90 lineto +closepath stroke + 2.75 4.91 moveto + 2.96 4.76 lineto +closepath stroke + 2.75 4.91 moveto + 2.84 4.63 lineto +closepath stroke + 2.75 4.91 moveto + 2.66 4.76 lineto +closepath stroke + 2.75 4.91 moveto + 2.85 5.21 lineto +closepath stroke + 2.75 4.91 moveto + 2.51 5.02 lineto +closepath stroke + 2.94 5.50 moveto + 3.19 5.20 lineto +closepath stroke + 2.94 5.50 moveto + 2.85 5.21 lineto +closepath stroke + 2.94 5.50 moveto + 3.33 5.50 lineto +closepath stroke + 2.94 5.50 moveto + 2.61 5.31 lineto +closepath stroke + 2.94 5.50 moveto + 2.61 5.50 lineto +closepath stroke + 1.69 3.32 moveto + 1.72 3.42 lineto +closepath stroke + 1.69 3.32 moveto + 1.74 3.30 lineto +closepath stroke + 1.69 3.32 moveto + 1.62 3.33 lineto +closepath stroke + 1.75 3.51 moveto + 1.82 3.48 lineto +closepath stroke + 1.75 3.51 moveto + 1.77 3.39 lineto +closepath stroke + 1.75 3.51 moveto + 1.72 3.42 lineto +closepath stroke + 1.75 3.51 moveto + 1.88 3.57 lineto +closepath stroke + 1.75 3.51 moveto + 1.78 3.62 lineto +closepath stroke + 1.75 3.51 moveto + 1.65 3.43 lineto +closepath stroke + 1.75 3.51 moveto + 1.67 3.53 lineto +closepath stroke + 1.82 3.72 moveto + 1.97 3.78 lineto +closepath stroke + 1.82 3.72 moveto + 1.91 3.68 lineto +closepath stroke + 1.82 3.72 moveto + 1.78 3.62 lineto +closepath stroke + 1.82 3.72 moveto + 1.85 3.84 lineto +closepath stroke + 1.82 3.72 moveto + 1.70 3.63 lineto +closepath stroke + 1.82 3.72 moveto + 1.71 3.74 lineto +closepath stroke + 1.89 3.95 moveto + 2.08 4.01 lineto +closepath stroke + 1.89 3.95 moveto + 2.01 3.90 lineto +closepath stroke + 1.89 3.95 moveto + 1.85 3.84 lineto +closepath stroke + 1.89 3.95 moveto + 1.93 4.08 lineto +closepath stroke + 1.89 3.95 moveto + 1.75 3.86 lineto +closepath stroke + 1.89 3.95 moveto + 1.76 3.98 lineto +closepath stroke + 1.89 3.95 moveto + 1.77 4.11 lineto +closepath stroke + 1.97 4.20 moveto + 2.12 4.14 lineto +closepath stroke + 1.97 4.20 moveto + 1.93 4.08 lineto +closepath stroke + 1.97 4.20 moveto + 2.02 4.34 lineto +closepath stroke + 1.97 4.20 moveto + 1.82 4.24 lineto +closepath stroke + 1.97 4.20 moveto + 1.83 4.38 lineto +closepath stroke + 2.06 4.48 moveto + 2.24 4.40 lineto +closepath stroke + 2.06 4.48 moveto + 2.16 4.28 lineto +closepath stroke + 2.06 4.48 moveto + 2.02 4.34 lineto +closepath stroke + 2.06 4.48 moveto + 2.11 4.64 lineto +closepath stroke + 2.06 4.48 moveto + 1.88 4.52 lineto +closepath stroke + 2.06 4.48 moveto + 1.89 4.68 lineto +closepath stroke + 2.16 4.79 moveto + 2.37 4.70 lineto +closepath stroke + 2.16 4.79 moveto + 2.29 4.56 lineto +closepath stroke + 2.16 4.79 moveto + 2.11 4.64 lineto +closepath stroke + 2.16 4.79 moveto + 2.22 4.96 lineto +closepath stroke + 2.16 4.79 moveto + 1.94 4.83 lineto +closepath stroke + 2.27 5.13 moveto + 2.61 5.31 lineto +closepath stroke + 2.27 5.13 moveto + 2.51 5.02 lineto +closepath stroke + 2.27 5.13 moveto + 2.42 4.87 lineto +closepath stroke + 2.27 5.13 moveto + 2.22 4.96 lineto +closepath stroke + 2.27 5.13 moveto + 2.27 5.31 lineto +closepath stroke + 2.27 5.13 moveto + 2.00 5.00 lineto +closepath stroke + 2.27 5.13 moveto + 2.02 5.31 lineto +closepath stroke + 2.27 5.50 moveto + 2.61 5.50 lineto +closepath stroke + 2.27 5.50 moveto + 2.27 5.31 lineto +closepath stroke + 2.27 5.50 moveto + 2.02 5.50 lineto +closepath stroke + 1.56 3.35 moveto + 1.65 3.43 lineto +closepath stroke + 1.56 3.35 moveto + 1.62 3.33 lineto +closepath stroke + 1.56 3.35 moveto + 1.57 3.45 lineto +closepath stroke + 1.56 3.35 moveto + 1.49 3.45 lineto +closepath stroke + 1.56 3.35 moveto + 1.50 3.35 lineto +closepath stroke + 1.58 3.55 moveto + 1.70 3.63 lineto +closepath stroke + 1.58 3.55 moveto + 1.67 3.53 lineto +closepath stroke + 1.58 3.55 moveto + 1.57 3.45 lineto +closepath stroke + 1.58 3.55 moveto + 1.60 3.66 lineto +closepath stroke + 1.58 3.55 moveto + 1.50 3.55 lineto +closepath stroke + 1.58 3.55 moveto + 1.49 3.66 lineto +closepath stroke + 1.61 3.76 moveto + 1.75 3.86 lineto +closepath stroke + 1.61 3.76 moveto + 1.71 3.74 lineto +closepath stroke + 1.61 3.76 moveto + 1.60 3.66 lineto +closepath stroke + 1.61 3.76 moveto + 1.62 3.88 lineto +closepath stroke + 1.61 3.76 moveto + 1.50 3.76 lineto +closepath stroke + 1.61 3.76 moveto + 1.49 3.88 lineto +closepath stroke + 1.63 4.01 moveto + 1.76 3.98 lineto +closepath stroke + 1.63 4.01 moveto + 1.62 3.88 lineto +closepath stroke + 1.63 4.01 moveto + 1.65 4.14 lineto +closepath stroke + 1.63 4.01 moveto + 1.50 4.01 lineto +closepath stroke + 1.63 4.01 moveto + 1.49 4.14 lineto +closepath stroke + 1.66 4.27 moveto + 1.82 4.24 lineto +closepath stroke + 1.66 4.27 moveto + 1.77 4.11 lineto +closepath stroke + 1.66 4.27 moveto + 1.65 4.14 lineto +closepath stroke + 1.66 4.27 moveto + 1.68 4.42 lineto +closepath stroke + 1.66 4.27 moveto + 1.50 4.27 lineto +closepath stroke + 1.69 4.56 moveto + 1.88 4.52 lineto +closepath stroke + 1.69 4.56 moveto + 1.83 4.38 lineto +closepath stroke + 1.69 4.56 moveto + 1.68 4.42 lineto +closepath stroke + 1.69 4.56 moveto + 1.71 4.72 lineto +closepath stroke + 1.69 4.56 moveto + 1.52 4.42 lineto +closepath stroke + 1.69 4.56 moveto + 1.50 4.56 lineto +closepath stroke + 1.72 4.88 moveto + 2.00 5.00 lineto +closepath stroke + 1.72 4.88 moveto + 1.94 4.83 lineto +closepath stroke + 1.72 4.88 moveto + 1.89 4.68 lineto +closepath stroke + 1.72 4.88 moveto + 1.71 4.72 lineto +closepath stroke + 1.72 4.88 moveto + 1.74 5.19 lineto +closepath stroke + 1.72 4.88 moveto + 1.52 4.72 lineto +closepath stroke + 1.72 4.88 moveto + 1.50 4.88 lineto +closepath stroke + 1.76 5.50 moveto + 2.02 5.50 lineto +closepath stroke + 1.76 5.50 moveto + 2.02 5.31 lineto +closepath stroke + 1.76 5.50 moveto + 1.74 5.19 lineto +closepath stroke + 1.76 5.50 moveto + 1.52 5.19 lineto +closepath stroke + 1.76 5.50 moveto + 1.50 5.50 lineto +closepath stroke + 1.44 3.35 moveto + 1.43 3.45 lineto +closepath stroke + 1.44 3.35 moveto + 1.50 3.35 lineto +closepath stroke + 1.44 3.35 moveto + 1.38 3.33 lineto +closepath stroke + 1.42 3.55 moveto + 1.50 3.55 lineto +closepath stroke + 1.42 3.55 moveto + 1.49 3.45 lineto +closepath stroke + 1.42 3.55 moveto + 1.43 3.45 lineto +closepath stroke + 1.42 3.55 moveto + 1.40 3.66 lineto +closepath stroke + 1.42 3.55 moveto + 1.37 3.43 lineto +closepath stroke + 1.42 3.55 moveto + 1.33 3.53 lineto +closepath stroke + 1.39 3.76 moveto + 1.50 3.76 lineto +closepath stroke + 1.39 3.76 moveto + 1.49 3.66 lineto +closepath stroke + 1.39 3.76 moveto + 1.40 3.66 lineto +closepath stroke + 1.39 3.76 moveto + 1.38 3.88 lineto +closepath stroke + 1.39 3.76 moveto + 1.32 3.64 lineto +closepath stroke + 1.39 3.76 moveto + 1.29 3.74 lineto +closepath stroke + 1.37 4.01 moveto + 1.50 4.01 lineto +closepath stroke + 1.37 4.01 moveto + 1.49 3.88 lineto +closepath stroke + 1.37 4.01 moveto + 1.38 3.88 lineto +closepath stroke + 1.37 4.01 moveto + 1.35 4.14 lineto +closepath stroke + 1.37 4.01 moveto + 1.28 3.86 lineto +closepath stroke + 1.37 4.01 moveto + 1.24 3.98 lineto +closepath stroke + 1.34 4.27 moveto + 1.52 4.42 lineto +closepath stroke + 1.34 4.27 moveto + 1.50 4.27 lineto +closepath stroke + 1.34 4.27 moveto + 1.49 4.14 lineto +closepath stroke + 1.34 4.27 moveto + 1.35 4.14 lineto +closepath stroke + 1.34 4.27 moveto + 1.32 4.42 lineto +closepath stroke + 1.34 4.27 moveto + 1.23 4.11 lineto +closepath stroke + 1.34 4.27 moveto + 1.18 4.24 lineto +closepath stroke + 1.31 4.56 moveto + 1.52 4.72 lineto +closepath stroke + 1.31 4.56 moveto + 1.50 4.56 lineto +closepath stroke + 1.31 4.56 moveto + 1.32 4.42 lineto +closepath stroke + 1.31 4.56 moveto + 1.29 4.72 lineto +closepath stroke + 1.31 4.56 moveto + 1.17 4.38 lineto +closepath stroke + 1.31 4.56 moveto + 1.12 4.52 lineto +closepath stroke + 1.31 4.56 moveto + 1.07 4.67 lineto +closepath stroke + 1.28 4.88 moveto + 1.52 5.19 lineto +closepath stroke + 1.28 4.88 moveto + 1.50 4.88 lineto +closepath stroke + 1.28 4.88 moveto + 1.29 4.72 lineto +closepath stroke + 1.28 4.88 moveto + 1.26 5.19 lineto +closepath stroke + 1.28 4.88 moveto + 1.06 4.83 lineto +closepath stroke + 1.28 4.88 moveto + 1.00 5.00 lineto +closepath stroke + 1.24 5.50 moveto + 1.50 5.50 lineto +closepath stroke + 1.24 5.50 moveto + 1.26 5.19 lineto +closepath stroke + 1.24 5.50 moveto + 0.98 5.31 lineto +closepath stroke + 1.24 5.50 moveto + 0.98 5.50 lineto +closepath stroke + 1.31 3.32 moveto + 1.37 3.43 lineto +closepath stroke + 1.31 3.32 moveto + 1.38 3.33 lineto +closepath stroke + 1.31 3.32 moveto + 1.28 3.42 lineto +closepath stroke + 1.31 3.32 moveto + 1.21 3.38 lineto +closepath stroke + 1.31 3.32 moveto + 1.26 3.30 lineto +closepath stroke + 1.25 3.51 moveto + 1.32 3.64 lineto +closepath stroke + 1.25 3.51 moveto + 1.33 3.53 lineto +closepath stroke + 1.25 3.51 moveto + 1.28 3.42 lineto +closepath stroke + 1.25 3.51 moveto + 1.22 3.62 lineto +closepath stroke + 1.25 3.51 moveto + 1.18 3.48 lineto +closepath stroke + 1.25 3.51 moveto + 1.12 3.57 lineto +closepath stroke + 1.18 3.72 moveto + 1.28 3.86 lineto +closepath stroke + 1.18 3.72 moveto + 1.29 3.74 lineto +closepath stroke + 1.18 3.72 moveto + 1.22 3.62 lineto +closepath stroke + 1.18 3.72 moveto + 1.15 3.84 lineto +closepath stroke + 1.18 3.72 moveto + 1.09 3.68 lineto +closepath stroke + 1.18 3.72 moveto + 1.03 3.78 lineto +closepath stroke + 1.11 3.95 moveto + 1.23 4.11 lineto +closepath stroke + 1.11 3.95 moveto + 1.24 3.98 lineto +closepath stroke + 1.11 3.95 moveto + 1.15 3.84 lineto +closepath stroke + 1.11 3.95 moveto + 1.07 4.08 lineto +closepath stroke + 1.11 3.95 moveto + 0.99 3.90 lineto +closepath stroke + 1.11 3.95 moveto + 0.92 4.01 lineto +closepath stroke + 1.03 4.20 moveto + 1.17 4.38 lineto +closepath stroke + 1.03 4.20 moveto + 1.18 4.24 lineto +closepath stroke + 1.03 4.20 moveto + 1.07 4.08 lineto +closepath stroke + 1.03 4.20 moveto + 0.98 4.34 lineto +closepath stroke + 1.03 4.20 moveto + 0.88 4.14 lineto +closepath stroke + 1.03 4.20 moveto + 0.81 4.27 lineto +closepath stroke + 0.94 4.48 moveto + 1.12 4.52 lineto +closepath stroke + 0.94 4.48 moveto + 0.98 4.34 lineto +closepath stroke + 0.94 4.48 moveto + 0.89 4.64 lineto +closepath stroke + 0.94 4.48 moveto + 0.76 4.40 lineto +closepath stroke + 0.84 4.79 moveto + 1.06 4.83 lineto +closepath stroke + 0.84 4.79 moveto + 1.07 4.67 lineto +closepath stroke + 0.84 4.79 moveto + 0.89 4.64 lineto +closepath stroke + 0.84 4.79 moveto + 0.78 4.96 lineto +closepath stroke + 0.84 4.79 moveto + 0.71 4.56 lineto +closepath stroke + 0.84 4.79 moveto + 0.63 4.70 lineto +closepath stroke + 0.73 5.13 moveto + 0.98 5.31 lineto +closepath stroke + 0.73 5.13 moveto + 1.00 5.00 lineto +closepath stroke + 0.73 5.13 moveto + 0.78 4.96 lineto +closepath stroke + 0.73 5.13 moveto + 0.73 5.31 lineto +closepath stroke + 0.73 5.13 moveto + 0.36 5.31 lineto +closepath stroke + 0.73 5.13 moveto + 0.58 4.87 lineto +closepath stroke + 0.73 5.13 moveto + 0.49 5.02 lineto +closepath stroke + 0.73 5.50 moveto + 0.98 5.50 lineto +closepath stroke + 0.73 5.50 moveto + 0.73 5.31 lineto +closepath stroke + 0.73 5.50 moveto + 0.36 5.50 lineto +closepath stroke + 1.20 3.27 moveto + 1.15 3.36 lineto +closepath stroke + 1.20 3.27 moveto + 1.26 3.30 lineto +closepath stroke + 1.20 3.27 moveto + 1.15 3.23 lineto +closepath stroke + 1.10 3.44 moveto + 1.18 3.48 lineto +closepath stroke + 1.10 3.44 moveto + 1.21 3.38 lineto +closepath stroke + 1.10 3.44 moveto + 1.15 3.36 lineto +closepath stroke + 1.10 3.44 moveto + 1.04 3.54 lineto +closepath stroke + 1.10 3.44 moveto + 1.10 3.32 lineto +closepath stroke + 1.10 3.44 moveto + 1.03 3.39 lineto +closepath stroke + 0.99 3.63 moveto + 1.09 3.68 lineto +closepath stroke + 0.99 3.63 moveto + 1.12 3.57 lineto +closepath stroke + 0.99 3.63 moveto + 1.04 3.54 lineto +closepath stroke + 0.99 3.63 moveto + 0.93 3.74 lineto +closepath stroke + 0.99 3.63 moveto + 0.98 3.49 lineto +closepath stroke + 0.99 3.63 moveto + 0.90 3.57 lineto +closepath stroke + 0.99 3.63 moveto + 0.82 3.66 lineto +closepath stroke + 0.87 3.84 moveto + 0.99 3.90 lineto +closepath stroke + 0.87 3.84 moveto + 1.03 3.78 lineto +closepath stroke + 0.87 3.84 moveto + 0.93 3.74 lineto +closepath stroke + 0.87 3.84 moveto + 0.80 3.96 lineto +closepath stroke + 0.87 3.84 moveto + 0.76 3.77 lineto +closepath stroke + 0.87 3.84 moveto + 0.67 3.86 lineto +closepath stroke + 0.74 4.07 moveto + 0.88 4.14 lineto +closepath stroke + 0.74 4.07 moveto + 0.92 4.01 lineto +closepath stroke + 0.74 4.07 moveto + 0.80 3.96 lineto +closepath stroke + 0.74 4.07 moveto + 0.66 4.20 lineto +closepath stroke + 0.74 4.07 moveto + 0.61 3.98 lineto +closepath stroke + 0.74 4.07 moveto + 0.51 4.09 lineto +closepath stroke + 0.59 4.33 moveto + 0.71 4.56 lineto +closepath stroke + 0.59 4.33 moveto + 0.76 4.40 lineto +closepath stroke + 0.59 4.33 moveto + 0.81 4.27 lineto +closepath stroke + 0.59 4.33 moveto + 0.66 4.20 lineto +closepath stroke + 0.59 4.33 moveto + 0.51 4.47 lineto +closepath stroke + 0.59 4.33 moveto + 0.44 4.22 lineto +closepath stroke + 0.43 4.61 moveto + 0.58 4.87 lineto +closepath stroke + 0.43 4.61 moveto + 0.63 4.70 lineto +closepath stroke + 0.43 4.61 moveto + 0.51 4.47 lineto +closepath stroke + 0.43 4.61 moveto + 0.34 4.76 lineto +closepath stroke + 0.43 4.61 moveto + 0.21 4.76 lineto +closepath stroke + 0.43 4.61 moveto + 0.35 4.35 lineto +closepath stroke + 0.43 4.61 moveto + 0.21 4.47 lineto +closepath stroke + 0.25 4.91 moveto + 0.49 5.02 lineto +closepath stroke + 0.25 4.91 moveto + 0.34 4.76 lineto +closepath stroke + 0.25 4.91 moveto + 0.13 5.21 lineto +closepath stroke + 0.25 4.91 moveto + 0.13 4.91 lineto +closepath stroke + 0.00 4.91 moveto + 0.13 4.91 lineto +closepath stroke + 0.00 4.91 moveto + 0.21 4.76 lineto +closepath stroke + 0.00 4.91 moveto + 0.00 5.21 lineto +closepath stroke + 0.00 4.91 moveto + 0.00 4.63 lineto +closepath stroke + 1.10 3.20 moveto + 1.10 3.32 lineto +closepath stroke + 1.10 3.20 moveto + 1.15 3.23 lineto +closepath stroke + 1.10 3.20 moveto + 1.03 3.27 lineto +closepath stroke + 1.10 3.20 moveto + 0.98 3.21 lineto +closepath stroke + 1.10 3.20 moveto + 1.06 3.15 lineto +closepath stroke + 0.96 3.34 moveto + 0.98 3.49 lineto +closepath stroke + 0.96 3.34 moveto + 1.03 3.39 lineto +closepath stroke + 0.96 3.34 moveto + 1.03 3.27 lineto +closepath stroke + 0.96 3.34 moveto + 0.89 3.43 lineto +closepath stroke + 0.96 3.34 moveto + 0.91 3.28 lineto +closepath stroke + 0.96 3.34 moveto + 0.82 3.35 lineto +closepath stroke + 0.82 3.51 moveto + 0.90 3.57 lineto +closepath stroke + 0.82 3.51 moveto + 0.89 3.43 lineto +closepath stroke + 0.82 3.51 moveto + 0.74 3.60 lineto +closepath stroke + 0.82 3.51 moveto + 0.75 3.43 lineto +closepath stroke + 0.82 3.51 moveto + 0.65 3.50 lineto +closepath stroke + 0.66 3.69 moveto + 0.76 3.77 lineto +closepath stroke + 0.66 3.69 moveto + 0.82 3.66 lineto +closepath stroke + 0.66 3.69 moveto + 0.74 3.60 lineto +closepath stroke + 0.66 3.69 moveto + 0.57 3.79 lineto +closepath stroke + 0.66 3.69 moveto + 0.57 3.59 lineto +closepath stroke + 0.48 3.89 moveto + 0.61 3.98 lineto +closepath stroke + 0.48 3.89 moveto + 0.67 3.86 lineto +closepath stroke + 0.48 3.89 moveto + 0.57 3.79 lineto +closepath stroke + 0.48 3.89 moveto + 0.38 3.99 lineto +closepath stroke + 0.48 3.89 moveto + 0.48 3.69 lineto +closepath stroke + 0.48 3.89 moveto + 0.37 3.77 lineto +closepath stroke + 0.28 4.10 moveto + 0.35 4.35 lineto +closepath stroke + 0.28 4.10 moveto + 0.44 4.22 lineto +closepath stroke + 0.28 4.10 moveto + 0.51 4.09 lineto +closepath stroke + 0.28 4.10 moveto + 0.38 3.99 lineto +closepath stroke + 0.28 4.10 moveto + 0.14 4.22 lineto +closepath stroke + 0.28 4.10 moveto + 0.27 3.88 lineto +closepath stroke + 0.28 4.10 moveto + 0.14 3.88 lineto +closepath stroke + 0.00 4.34 moveto + 0.21 4.47 lineto +closepath stroke + 0.00 4.34 moveto + 0.14 4.22 lineto +closepath stroke + 0.00 4.34 moveto + 0.00 4.63 lineto +closepath stroke + 0.00 4.34 moveto + 0.00 4.00 lineto +closepath stroke + 1.01 3.10 moveto + 0.93 3.16 lineto +closepath stroke + 1.01 3.10 moveto + 1.06 3.15 lineto +closepath stroke + 1.01 3.10 moveto + 0.98 3.05 lineto +closepath stroke + 0.85 3.22 moveto + 0.91 3.28 lineto +closepath stroke + 0.85 3.22 moveto + 0.98 3.21 lineto +closepath stroke + 0.85 3.22 moveto + 0.93 3.16 lineto +closepath stroke + 0.85 3.22 moveto + 0.76 3.28 lineto +closepath stroke + 0.85 3.22 moveto + 0.90 3.11 lineto +closepath stroke + 0.85 3.22 moveto + 0.81 3.15 lineto +closepath stroke + 0.67 3.35 moveto + 0.75 3.43 lineto +closepath stroke + 0.67 3.35 moveto + 0.82 3.35 lineto +closepath stroke + 0.67 3.35 moveto + 0.76 3.28 lineto +closepath stroke + 0.67 3.35 moveto + 0.58 3.42 lineto +closepath stroke + 0.67 3.35 moveto + 0.72 3.21 lineto +closepath stroke + 0.67 3.35 moveto + 0.62 3.26 lineto +closepath stroke + 0.48 3.49 moveto + 0.48 3.69 lineto +closepath stroke + 0.48 3.49 moveto + 0.57 3.59 lineto +closepath stroke + 0.48 3.49 moveto + 0.65 3.50 lineto +closepath stroke + 0.48 3.49 moveto + 0.58 3.42 lineto +closepath stroke + 0.48 3.49 moveto + 0.37 3.57 lineto +closepath stroke + 0.48 3.49 moveto + 0.52 3.33 lineto +closepath stroke + 0.48 3.49 moveto + 0.41 3.38 lineto +closepath stroke + 0.26 3.65 moveto + 0.27 3.88 lineto +closepath stroke + 0.26 3.65 moveto + 0.37 3.77 lineto +closepath stroke + 0.26 3.65 moveto + 0.37 3.57 lineto +closepath stroke + 0.26 3.65 moveto + 0.13 3.65 lineto +closepath stroke + 0.26 3.65 moveto + 0.31 3.46 lineto +closepath stroke + 0.26 3.65 moveto + 0.13 3.51 lineto +closepath stroke + 0.00 3.65 moveto + 0.14 3.88 lineto +closepath stroke + 0.00 3.65 moveto + 0.13 3.65 lineto +closepath stroke + 0.00 3.65 moveto + 0.00 4.00 lineto +closepath stroke + 0.00 3.65 moveto + 0.00 3.51 lineto +closepath stroke + 0.95 2.99 moveto + 0.90 3.11 lineto +closepath stroke + 0.95 2.99 moveto + 0.98 3.05 lineto +closepath stroke + 0.95 2.99 moveto + 0.86 3.03 lineto +closepath stroke + 0.95 2.99 moveto + 0.83 2.96 lineto +closepath stroke + 0.95 2.99 moveto + 0.93 2.93 lineto +closepath stroke + 0.77 3.08 moveto + 0.72 3.21 lineto +closepath stroke + 0.77 3.08 moveto + 0.81 3.15 lineto +closepath stroke + 0.77 3.08 moveto + 0.86 3.03 lineto +closepath stroke + 0.77 3.08 moveto + 0.67 3.12 lineto +closepath stroke + 0.77 3.08 moveto + 0.74 3.00 lineto +closepath stroke + 0.57 3.16 moveto + 0.52 3.33 lineto +closepath stroke + 0.57 3.16 moveto + 0.62 3.26 lineto +closepath stroke + 0.57 3.16 moveto + 0.67 3.12 lineto +closepath stroke + 0.57 3.16 moveto + 0.46 3.21 lineto +closepath stroke + 0.57 3.16 moveto + 0.64 3.04 lineto +closepath stroke + 0.57 3.16 moveto + 0.54 3.06 lineto +closepath stroke + 0.57 3.16 moveto + 0.42 3.09 lineto +closepath stroke + 0.35 3.26 moveto + 0.31 3.46 lineto +closepath stroke + 0.35 3.26 moveto + 0.41 3.38 lineto +closepath stroke + 0.35 3.26 moveto + 0.46 3.21 lineto +closepath stroke + 0.35 3.26 moveto + 0.17 3.32 lineto +closepath stroke + 0.35 3.26 moveto + 0.31 3.14 lineto +closepath stroke + 0.00 3.37 moveto + 0.13 3.51 lineto +closepath stroke + 0.00 3.37 moveto + 0.17 3.32 lineto +closepath stroke + 0.00 3.37 moveto + 0.00 3.51 lineto +closepath stroke + 0.00 3.37 moveto + 0.13 3.19 lineto +closepath stroke + 0.00 3.37 moveto + 0.00 3.19 lineto +closepath stroke + 0.91 2.87 moveto + 0.82 2.90 lineto +closepath stroke + 0.91 2.87 moveto + 0.93 2.93 lineto +closepath stroke + 0.91 2.87 moveto + 0.91 2.81 lineto +closepath stroke + 0.72 2.92 moveto + 0.74 3.00 lineto +closepath stroke + 0.72 2.92 moveto + 0.83 2.96 lineto +closepath stroke + 0.72 2.92 moveto + 0.82 2.90 lineto +closepath stroke + 0.72 2.92 moveto + 0.64 3.04 lineto +closepath stroke + 0.72 2.92 moveto + 0.61 2.94 lineto +closepath stroke + 0.72 2.92 moveto + 0.81 2.83 lineto +closepath stroke + 0.72 2.92 moveto + 0.71 2.83 lineto +closepath stroke + 0.50 2.96 moveto + 0.54 3.06 lineto +closepath stroke + 0.50 2.96 moveto + 0.61 2.94 lineto +closepath stroke + 0.50 2.96 moveto + 0.38 2.99 lineto +closepath stroke + 0.50 2.96 moveto + 0.60 2.86 lineto +closepath stroke + 0.50 2.96 moveto + 0.49 2.86 lineto +closepath stroke + 0.27 3.01 moveto + 0.13 3.19 lineto +closepath stroke + 0.27 3.01 moveto + 0.31 3.14 lineto +closepath stroke + 0.27 3.01 moveto + 0.42 3.09 lineto +closepath stroke + 0.27 3.01 moveto + 0.38 2.99 lineto +closepath stroke + 0.27 3.01 moveto + 0.13 3.01 lineto +closepath stroke + 0.27 3.01 moveto + 0.37 2.88 lineto +closepath stroke + 0.27 3.01 moveto + 0.13 2.88 lineto +closepath stroke + 0.00 3.01 moveto + 0.00 3.19 lineto +closepath stroke + 0.00 3.01 moveto + 0.13 3.01 lineto +closepath stroke + 0.00 3.01 moveto + 0.00 2.88 lineto +closepath stroke + 0.90 2.75 moveto + 0.81 2.83 lineto +closepath stroke + 0.90 2.75 moveto + 0.91 2.81 lineto +closepath stroke + 0.90 2.75 moveto + 0.80 2.75 lineto +closepath stroke + 0.90 2.75 moveto + 0.91 2.69 lineto +closepath stroke + 0.70 2.75 moveto + 0.60 2.86 lineto +closepath stroke + 0.70 2.75 moveto + 0.71 2.83 lineto +closepath stroke + 0.70 2.75 moveto + 0.80 2.75 lineto +closepath stroke + 0.70 2.75 moveto + 0.59 2.75 lineto +closepath stroke + 0.70 2.75 moveto + 0.81 2.69 lineto +closepath stroke + 0.70 2.75 moveto + 0.71 2.67 lineto +closepath stroke + 0.48 2.75 moveto + 0.37 2.88 lineto +closepath stroke + 0.48 2.75 moveto + 0.49 2.86 lineto +closepath stroke + 0.48 2.75 moveto + 0.59 2.75 lineto +closepath stroke + 0.48 2.75 moveto + 0.24 2.75 lineto +closepath stroke + 0.48 2.75 moveto + 0.60 2.67 lineto +closepath stroke + 0.48 2.75 moveto + 0.49 2.64 lineto +closepath stroke + 0.48 2.75 moveto + 0.37 2.62 lineto +closepath stroke + 0.00 2.75 moveto + 0.13 2.88 lineto +closepath stroke + 0.00 2.75 moveto + 0.24 2.75 lineto +closepath stroke + 0.00 2.75 moveto + 0.00 2.88 lineto +closepath stroke + 0.00 2.75 moveto + 0.13 2.62 lineto +closepath stroke + 0.00 2.75 moveto + 0.00 2.62 lineto +closepath stroke + 0.91 2.63 moveto + 0.81 2.69 lineto +closepath stroke + 0.91 2.63 moveto + 0.91 2.69 lineto +closepath stroke + 0.91 2.63 moveto + 0.82 2.60 lineto +closepath stroke + 0.91 2.63 moveto + 0.93 2.57 lineto +closepath stroke + 0.72 2.58 moveto + 0.60 2.67 lineto +closepath stroke + 0.72 2.58 moveto + 0.71 2.67 lineto +closepath stroke + 0.72 2.58 moveto + 0.82 2.60 lineto +closepath stroke + 0.72 2.58 moveto + 0.61 2.56 lineto +closepath stroke + 0.72 2.58 moveto + 0.83 2.54 lineto +closepath stroke + 0.72 2.58 moveto + 0.74 2.50 lineto +closepath stroke + 0.72 2.58 moveto + 0.64 2.46 lineto +closepath stroke + 0.50 2.54 moveto + 0.49 2.64 lineto +closepath stroke + 0.50 2.54 moveto + 0.61 2.56 lineto +closepath stroke + 0.50 2.54 moveto + 0.38 2.51 lineto +closepath stroke + 0.50 2.54 moveto + 0.54 2.44 lineto +closepath stroke + 0.50 2.54 moveto + 0.42 2.39 lineto +closepath stroke + 0.27 2.49 moveto + 0.13 2.62 lineto +closepath stroke + 0.27 2.49 moveto + 0.37 2.62 lineto +closepath stroke + 0.27 2.49 moveto + 0.38 2.51 lineto +closepath stroke + 0.27 2.49 moveto + 0.13 2.49 lineto +closepath stroke + 0.27 2.49 moveto + 0.31 2.36 lineto +closepath stroke + 0.27 2.49 moveto + 0.13 2.31 lineto +closepath stroke + 0.00 2.49 moveto + 0.00 2.62 lineto +closepath stroke + 0.00 2.49 moveto + 0.13 2.49 lineto +closepath stroke + 0.00 2.49 moveto + 0.00 2.31 lineto +closepath stroke + 0.95 2.51 moveto + 0.83 2.54 lineto +closepath stroke + 0.95 2.51 moveto + 0.93 2.57 lineto +closepath stroke + 0.95 2.51 moveto + 0.86 2.47 lineto +closepath stroke + 0.95 2.51 moveto + 0.98 2.45 lineto +closepath stroke + 0.77 2.42 moveto + 0.74 2.50 lineto +closepath stroke + 0.77 2.42 moveto + 0.86 2.47 lineto +closepath stroke + 0.77 2.42 moveto + 0.67 2.38 lineto +closepath stroke + 0.77 2.42 moveto + 0.89 2.41 lineto +closepath stroke + 0.77 2.42 moveto + 0.81 2.35 lineto +closepath stroke + 0.57 2.34 moveto + 0.54 2.44 lineto +closepath stroke + 0.57 2.34 moveto + 0.64 2.46 lineto +closepath stroke + 0.57 2.34 moveto + 0.67 2.38 lineto +closepath stroke + 0.57 2.34 moveto + 0.46 2.29 lineto +closepath stroke + 0.57 2.34 moveto + 0.71 2.31 lineto +closepath stroke + 0.57 2.34 moveto + 0.62 2.24 lineto +closepath stroke + 0.35 2.24 moveto + 0.31 2.36 lineto +closepath stroke + 0.35 2.24 moveto + 0.42 2.39 lineto +closepath stroke + 0.35 2.24 moveto + 0.46 2.29 lineto +closepath stroke + 0.35 2.24 moveto + 0.17 2.18 lineto +closepath stroke + 0.35 2.24 moveto + 0.51 2.19 lineto +closepath stroke + 0.35 2.24 moveto + 0.41 2.12 lineto +closepath stroke + 0.35 2.24 moveto + 0.31 2.04 lineto +closepath stroke + 0.00 2.13 moveto + 0.00 2.31 lineto +closepath stroke + 0.00 2.13 moveto + 0.13 2.31 lineto +closepath stroke + 0.00 2.13 moveto + 0.17 2.18 lineto +closepath stroke + 0.00 2.13 moveto + 0.13 1.99 lineto +closepath stroke + 0.00 2.13 moveto + 0.00 1.99 lineto +closepath stroke + 1.01 2.40 moveto + 0.89 2.41 lineto +closepath stroke + 1.01 2.40 moveto + 0.98 2.45 lineto +closepath stroke + 1.01 2.40 moveto + 0.93 2.34 lineto +closepath stroke + 1.01 2.40 moveto + 0.99 2.28 lineto +closepath stroke + 1.01 2.40 moveto + 1.06 2.35 lineto +closepath stroke + 0.85 2.28 moveto + 0.71 2.31 lineto +closepath stroke + 0.85 2.28 moveto + 0.81 2.35 lineto +closepath stroke + 0.85 2.28 moveto + 0.93 2.34 lineto +closepath stroke + 0.85 2.28 moveto + 0.76 2.22 lineto +closepath stroke + 0.85 2.28 moveto + 0.91 2.22 lineto +closepath stroke + 0.85 2.28 moveto + 0.84 2.14 lineto +closepath stroke + 0.67 2.15 moveto + 0.51 2.19 lineto +closepath stroke + 0.67 2.15 moveto + 0.62 2.24 lineto +closepath stroke + 0.67 2.15 moveto + 0.76 2.22 lineto +closepath stroke + 0.67 2.15 moveto + 0.58 2.08 lineto +closepath stroke + 0.67 2.15 moveto + 0.75 2.07 lineto +closepath stroke + 0.67 2.15 moveto + 0.67 1.98 lineto +closepath stroke + 0.48 2.01 moveto + 0.41 2.12 lineto +closepath stroke + 0.48 2.01 moveto + 0.58 2.08 lineto +closepath stroke + 0.48 2.01 moveto + 0.37 1.93 lineto +closepath stroke + 0.48 2.01 moveto + 0.57 1.91 lineto +closepath stroke + 0.48 2.01 moveto + 0.48 1.81 lineto +closepath stroke + 0.26 1.85 moveto + 0.13 1.99 lineto +closepath stroke + 0.26 1.85 moveto + 0.31 2.04 lineto +closepath stroke + 0.26 1.85 moveto + 0.37 1.93 lineto +closepath stroke + 0.26 1.85 moveto + 0.13 1.85 lineto +closepath stroke + 0.26 1.85 moveto + 0.37 1.73 lineto +closepath stroke + 0.26 1.85 moveto + 0.27 1.62 lineto +closepath stroke + 0.00 1.85 moveto + 0.00 1.99 lineto +closepath stroke + 0.00 1.85 moveto + 0.13 1.85 lineto +closepath stroke + 0.00 1.85 moveto + 0.14 1.62 lineto +closepath stroke + 0.00 1.85 moveto + 0.00 1.50 lineto +closepath stroke + 1.10 2.30 moveto + 1.03 2.23 lineto +closepath stroke + 1.10 2.30 moveto + 1.06 2.35 lineto +closepath stroke + 1.10 2.30 moveto + 1.15 2.27 lineto +closepath stroke + 0.96 2.16 moveto + 0.91 2.22 lineto +closepath stroke + 0.96 2.16 moveto + 0.99 2.28 lineto +closepath stroke + 0.96 2.16 moveto + 1.03 2.23 lineto +closepath stroke + 0.96 2.16 moveto + 0.89 2.07 lineto +closepath stroke + 0.96 2.16 moveto + 1.08 2.19 lineto +closepath stroke + 0.96 2.16 moveto + 1.03 2.11 lineto +closepath stroke + 0.82 1.99 moveto + 0.75 2.07 lineto +closepath stroke + 0.82 1.99 moveto + 0.84 2.14 lineto +closepath stroke + 0.82 1.99 moveto + 0.89 2.07 lineto +closepath stroke + 0.82 1.99 moveto + 0.74 1.90 lineto +closepath stroke + 0.82 1.99 moveto + 0.96 2.02 lineto +closepath stroke + 0.82 1.99 moveto + 0.90 1.93 lineto +closepath stroke + 0.66 1.81 moveto + 0.57 1.91 lineto +closepath stroke + 0.66 1.81 moveto + 0.67 1.98 lineto +closepath stroke + 0.66 1.81 moveto + 0.74 1.90 lineto +closepath stroke + 0.66 1.81 moveto + 0.57 1.71 lineto +closepath stroke + 0.66 1.81 moveto + 0.82 1.84 lineto +closepath stroke + 0.66 1.81 moveto + 0.76 1.73 lineto +closepath stroke + 0.48 1.61 moveto + 0.37 1.73 lineto +closepath stroke + 0.48 1.61 moveto + 0.48 1.81 lineto +closepath stroke + 0.48 1.61 moveto + 0.57 1.71 lineto +closepath stroke + 0.48 1.61 moveto + 0.38 1.51 lineto +closepath stroke + 0.48 1.61 moveto + 0.67 1.64 lineto +closepath stroke + 0.48 1.61 moveto + 0.61 1.52 lineto +closepath stroke + 0.28 1.40 moveto + 0.14 1.62 lineto +closepath stroke + 0.28 1.40 moveto + 0.27 1.62 lineto +closepath stroke + 0.28 1.40 moveto + 0.38 1.51 lineto +closepath stroke + 0.28 1.40 moveto + 0.14 1.28 lineto +closepath stroke + 0.28 1.40 moveto + 0.51 1.41 lineto +closepath stroke + 0.28 1.40 moveto + 0.44 1.28 lineto +closepath stroke + 0.28 1.40 moveto + 0.35 1.15 lineto +closepath stroke + 0.00 1.16 moveto + 0.00 1.50 lineto +closepath stroke + 0.00 1.16 moveto + 0.14 1.28 lineto +closepath stroke + 0.00 1.16 moveto + 0.21 1.03 lineto +closepath stroke + 0.00 1.16 moveto + 0.00 0.87 lineto +closepath stroke + 1.20 2.23 moveto + 1.08 2.19 lineto +closepath stroke + 1.20 2.23 moveto + 1.15 2.27 lineto +closepath stroke + 1.20 2.23 moveto + 1.15 2.14 lineto +closepath stroke + 1.20 2.23 moveto + 1.26 2.20 lineto +closepath stroke + 1.10 2.06 moveto + 0.96 2.02 lineto +closepath stroke + 1.10 2.06 moveto + 1.03 2.11 lineto +closepath stroke + 1.10 2.06 moveto + 1.15 2.14 lineto +closepath stroke + 1.10 2.06 moveto + 1.05 1.96 lineto +closepath stroke + 1.10 2.06 moveto + 1.21 2.12 lineto +closepath stroke + 1.10 2.06 moveto + 1.18 2.02 lineto +closepath stroke + 0.99 1.87 moveto + 0.82 1.84 lineto +closepath stroke + 0.99 1.87 moveto + 0.90 1.93 lineto +closepath stroke + 0.99 1.87 moveto + 1.05 1.96 lineto +closepath stroke + 0.99 1.87 moveto + 0.93 1.76 lineto +closepath stroke + 0.99 1.87 moveto + 1.12 1.93 lineto +closepath stroke + 0.99 1.87 moveto + 1.09 1.82 lineto +closepath stroke + 0.87 1.66 moveto + 0.67 1.64 lineto +closepath stroke + 0.87 1.66 moveto + 0.76 1.73 lineto +closepath stroke + 0.87 1.66 moveto + 0.93 1.76 lineto +closepath stroke + 0.87 1.66 moveto + 0.80 1.54 lineto +closepath stroke + 0.87 1.66 moveto + 1.03 1.72 lineto +closepath stroke + 0.87 1.66 moveto + 0.99 1.60 lineto +closepath stroke + 0.74 1.43 moveto + 0.51 1.41 lineto +closepath stroke + 0.74 1.43 moveto + 0.61 1.52 lineto +closepath stroke + 0.74 1.43 moveto + 0.80 1.54 lineto +closepath stroke + 0.74 1.43 moveto + 0.66 1.30 lineto +closepath stroke + 0.74 1.43 moveto + 0.92 1.49 lineto +closepath stroke + 0.74 1.43 moveto + 0.88 1.36 lineto +closepath stroke + 0.59 1.17 moveto + 0.44 1.28 lineto +closepath stroke + 0.59 1.17 moveto + 0.66 1.30 lineto +closepath stroke + 0.59 1.17 moveto + 0.51 1.03 lineto +closepath stroke + 0.59 1.17 moveto + 0.81 1.23 lineto +closepath stroke + 0.59 1.17 moveto + 0.76 1.10 lineto +closepath stroke + 0.43 0.89 moveto + 0.21 1.03 lineto +closepath stroke + 0.43 0.89 moveto + 0.35 1.15 lineto +closepath stroke + 0.43 0.89 moveto + 0.51 1.03 lineto +closepath stroke + 0.43 0.89 moveto + 0.21 0.74 lineto +closepath stroke + 0.43 0.89 moveto + 0.34 0.74 lineto +closepath stroke + 0.43 0.89 moveto + 0.68 0.96 lineto +closepath stroke + 0.43 0.89 moveto + 0.63 0.80 lineto +closepath stroke + 0.25 0.59 moveto + 0.13 0.59 lineto +closepath stroke + 0.25 0.59 moveto + 0.34 0.74 lineto +closepath stroke + 0.25 0.59 moveto + 0.13 0.29 lineto +closepath stroke + 0.25 0.59 moveto + 0.54 0.65 lineto +closepath stroke + 0.25 0.59 moveto + 0.49 0.48 lineto +closepath stroke + 0.00 0.59 moveto + 0.00 0.87 lineto +closepath stroke + 0.00 0.59 moveto + 0.21 0.74 lineto +closepath stroke + 0.00 0.59 moveto + 0.13 0.59 lineto +closepath stroke + 0.00 0.59 moveto + 0.00 0.29 lineto +closepath stroke + 1.31 2.18 moveto + 1.21 2.12 lineto +closepath stroke + 1.31 2.18 moveto + 1.26 2.20 lineto +closepath stroke + 1.31 2.18 moveto + 1.28 2.08 lineto +closepath stroke + 1.31 2.18 moveto + 1.37 2.07 lineto +closepath stroke + 1.31 2.18 moveto + 1.38 2.17 lineto +closepath stroke + 1.25 1.99 moveto + 1.12 1.93 lineto +closepath stroke + 1.25 1.99 moveto + 1.18 2.02 lineto +closepath stroke + 1.25 1.99 moveto + 1.28 2.08 lineto +closepath stroke + 1.25 1.99 moveto + 1.22 1.88 lineto +closepath stroke + 1.25 1.99 moveto + 1.33 1.97 lineto +closepath stroke + 1.25 1.99 moveto + 1.32 1.86 lineto +closepath stroke + 1.18 1.78 moveto + 1.03 1.72 lineto +closepath stroke + 1.18 1.78 moveto + 1.09 1.82 lineto +closepath stroke + 1.18 1.78 moveto + 1.22 1.88 lineto +closepath stroke + 1.18 1.78 moveto + 1.15 1.66 lineto +closepath stroke + 1.18 1.78 moveto + 1.29 1.76 lineto +closepath stroke + 1.18 1.78 moveto + 1.28 1.64 lineto +closepath stroke + 1.11 1.55 moveto + 0.92 1.49 lineto +closepath stroke + 1.11 1.55 moveto + 0.99 1.60 lineto +closepath stroke + 1.11 1.55 moveto + 1.15 1.66 lineto +closepath stroke + 1.11 1.55 moveto + 1.07 1.42 lineto +closepath stroke + 1.11 1.55 moveto + 1.24 1.52 lineto +closepath stroke + 1.11 1.55 moveto + 1.23 1.39 lineto +closepath stroke + 1.03 1.30 moveto + 0.81 1.23 lineto +closepath stroke + 1.03 1.30 moveto + 0.88 1.36 lineto +closepath stroke + 1.03 1.30 moveto + 1.07 1.42 lineto +closepath stroke + 1.03 1.30 moveto + 0.98 1.16 lineto +closepath stroke + 1.03 1.30 moveto + 1.18 1.26 lineto +closepath stroke + 1.03 1.30 moveto + 1.17 1.12 lineto +closepath stroke + 0.94 1.02 moveto + 0.68 0.96 lineto +closepath stroke + 0.94 1.02 moveto + 0.76 1.10 lineto +closepath stroke + 0.94 1.02 moveto + 0.98 1.16 lineto +closepath stroke + 0.94 1.02 moveto + 0.89 0.86 lineto +closepath stroke + 0.94 1.02 moveto + 1.12 0.98 lineto +closepath stroke + 0.94 1.02 moveto + 1.11 0.82 lineto +closepath stroke + 0.84 0.71 moveto + 0.54 0.65 lineto +closepath stroke + 0.84 0.71 moveto + 0.63 0.80 lineto +closepath stroke + 0.84 0.71 moveto + 0.89 0.86 lineto +closepath stroke + 0.84 0.71 moveto + 0.78 0.54 lineto +closepath stroke + 0.84 0.71 moveto + 1.06 0.67 lineto +closepath stroke + 0.73 0.37 moveto + 0.49 0.48 lineto +closepath stroke + 0.73 0.37 moveto + 0.78 0.54 lineto +closepath stroke + 0.73 0.37 moveto + 0.36 0.19 lineto +closepath stroke + 0.73 0.37 moveto + 0.73 0.19 lineto +closepath stroke + 0.73 0.37 moveto + 1.00 0.50 lineto +closepath stroke + 0.73 0.37 moveto + 0.98 0.19 lineto +closepath stroke + 0.73 0.00 moveto + 0.36 0.00 lineto +closepath stroke + 0.73 0.00 moveto + 0.73 0.19 lineto +closepath stroke + 0.73 0.00 moveto + 0.98 0.00 lineto +closepath stroke + 1.44 2.15 moveto + 1.43 2.05 lineto +closepath stroke + 1.44 2.15 moveto + 1.38 2.17 lineto +closepath stroke + 1.44 2.15 moveto + 1.50 2.15 lineto +closepath stroke + 1.42 1.95 moveto + 1.33 1.97 lineto +closepath stroke + 1.42 1.95 moveto + 1.37 2.07 lineto +closepath stroke + 1.42 1.95 moveto + 1.43 2.05 lineto +closepath stroke + 1.42 1.95 moveto + 1.40 1.84 lineto +closepath stroke + 1.42 1.95 moveto + 1.49 2.05 lineto +closepath stroke + 1.42 1.95 moveto + 1.50 1.95 lineto +closepath stroke + 1.39 1.74 moveto + 1.29 1.76 lineto +closepath stroke + 1.39 1.74 moveto + 1.32 1.86 lineto +closepath stroke + 1.39 1.74 moveto + 1.40 1.84 lineto +closepath stroke + 1.39 1.74 moveto + 1.38 1.62 lineto +closepath stroke + 1.39 1.74 moveto + 1.49 1.84 lineto +closepath stroke + 1.39 1.74 moveto + 1.50 1.74 lineto +closepath stroke + 1.37 1.49 moveto + 1.24 1.52 lineto +closepath stroke + 1.37 1.49 moveto + 1.28 1.64 lineto +closepath stroke + 1.37 1.49 moveto + 1.38 1.62 lineto +closepath stroke + 1.37 1.49 moveto + 1.35 1.36 lineto +closepath stroke + 1.37 1.49 moveto + 1.49 1.62 lineto +closepath stroke + 1.37 1.49 moveto + 1.50 1.49 lineto +closepath stroke + 1.34 1.23 moveto + 1.18 1.26 lineto +closepath stroke + 1.34 1.23 moveto + 1.23 1.39 lineto +closepath stroke + 1.34 1.23 moveto + 1.35 1.36 lineto +closepath stroke + 1.34 1.23 moveto + 1.32 1.08 lineto +closepath stroke + 1.34 1.23 moveto + 1.49 1.36 lineto +closepath stroke + 1.34 1.23 moveto + 1.50 1.23 lineto +closepath stroke + 1.31 0.94 moveto + 1.12 0.98 lineto +closepath stroke + 1.31 0.94 moveto + 1.17 1.12 lineto +closepath stroke + 1.31 0.94 moveto + 1.32 1.08 lineto +closepath stroke + 1.31 0.94 moveto + 1.29 0.78 lineto +closepath stroke + 1.31 0.94 moveto + 1.48 1.08 lineto +closepath stroke + 1.31 0.94 moveto + 1.50 0.94 lineto +closepath stroke + 1.31 0.94 moveto + 1.52 0.78 lineto +closepath stroke + 1.28 0.62 moveto + 1.00 0.50 lineto +closepath stroke + 1.28 0.62 moveto + 1.06 0.67 lineto +closepath stroke + 1.28 0.62 moveto + 1.11 0.82 lineto +closepath stroke + 1.28 0.62 moveto + 1.29 0.78 lineto +closepath stroke + 1.28 0.62 moveto + 1.26 0.31 lineto +closepath stroke + 1.28 0.62 moveto + 1.50 0.62 lineto +closepath stroke + 1.24 0.00 moveto + 0.98 0.00 lineto +closepath stroke + 1.24 0.00 moveto + 0.98 0.19 lineto +closepath stroke + 1.24 0.00 moveto + 1.26 0.31 lineto +closepath stroke + 1.24 0.00 moveto + 1.48 0.31 lineto +closepath stroke + 1.24 0.00 moveto + 1.50 0.00 lineto +closepath stroke + 1.56 2.15 moveto + 1.49 2.05 lineto +closepath stroke + 1.56 2.15 moveto + 1.50 2.15 lineto +closepath stroke + 1.56 2.15 moveto + 1.57 2.05 lineto +closepath stroke + 1.56 2.15 moveto + 1.62 2.17 lineto +closepath stroke + 1.58 1.95 moveto + 1.49 1.84 lineto +closepath stroke + 1.58 1.95 moveto + 1.50 1.95 lineto +closepath stroke + 1.58 1.95 moveto + 1.57 2.05 lineto +closepath stroke + 1.58 1.95 moveto + 1.60 1.84 lineto +closepath stroke + 1.58 1.95 moveto + 1.63 2.07 lineto +closepath stroke + 1.58 1.95 moveto + 1.67 1.97 lineto +closepath stroke + 1.61 1.74 moveto + 1.49 1.62 lineto +closepath stroke + 1.61 1.74 moveto + 1.50 1.74 lineto +closepath stroke + 1.61 1.74 moveto + 1.60 1.84 lineto +closepath stroke + 1.61 1.74 moveto + 1.62 1.62 lineto +closepath stroke + 1.61 1.74 moveto + 1.68 1.86 lineto +closepath stroke + 1.61 1.74 moveto + 1.71 1.76 lineto +closepath stroke + 1.63 1.49 moveto + 1.49 1.36 lineto +closepath stroke + 1.63 1.49 moveto + 1.50 1.49 lineto +closepath stroke + 1.63 1.49 moveto + 1.62 1.62 lineto +closepath stroke + 1.63 1.49 moveto + 1.65 1.36 lineto +closepath stroke + 1.63 1.49 moveto + 1.72 1.64 lineto +closepath stroke + 1.63 1.49 moveto + 1.76 1.52 lineto +closepath stroke + 1.66 1.23 moveto + 1.48 1.08 lineto +closepath stroke + 1.66 1.23 moveto + 1.50 1.23 lineto +closepath stroke + 1.66 1.23 moveto + 1.65 1.36 lineto +closepath stroke + 1.66 1.23 moveto + 1.68 1.08 lineto +closepath stroke + 1.66 1.23 moveto + 1.77 1.39 lineto +closepath stroke + 1.66 1.23 moveto + 1.82 1.26 lineto +closepath stroke + 1.69 0.94 moveto + 1.50 0.94 lineto +closepath stroke + 1.69 0.94 moveto + 1.68 1.08 lineto +closepath stroke + 1.69 0.94 moveto + 1.71 0.78 lineto +closepath stroke + 1.69 0.94 moveto + 1.83 1.12 lineto +closepath stroke + 1.69 0.94 moveto + 1.88 0.98 lineto +closepath stroke + 1.72 0.62 moveto + 1.50 0.62 lineto +closepath stroke + 1.72 0.62 moveto + 1.52 0.78 lineto +closepath stroke + 1.72 0.62 moveto + 1.71 0.78 lineto +closepath stroke + 1.72 0.62 moveto + 1.48 0.31 lineto +closepath stroke + 1.72 0.62 moveto + 1.74 0.31 lineto +closepath stroke + 1.72 0.62 moveto + 1.89 0.82 lineto +closepath stroke + 1.72 0.62 moveto + 1.94 0.67 lineto +closepath stroke + 1.72 0.62 moveto + 2.00 0.50 lineto +closepath stroke + 1.76 0.00 moveto + 1.50 0.00 lineto +closepath stroke + 1.76 0.00 moveto + 1.74 0.31 lineto +closepath stroke + 1.76 0.00 moveto + 2.02 0.19 lineto +closepath stroke + 1.76 0.00 moveto + 2.02 0.00 lineto +closepath stroke + 1.69 2.18 moveto + 1.63 2.07 lineto +closepath stroke + 1.69 2.18 moveto + 1.62 2.17 lineto +closepath stroke + 1.69 2.18 moveto + 1.72 2.08 lineto +closepath stroke + 1.69 2.18 moveto + 1.79 2.12 lineto +closepath stroke + 1.69 2.18 moveto + 1.74 2.20 lineto +closepath stroke + 1.75 1.99 moveto + 1.68 1.86 lineto +closepath stroke + 1.75 1.99 moveto + 1.67 1.97 lineto +closepath stroke + 1.75 1.99 moveto + 1.72 2.08 lineto +closepath stroke + 1.75 1.99 moveto + 1.78 1.88 lineto +closepath stroke + 1.75 1.99 moveto + 1.82 2.02 lineto +closepath stroke + 1.75 1.99 moveto + 1.88 1.93 lineto +closepath stroke + 1.82 1.78 moveto + 1.72 1.64 lineto +closepath stroke + 1.82 1.78 moveto + 1.71 1.76 lineto +closepath stroke + 1.82 1.78 moveto + 1.78 1.88 lineto +closepath stroke + 1.82 1.78 moveto + 1.85 1.66 lineto +closepath stroke + 1.82 1.78 moveto + 1.91 1.82 lineto +closepath stroke + 1.82 1.78 moveto + 1.97 1.72 lineto +closepath stroke + 1.89 1.55 moveto + 1.77 1.39 lineto +closepath stroke + 1.89 1.55 moveto + 1.76 1.52 lineto +closepath stroke + 1.89 1.55 moveto + 1.85 1.66 lineto +closepath stroke + 1.89 1.55 moveto + 1.93 1.42 lineto +closepath stroke + 1.89 1.55 moveto + 2.01 1.60 lineto +closepath stroke + 1.89 1.55 moveto + 2.08 1.49 lineto +closepath stroke + 1.97 1.30 moveto + 1.83 1.12 lineto +closepath stroke + 1.97 1.30 moveto + 1.82 1.26 lineto +closepath stroke + 1.97 1.30 moveto + 1.93 1.42 lineto +closepath stroke + 1.97 1.30 moveto + 2.02 1.16 lineto +closepath stroke + 1.97 1.30 moveto + 2.12 1.36 lineto +closepath stroke + 1.97 1.30 moveto + 2.19 1.23 lineto +closepath stroke + 2.06 1.02 moveto + 1.89 0.82 lineto +closepath stroke + 2.06 1.02 moveto + 1.88 0.98 lineto +closepath stroke + 2.06 1.02 moveto + 2.02 1.16 lineto +closepath stroke + 2.06 1.02 moveto + 2.11 0.86 lineto +closepath stroke + 2.06 1.02 moveto + 2.24 1.10 lineto +closepath stroke + 2.06 1.02 moveto + 2.32 0.96 lineto +closepath stroke + 2.16 0.71 moveto + 1.94 0.67 lineto +closepath stroke + 2.16 0.71 moveto + 2.11 0.86 lineto +closepath stroke + 2.16 0.71 moveto + 2.22 0.54 lineto +closepath stroke + 2.16 0.71 moveto + 2.37 0.80 lineto +closepath stroke + 2.16 0.71 moveto + 2.46 0.65 lineto +closepath stroke + 2.27 0.37 moveto + 2.02 0.19 lineto +closepath stroke + 2.27 0.37 moveto + 2.00 0.50 lineto +closepath stroke + 2.27 0.37 moveto + 2.22 0.54 lineto +closepath stroke + 2.27 0.37 moveto + 2.27 0.19 lineto +closepath stroke + 2.27 0.37 moveto + 2.51 0.48 lineto +closepath stroke + 2.27 0.37 moveto + 2.61 0.19 lineto +closepath stroke + 2.27 0.00 moveto + 2.02 0.00 lineto +closepath stroke + 2.27 0.00 moveto + 2.27 0.19 lineto +closepath stroke + 2.27 0.00 moveto + 2.61 0.00 lineto +closepath stroke + 1.80 2.23 moveto + 1.85 2.14 lineto +closepath stroke + 1.80 2.23 moveto + 1.74 2.20 lineto +closepath stroke + 1.80 2.23 moveto + 1.92 2.19 lineto +closepath stroke + 1.80 2.23 moveto + 1.85 2.27 lineto +closepath stroke + 1.90 2.06 moveto + 1.82 2.02 lineto +closepath stroke + 1.90 2.06 moveto + 1.79 2.12 lineto +closepath stroke + 1.90 2.06 moveto + 1.85 2.14 lineto +closepath stroke + 1.90 2.06 moveto + 1.96 1.96 lineto +closepath stroke + 1.90 2.06 moveto + 1.97 2.11 lineto +closepath stroke + 2.01 1.87 moveto + 1.91 1.82 lineto +closepath stroke + 2.01 1.87 moveto + 1.88 1.93 lineto +closepath stroke + 2.01 1.87 moveto + 1.96 1.96 lineto +closepath stroke + 2.01 1.87 moveto + 2.07 1.76 lineto +closepath stroke + 2.01 1.87 moveto + 2.02 2.01 lineto +closepath stroke + 2.01 1.87 moveto + 2.10 1.93 lineto +closepath stroke + 2.13 1.66 moveto + 2.01 1.60 lineto +closepath stroke + 2.13 1.66 moveto + 1.97 1.72 lineto +closepath stroke + 2.13 1.66 moveto + 2.07 1.76 lineto +closepath stroke + 2.13 1.66 moveto + 2.20 1.54 lineto +closepath stroke + 2.13 1.66 moveto + 2.16 1.82 lineto +closepath stroke + 2.13 1.66 moveto + 2.24 1.73 lineto +closepath stroke + 2.26 1.43 moveto + 2.12 1.36 lineto +closepath stroke + 2.26 1.43 moveto + 2.08 1.49 lineto +closepath stroke + 2.26 1.43 moveto + 2.20 1.54 lineto +closepath stroke + 2.26 1.43 moveto + 2.34 1.30 lineto +closepath stroke + 2.26 1.43 moveto + 2.30 1.62 lineto +closepath stroke + 2.26 1.43 moveto + 2.39 1.52 lineto +closepath stroke + 2.41 1.17 moveto + 2.24 1.10 lineto +closepath stroke + 2.41 1.17 moveto + 2.19 1.23 lineto +closepath stroke + 2.41 1.17 moveto + 2.34 1.30 lineto +closepath stroke + 2.41 1.17 moveto + 2.49 1.03 lineto +closepath stroke + 2.41 1.17 moveto + 2.47 1.39 lineto +closepath stroke + 2.41 1.17 moveto + 2.56 1.28 lineto +closepath stroke + 2.57 0.89 moveto + 2.37 0.80 lineto +closepath stroke + 2.57 0.89 moveto + 2.32 0.96 lineto +closepath stroke + 2.57 0.89 moveto + 2.49 1.03 lineto +closepath stroke + 2.57 0.89 moveto + 2.66 0.74 lineto +closepath stroke + 2.57 0.89 moveto + 2.65 1.15 lineto +closepath stroke + 2.57 0.89 moveto + 2.75 1.03 lineto +closepath stroke + 2.75 0.59 moveto + 2.51 0.48 lineto +closepath stroke + 2.75 0.59 moveto + 2.46 0.65 lineto +closepath stroke + 2.75 0.59 moveto + 2.66 0.74 lineto +closepath stroke + 2.75 0.59 moveto + 2.85 0.29 lineto +closepath stroke + 2.75 0.59 moveto + 2.84 0.87 lineto +closepath stroke + 2.75 0.59 moveto + 2.96 0.74 lineto +closepath stroke + 2.75 0.59 moveto + 3.09 0.60 lineto +closepath stroke + 2.94 0.00 moveto + 2.61 0.00 lineto +closepath stroke + 2.94 0.00 moveto + 2.61 0.19 lineto +closepath stroke + 2.94 0.00 moveto + 2.85 0.29 lineto +closepath stroke + 2.94 0.00 moveto + 3.19 0.30 lineto +closepath stroke + 2.94 0.00 moveto + 3.33 0.00 lineto +closepath stroke + 1.90 2.30 moveto + 1.97 2.23 lineto +closepath stroke + 1.90 2.30 moveto + 1.85 2.27 lineto +closepath stroke + 1.90 2.30 moveto + 1.94 2.35 lineto +closepath stroke + 2.04 2.16 moveto + 1.97 2.11 lineto +closepath stroke + 2.04 2.16 moveto + 1.92 2.19 lineto +closepath stroke + 2.04 2.16 moveto + 1.97 2.23 lineto +closepath stroke + 2.04 2.16 moveto + 2.02 2.01 lineto +closepath stroke + 2.04 2.16 moveto + 2.11 2.07 lineto +closepath stroke + 2.04 2.16 moveto + 2.01 2.28 lineto +closepath stroke + 2.04 2.16 moveto + 2.09 2.22 lineto +closepath stroke + 2.18 1.99 moveto + 2.16 1.82 lineto +closepath stroke + 2.18 1.99 moveto + 2.10 1.93 lineto +closepath stroke + 2.18 1.99 moveto + 2.11 2.07 lineto +closepath stroke + 2.18 1.99 moveto + 2.26 1.90 lineto +closepath stroke + 2.18 1.99 moveto + 2.16 2.14 lineto +closepath stroke + 2.18 1.99 moveto + 2.25 2.07 lineto +closepath stroke + 2.18 1.99 moveto + 2.35 2.00 lineto +closepath stroke + 2.34 1.81 moveto + 2.30 1.62 lineto +closepath stroke + 2.34 1.81 moveto + 2.24 1.73 lineto +closepath stroke + 2.34 1.81 moveto + 2.26 1.90 lineto +closepath stroke + 2.34 1.81 moveto + 2.43 1.71 lineto +closepath stroke + 2.34 1.81 moveto + 2.43 1.91 lineto +closepath stroke + 2.52 1.61 moveto + 2.47 1.39 lineto +closepath stroke + 2.52 1.61 moveto + 2.39 1.52 lineto +closepath stroke + 2.52 1.61 moveto + 2.43 1.71 lineto +closepath stroke + 2.52 1.61 moveto + 2.62 1.51 lineto +closepath stroke + 2.52 1.61 moveto + 2.52 1.81 lineto +closepath stroke + 2.52 1.61 moveto + 2.63 1.73 lineto +closepath stroke + 2.72 1.40 moveto + 2.65 1.15 lineto +closepath stroke + 2.72 1.40 moveto + 2.56 1.28 lineto +closepath stroke + 2.72 1.40 moveto + 2.62 1.51 lineto +closepath stroke + 2.72 1.40 moveto + 2.83 1.28 lineto +closepath stroke + 2.72 1.40 moveto + 2.73 1.62 lineto +closepath stroke + 2.72 1.40 moveto + 2.85 1.54 lineto +closepath stroke + 2.93 1.16 moveto + 2.84 0.87 lineto +closepath stroke + 2.93 1.16 moveto + 2.75 1.03 lineto +closepath stroke + 2.93 1.16 moveto + 2.83 1.28 lineto +closepath stroke + 2.93 1.16 moveto + 3.05 1.03 lineto +closepath stroke + 2.93 1.16 moveto + 2.95 1.42 lineto +closepath stroke + 2.93 1.16 moveto + 3.08 1.32 lineto +closepath stroke + 3.17 0.89 moveto + 2.96 0.74 lineto +closepath stroke + 3.17 0.89 moveto + 3.05 1.03 lineto +closepath stroke + 3.17 0.89 moveto + 3.30 0.75 lineto +closepath stroke + 3.17 0.89 moveto + 3.20 1.19 lineto +closepath stroke + 3.17 0.89 moveto + 3.35 1.09 lineto +closepath stroke + 3.43 0.60 moveto + 3.19 0.30 lineto +closepath stroke + 3.43 0.60 moveto + 3.09 0.60 lineto +closepath stroke + 3.43 0.60 moveto + 3.30 0.75 lineto +closepath stroke + 3.43 0.60 moveto + 3.58 0.30 lineto +closepath stroke + 3.43 0.60 moveto + 3.48 0.94 lineto +closepath stroke + 3.43 0.60 moveto + 3.63 0.83 lineto +closepath stroke + 3.43 0.60 moveto + 3.81 0.70 lineto +closepath stroke + 3.72 0.00 moveto + 3.33 0.00 lineto +closepath stroke + 3.72 0.00 moveto + 3.58 0.30 lineto +closepath stroke + 3.72 0.00 moveto + 3.95 0.40 lineto +closepath stroke + 3.72 0.00 moveto + 4.14 0.26 lineto +closepath stroke + 3.72 0.00 moveto + 4.35 0.00 lineto +closepath stroke + 1.99 2.40 moveto + 2.01 2.28 lineto +closepath stroke + 1.99 2.40 moveto + 1.94 2.35 lineto +closepath stroke + 1.99 2.40 moveto + 2.07 2.34 lineto +closepath stroke + 1.99 2.40 moveto + 2.02 2.45 lineto +closepath stroke + 2.15 2.28 moveto + 2.16 2.14 lineto +closepath stroke + 2.15 2.28 moveto + 2.09 2.22 lineto +closepath stroke + 2.15 2.28 moveto + 2.07 2.34 lineto +closepath stroke + 2.15 2.28 moveto + 2.24 2.22 lineto +closepath stroke + 2.15 2.28 moveto + 2.10 2.39 lineto +closepath stroke + 2.15 2.28 moveto + 2.19 2.35 lineto +closepath stroke + 2.33 2.15 moveto + 2.25 2.07 lineto +closepath stroke + 2.33 2.15 moveto + 2.24 2.22 lineto +closepath stroke + 2.33 2.15 moveto + 2.42 2.08 lineto +closepath stroke + 2.33 2.15 moveto + 2.28 2.29 lineto +closepath stroke + 2.33 2.15 moveto + 2.38 2.24 lineto +closepath stroke + 2.52 2.01 moveto + 2.52 1.81 lineto +closepath stroke + 2.52 2.01 moveto + 2.43 1.91 lineto +closepath stroke + 2.52 2.01 moveto + 2.35 2.00 lineto +closepath stroke + 2.52 2.01 moveto + 2.42 2.08 lineto +closepath stroke + 2.52 2.01 moveto + 2.63 1.93 lineto +closepath stroke + 2.52 2.01 moveto + 2.48 2.17 lineto +closepath stroke + 2.52 2.01 moveto + 2.59 2.12 lineto +closepath stroke + 2.52 2.01 moveto + 2.71 2.07 lineto +closepath stroke + 2.74 1.85 moveto + 2.73 1.62 lineto +closepath stroke + 2.74 1.85 moveto + 2.63 1.73 lineto +closepath stroke + 2.74 1.85 moveto + 2.63 1.93 lineto +closepath stroke + 2.74 1.85 moveto + 2.85 1.77 lineto +closepath stroke + 2.74 1.85 moveto + 2.82 1.99 lineto +closepath stroke + 2.74 1.85 moveto + 2.95 1.93 lineto +closepath stroke + 2.97 1.68 moveto + 2.95 1.42 lineto +closepath stroke + 2.97 1.68 moveto + 2.85 1.54 lineto +closepath stroke + 2.97 1.68 moveto + 2.85 1.77 lineto +closepath stroke + 2.97 1.68 moveto + 3.10 1.58 lineto +closepath stroke + 2.97 1.68 moveto + 3.07 1.84 lineto +closepath stroke + 2.97 1.68 moveto + 3.22 1.78 lineto +closepath stroke + 3.23 1.49 moveto + 3.20 1.19 lineto +closepath stroke + 3.23 1.49 moveto + 3.08 1.32 lineto +closepath stroke + 3.23 1.49 moveto + 3.10 1.58 lineto +closepath stroke + 3.23 1.49 moveto + 3.38 1.39 lineto +closepath stroke + 3.23 1.49 moveto + 3.35 1.68 lineto +closepath stroke + 3.23 1.49 moveto + 3.51 1.61 lineto +closepath stroke + 3.52 1.28 moveto + 3.48 0.94 lineto +closepath stroke + 3.52 1.28 moveto + 3.35 1.09 lineto +closepath stroke + 3.52 1.28 moveto + 3.38 1.39 lineto +closepath stroke + 3.52 1.28 moveto + 3.68 1.17 lineto +closepath stroke + 3.52 1.28 moveto + 3.65 1.51 lineto +closepath stroke + 3.52 1.28 moveto + 3.83 1.43 lineto +closepath stroke + 3.84 1.05 moveto + 3.63 0.83 lineto +closepath stroke + 3.84 1.05 moveto + 3.68 1.17 lineto +closepath stroke + 3.84 1.05 moveto + 4.01 0.93 lineto +closepath stroke + 3.84 1.05 moveto + 3.99 1.31 lineto +closepath stroke + 3.84 1.05 moveto + 4.18 1.23 lineto +closepath stroke + 4.18 0.80 moveto + 3.95 0.40 lineto +closepath stroke + 4.18 0.80 moveto + 3.81 0.70 lineto +closepath stroke + 4.18 0.80 moveto + 4.01 0.93 lineto +closepath stroke + 4.18 0.80 moveto + 4.37 0.66 lineto +closepath stroke + 4.18 0.80 moveto + 4.36 1.10 lineto +closepath stroke + 4.18 0.80 moveto + 4.57 1.01 lineto +closepath stroke + 4.56 0.52 moveto + 4.14 0.26 lineto +closepath stroke + 4.56 0.52 moveto + 4.37 0.66 lineto +closepath stroke + 4.56 0.52 moveto + 4.77 0.26 lineto +closepath stroke + 4.56 0.52 moveto + 4.76 0.87 lineto +closepath stroke + 4.56 0.52 moveto + 5.00 0.76 lineto +closepath stroke + 4.98 0.00 moveto + 4.35 0.00 lineto +closepath stroke + 4.98 0.00 moveto + 4.77 0.26 lineto +closepath stroke + 4.98 0.00 moveto + 5.21 0.50 lineto +closepath stroke + 4.98 0.00 moveto + 5.47 0.38 lineto +closepath stroke + 4.98 0.00 moveto + 5.76 0.26 lineto +closepath stroke + 4.98 0.00 moveto + 6.07 0.00 lineto +closepath stroke + 2.05 2.51 moveto + 2.10 2.39 lineto +closepath stroke + 2.05 2.51 moveto + 2.02 2.45 lineto +closepath stroke + 2.05 2.51 moveto + 2.14 2.47 lineto +closepath stroke + 2.05 2.51 moveto + 2.07 2.57 lineto +closepath stroke + 2.23 2.42 moveto + 2.28 2.29 lineto +closepath stroke + 2.23 2.42 moveto + 2.19 2.35 lineto +closepath stroke + 2.23 2.42 moveto + 2.14 2.47 lineto +closepath stroke + 2.23 2.42 moveto + 2.33 2.38 lineto +closepath stroke + 2.23 2.42 moveto + 2.16 2.52 lineto +closepath stroke + 2.23 2.42 moveto + 2.26 2.50 lineto +closepath stroke + 2.43 2.34 moveto + 2.48 2.17 lineto +closepath stroke + 2.43 2.34 moveto + 2.38 2.24 lineto +closepath stroke + 2.43 2.34 moveto + 2.33 2.38 lineto +closepath stroke + 2.43 2.34 moveto + 2.54 2.29 lineto +closepath stroke + 2.43 2.34 moveto + 2.36 2.46 lineto +closepath stroke + 2.43 2.34 moveto + 2.46 2.44 lineto +closepath stroke + 2.65 2.24 moveto + 2.59 2.12 lineto +closepath stroke + 2.65 2.24 moveto + 2.54 2.29 lineto +closepath stroke + 2.65 2.24 moveto + 2.77 2.18 lineto +closepath stroke + 2.65 2.24 moveto + 2.58 2.39 lineto +closepath stroke + 2.65 2.24 moveto + 2.69 2.36 lineto +closepath stroke + 2.65 2.24 moveto + 2.82 2.33 lineto +closepath stroke + 2.90 2.13 moveto + 2.82 1.99 lineto +closepath stroke + 2.90 2.13 moveto + 2.71 2.07 lineto +closepath stroke + 2.90 2.13 moveto + 2.77 2.18 lineto +closepath stroke + 2.90 2.13 moveto + 3.03 2.07 lineto +closepath stroke + 2.90 2.13 moveto + 2.95 2.28 lineto +closepath stroke + 3.16 2.01 moveto + 3.07 1.84 lineto +closepath stroke + 3.16 2.01 moveto + 2.95 1.93 lineto +closepath stroke + 3.16 2.01 moveto + 3.03 2.07 lineto +closepath stroke + 3.16 2.01 moveto + 3.31 1.94 lineto +closepath stroke + 3.16 2.01 moveto + 3.08 2.22 lineto +closepath stroke + 3.16 2.01 moveto + 3.22 2.19 lineto +closepath stroke + 3.46 1.88 moveto + 3.35 1.68 lineto +closepath stroke + 3.46 1.88 moveto + 3.22 1.78 lineto +closepath stroke + 3.46 1.88 moveto + 3.31 1.94 lineto +closepath stroke + 3.46 1.88 moveto + 3.62 1.81 lineto +closepath stroke + 3.46 1.88 moveto + 3.37 2.12 lineto +closepath stroke + 3.46 1.88 moveto + 3.53 2.09 lineto +closepath stroke + 3.46 1.88 moveto + 3.70 2.05 lineto +closepath stroke + 3.78 1.73 moveto + 3.65 1.51 lineto +closepath stroke + 3.78 1.73 moveto + 3.51 1.61 lineto +closepath stroke + 3.78 1.73 moveto + 3.62 1.81 lineto +closepath stroke + 3.78 1.73 moveto + 3.96 1.65 lineto +closepath stroke + 3.78 1.73 moveto + 3.86 1.98 lineto +closepath stroke + 3.78 1.73 moveto + 4.05 1.94 lineto +closepath stroke + 4.14 1.58 moveto + 3.99 1.31 lineto +closepath stroke + 4.14 1.58 moveto + 3.83 1.43 lineto +closepath stroke + 4.14 1.58 moveto + 3.96 1.65 lineto +closepath stroke + 4.14 1.58 moveto + 4.33 1.49 lineto +closepath stroke + 4.14 1.58 moveto + 4.23 1.86 lineto +closepath stroke + 4.14 1.58 moveto + 4.44 1.82 lineto +closepath stroke + 4.53 1.40 moveto + 4.64 1.73 lineto +closepath stroke + 4.53 1.40 moveto + 4.87 1.68 lineto +closepath stroke + 4.53 1.40 moveto + 4.36 1.10 lineto +closepath stroke + 4.53 1.40 moveto + 4.18 1.23 lineto +closepath stroke + 4.53 1.40 moveto + 4.33 1.49 lineto +closepath stroke + 4.53 1.40 moveto + 4.74 1.31 lineto +closepath stroke + 4.96 1.21 moveto + 5.08 1.59 lineto +closepath stroke + 4.96 1.21 moveto + 5.34 1.53 lineto +closepath stroke + 4.96 1.21 moveto + 5.20 1.10 lineto +closepath stroke + 4.96 1.21 moveto + 4.76 0.87 lineto +closepath stroke + 4.96 1.21 moveto + 4.57 1.01 lineto +closepath stroke + 4.96 1.21 moveto + 4.74 1.31 lineto +closepath stroke + 5.43 1.00 moveto + 5.57 1.43 lineto +closepath stroke + 5.43 1.00 moveto + 5.85 1.37 lineto +closepath stroke + 5.43 1.00 moveto + 5.69 0.88 lineto +closepath stroke + 5.43 1.00 moveto + 5.20 1.10 lineto +closepath stroke + 5.43 1.00 moveto + 5.21 0.50 lineto +closepath stroke + 5.43 1.00 moveto + 5.00 0.76 lineto +closepath stroke + 5.96 0.77 moveto + 6.11 1.25 lineto +closepath stroke + 5.96 0.77 moveto + 6.42 1.19 lineto +closepath stroke + 5.96 0.77 moveto + 6.24 0.64 lineto +closepath stroke + 5.96 0.77 moveto + 5.69 0.88 lineto +closepath stroke + 5.96 0.77 moveto + 5.47 0.38 lineto +closepath stroke + 6.53 0.51 moveto + 6.71 1.06 lineto +closepath stroke + 6.53 0.51 moveto + 7.04 0.99 lineto +closepath stroke + 6.53 0.51 moveto + 6.84 0.26 lineto +closepath stroke + 6.53 0.51 moveto + 6.24 0.64 lineto +closepath stroke + 6.53 0.51 moveto + 5.76 0.26 lineto +closepath stroke + 7.16 0.00 moveto + 7.73 0.65 lineto +closepath stroke + 7.16 0.00 moveto + 8.14 0.57 lineto +closepath stroke + 7.16 0.00 moveto + 9.08 0.00 lineto +closepath stroke + 7.16 0.00 moveto + 7.36 0.73 lineto +closepath stroke + 7.16 0.00 moveto + 6.84 0.26 lineto +closepath stroke + 7.16 0.00 moveto + 6.07 0.00 lineto +closepath stroke + 2.09 2.63 moveto + 2.16 2.52 lineto +closepath stroke + 2.09 2.63 moveto + 2.07 2.57 lineto +closepath stroke + 2.09 2.63 moveto + 2.09 2.69 lineto +closepath stroke + 2.09 2.63 moveto + 2.18 2.60 lineto +closepath stroke + 2.28 2.58 moveto + 2.36 2.46 lineto +closepath stroke + 2.28 2.58 moveto + 2.26 2.50 lineto +closepath stroke + 2.28 2.58 moveto + 2.19 2.67 lineto +closepath stroke + 2.28 2.58 moveto + 2.29 2.67 lineto +closepath stroke + 2.28 2.58 moveto + 2.18 2.60 lineto +closepath stroke + 2.28 2.58 moveto + 2.39 2.56 lineto +closepath stroke + 2.50 2.54 moveto + 2.58 2.39 lineto +closepath stroke + 2.50 2.54 moveto + 2.46 2.44 lineto +closepath stroke + 2.50 2.54 moveto + 2.40 2.64 lineto +closepath stroke + 2.50 2.54 moveto + 2.51 2.64 lineto +closepath stroke + 2.50 2.54 moveto + 2.39 2.56 lineto +closepath stroke + 2.50 2.54 moveto + 2.62 2.51 lineto +closepath stroke + 2.73 2.49 moveto + 2.63 2.62 lineto +closepath stroke + 2.73 2.49 moveto + 2.75 2.62 lineto +closepath stroke + 2.73 2.49 moveto + 2.62 2.51 lineto +closepath stroke + 2.73 2.49 moveto + 2.69 2.36 lineto +closepath stroke + 2.73 2.49 moveto + 2.86 2.46 lineto +closepath stroke + 2.99 2.43 moveto + 3.08 2.22 lineto +closepath stroke + 2.99 2.43 moveto + 2.95 2.28 lineto +closepath stroke + 2.99 2.43 moveto + 2.88 2.59 lineto +closepath stroke + 2.99 2.43 moveto + 3.01 2.59 lineto +closepath stroke + 2.99 2.43 moveto + 2.86 2.46 lineto +closepath stroke + 2.99 2.43 moveto + 2.82 2.33 lineto +closepath stroke + 2.99 2.43 moveto + 3.14 2.40 lineto +closepath stroke + 3.28 2.37 moveto + 3.37 2.12 lineto +closepath stroke + 3.28 2.37 moveto + 3.22 2.19 lineto +closepath stroke + 3.28 2.37 moveto + 3.15 2.56 lineto +closepath stroke + 3.28 2.37 moveto + 3.30 2.56 lineto +closepath stroke + 3.28 2.37 moveto + 3.14 2.40 lineto +closepath stroke + 3.28 2.37 moveto + 3.44 2.34 lineto +closepath stroke + 3.60 2.30 moveto + 3.46 2.53 lineto +closepath stroke + 3.60 2.30 moveto + 3.62 2.53 lineto +closepath stroke + 3.60 2.30 moveto + 3.44 2.34 lineto +closepath stroke + 3.60 2.30 moveto + 3.53 2.09 lineto +closepath stroke + 3.60 2.30 moveto + 3.77 2.27 lineto +closepath stroke + 3.94 2.23 moveto + 3.79 2.49 lineto +closepath stroke + 3.94 2.23 moveto + 3.97 2.49 lineto +closepath stroke + 3.94 2.23 moveto + 3.77 2.27 lineto +closepath stroke + 3.94 2.23 moveto + 3.86 1.98 lineto +closepath stroke + 3.94 2.23 moveto + 3.70 2.05 lineto +closepath stroke + 3.94 2.23 moveto + 4.13 2.19 lineto +closepath stroke + 4.32 2.15 moveto + 4.16 2.45 lineto +closepath stroke + 4.32 2.15 moveto + 4.36 2.45 lineto +closepath stroke + 4.32 2.15 moveto + 4.13 2.19 lineto +closepath stroke + 4.32 2.15 moveto + 4.23 1.86 lineto +closepath stroke + 4.32 2.15 moveto + 4.05 1.94 lineto +closepath stroke + 4.32 2.15 moveto + 4.53 2.11 lineto +closepath stroke + 4.74 2.06 moveto + 4.97 2.01 lineto +closepath stroke + 4.74 2.06 moveto + 4.64 1.73 lineto +closepath stroke + 4.74 2.06 moveto + 4.57 2.41 lineto +closepath stroke + 4.74 2.06 moveto + 4.78 2.41 lineto +closepath stroke + 4.74 2.06 moveto + 4.53 2.11 lineto +closepath stroke + 4.74 2.06 moveto + 4.44 1.82 lineto +closepath stroke + 5.20 1.96 moveto + 5.46 1.91 lineto +closepath stroke + 5.20 1.96 moveto + 5.08 1.59 lineto +closepath stroke + 5.20 1.96 moveto + 5.25 2.36 lineto +closepath stroke + 5.20 1.96 moveto + 4.87 1.68 lineto +closepath stroke + 5.20 1.96 moveto + 4.97 2.01 lineto +closepath stroke + 5.20 1.96 moveto + 5.01 2.36 lineto +closepath stroke + 5.71 1.85 moveto + 5.99 1.80 lineto +closepath stroke + 5.71 1.85 moveto + 5.57 1.43 lineto +closepath stroke + 5.71 1.85 moveto + 6.04 2.30 lineto +closepath stroke + 5.71 1.85 moveto + 5.34 1.53 lineto +closepath stroke + 5.71 1.85 moveto + 5.46 1.91 lineto +closepath stroke + 5.71 1.85 moveto + 5.50 2.30 lineto +closepath stroke + 5.71 1.85 moveto + 5.76 2.30 lineto +closepath stroke + 6.27 1.74 moveto + 6.58 1.67 lineto +closepath stroke + 6.27 1.74 moveto + 6.11 1.25 lineto +closepath stroke + 6.27 1.74 moveto + 6.64 2.24 lineto +closepath stroke + 6.27 1.74 moveto + 5.85 1.37 lineto +closepath stroke + 6.27 1.74 moveto + 5.99 1.80 lineto +closepath stroke + 6.27 1.74 moveto + 6.32 2.24 lineto +closepath stroke + 6.88 1.61 moveto + 7.29 2.18 lineto +closepath stroke + 6.88 1.61 moveto + 7.22 1.53 lineto +closepath stroke + 6.88 1.61 moveto + 6.71 1.06 lineto +closepath stroke + 6.88 1.61 moveto + 6.42 1.19 lineto +closepath stroke + 6.88 1.61 moveto + 6.58 1.67 lineto +closepath stroke + 6.88 1.61 moveto + 6.94 2.18 lineto +closepath stroke + 7.56 1.46 moveto + 7.63 2.11 lineto +closepath stroke + 7.56 1.46 moveto + 7.93 1.38 lineto +closepath stroke + 7.56 1.46 moveto + 7.36 0.73 lineto +closepath stroke + 7.56 1.46 moveto + 7.22 1.53 lineto +closepath stroke + 7.56 1.46 moveto + 7.04 0.99 lineto +closepath stroke + 8.30 1.30 moveto + 8.38 2.03 lineto +closepath stroke + 8.30 1.30 moveto + 8.71 1.22 lineto +closepath stroke + 8.30 1.30 moveto + 7.73 0.65 lineto +closepath stroke + 8.30 1.30 moveto + 8.00 2.03 lineto +closepath stroke + 8.30 1.30 moveto + 7.93 1.38 lineto +closepath stroke + 9.12 1.13 moveto + 9.20 1.94 lineto +closepath stroke + 9.12 1.13 moveto + 10.06 1.03 lineto +closepath stroke + 9.12 1.13 moveto + 10.06 0.57 lineto +closepath stroke + 9.12 1.13 moveto + 8.79 1.94 lineto +closepath stroke + 9.12 1.13 moveto + 8.71 1.22 lineto +closepath stroke + 9.12 1.13 moveto + 8.14 0.57 lineto +closepath stroke + 11.00 0.94 moveto + 10.14 1.84 lineto +closepath stroke + 11.00 0.94 moveto + 11.00 1.84 lineto +closepath stroke + 11.00 0.94 moveto + 10.06 1.03 lineto +closepath stroke + 11.00 0.94 moveto + 11.00 0.47 lineto +closepath stroke + 2.29 2.83 moveto + 2.20 2.75 lineto +closepath stroke + 2.29 2.83 moveto + 2.19 2.83 lineto +closepath stroke + 2.29 2.83 moveto + 2.39 2.94 lineto +closepath stroke + 2.29 2.83 moveto + 2.40 2.86 lineto +closepath stroke + 2.20 2.75 moveto + 2.19 2.83 lineto +closepath stroke + 2.20 2.75 moveto + 2.19 2.67 lineto +closepath stroke + 2.20 2.75 moveto + 2.29 2.67 lineto +closepath stroke + 2.19 2.83 moveto + 2.18 2.90 lineto +closepath stroke + 2.19 2.83 moveto + 2.09 2.81 lineto +closepath stroke + 2.18 2.90 moveto + 2.09 2.81 lineto +closepath stroke + 2.18 2.90 moveto + 2.17 2.96 lineto +closepath stroke + 2.18 2.90 moveto + 2.07 2.93 lineto +closepath stroke + 2.51 2.86 moveto + 2.41 2.75 lineto +closepath stroke + 2.51 2.86 moveto + 2.40 2.86 lineto +closepath stroke + 2.51 2.86 moveto + 2.62 2.99 lineto +closepath stroke + 2.51 2.86 moveto + 2.63 2.88 lineto +closepath stroke + 2.41 2.75 moveto + 2.40 2.86 lineto +closepath stroke + 2.41 2.75 moveto + 2.40 2.64 lineto +closepath stroke + 2.41 2.75 moveto + 2.51 2.64 lineto +closepath stroke + 2.40 2.86 moveto + 2.39 2.94 lineto +closepath stroke + 2.39 2.94 moveto + 2.36 3.02 lineto +closepath stroke + 2.39 2.94 moveto + 2.26 3.00 lineto +closepath stroke + 2.75 2.88 moveto + 2.64 2.75 lineto +closepath stroke + 2.75 2.88 moveto + 2.63 2.88 lineto +closepath stroke + 2.75 2.88 moveto + 2.86 3.04 lineto +closepath stroke + 2.75 2.88 moveto + 2.88 2.91 lineto +closepath stroke + 2.64 2.75 moveto + 2.63 2.88 lineto +closepath stroke + 2.64 2.75 moveto + 2.63 2.62 lineto +closepath stroke + 2.64 2.75 moveto + 2.75 2.62 lineto +closepath stroke + 2.63 2.88 moveto + 2.62 2.99 lineto +closepath stroke + 2.62 2.99 moveto + 2.58 3.09 lineto +closepath stroke + 2.62 2.99 moveto + 2.46 3.06 lineto +closepath stroke + 3.01 2.91 moveto + 2.90 2.75 lineto +closepath stroke + 3.01 2.91 moveto + 2.88 2.91 lineto +closepath stroke + 3.01 2.91 moveto + 3.14 3.10 lineto +closepath stroke + 3.01 2.91 moveto + 3.15 2.94 lineto +closepath stroke + 2.90 2.75 moveto + 2.88 2.91 lineto +closepath stroke + 2.90 2.75 moveto + 2.88 2.59 lineto +closepath stroke + 2.90 2.75 moveto + 3.01 2.59 lineto +closepath stroke + 2.88 2.91 moveto + 2.86 3.04 lineto +closepath stroke + 2.86 3.04 moveto + 2.82 3.17 lineto +closepath stroke + 2.86 3.04 moveto + 2.69 3.14 lineto +closepath stroke + 3.30 2.94 moveto + 3.17 2.75 lineto +closepath stroke + 3.30 2.94 moveto + 3.15 2.94 lineto +closepath stroke + 3.30 2.94 moveto + 3.44 3.16 lineto +closepath stroke + 3.30 2.94 moveto + 3.46 2.97 lineto +closepath stroke + 3.17 2.75 moveto + 3.15 2.94 lineto +closepath stroke + 3.17 2.75 moveto + 3.15 2.56 lineto +closepath stroke + 3.17 2.75 moveto + 3.30 2.56 lineto +closepath stroke + 3.15 2.94 moveto + 3.14 3.10 lineto +closepath stroke + 3.14 3.10 moveto + 3.09 3.25 lineto +closepath stroke + 3.14 3.10 moveto + 2.95 3.22 lineto +closepath stroke + 3.62 2.97 moveto + 3.48 2.75 lineto +closepath stroke + 3.62 2.97 moveto + 3.46 2.97 lineto +closepath stroke + 3.62 2.97 moveto + 3.77 3.23 lineto +closepath stroke + 3.62 2.97 moveto + 3.79 3.01 lineto +closepath stroke + 3.48 2.75 moveto + 3.46 2.97 lineto +closepath stroke + 3.48 2.75 moveto + 3.46 2.53 lineto +closepath stroke + 3.48 2.75 moveto + 3.62 2.53 lineto +closepath stroke + 3.46 2.97 moveto + 3.44 3.16 lineto +closepath stroke + 3.44 3.16 moveto + 3.38 3.34 lineto +closepath stroke + 3.44 3.16 moveto + 3.22 3.31 lineto +closepath stroke + 3.97 3.01 moveto + 3.82 2.75 lineto +closepath stroke + 3.97 3.01 moveto + 3.79 3.01 lineto +closepath stroke + 3.97 3.01 moveto + 4.13 3.31 lineto +closepath stroke + 3.97 3.01 moveto + 4.16 3.05 lineto +closepath stroke + 3.82 2.75 moveto + 3.79 3.01 lineto +closepath stroke + 3.82 2.75 moveto + 3.79 2.49 lineto +closepath stroke + 3.82 2.75 moveto + 3.97 2.49 lineto +closepath stroke + 3.79 3.01 moveto + 3.77 3.23 lineto +closepath stroke + 3.77 3.23 moveto + 3.70 3.45 lineto +closepath stroke + 3.77 3.23 moveto + 3.53 3.41 lineto +closepath stroke + 4.36 3.05 moveto + 4.19 2.75 lineto +closepath stroke + 4.36 3.05 moveto + 4.16 3.05 lineto +closepath stroke + 4.36 3.05 moveto + 4.53 3.39 lineto +closepath stroke + 4.36 3.05 moveto + 4.57 3.09 lineto +closepath stroke + 4.19 2.75 moveto + 4.16 3.05 lineto +closepath stroke + 4.19 2.75 moveto + 4.16 2.45 lineto +closepath stroke + 4.19 2.75 moveto + 4.36 2.45 lineto +closepath stroke + 4.16 3.05 moveto + 4.13 3.31 lineto +closepath stroke + 4.13 3.31 moveto + 4.05 3.56 lineto +closepath stroke + 4.13 3.31 moveto + 3.86 3.52 lineto +closepath stroke + 4.78 3.09 moveto + 4.60 2.75 lineto +closepath stroke + 4.78 3.09 moveto + 4.57 3.09 lineto +closepath stroke + 4.78 3.09 moveto + 4.97 3.49 lineto +closepath stroke + 4.78 3.09 moveto + 5.01 3.14 lineto +closepath stroke + 4.60 2.75 moveto + 4.57 3.09 lineto +closepath stroke + 4.60 2.75 moveto + 4.57 2.41 lineto +closepath stroke + 4.60 2.75 moveto + 4.78 2.41 lineto +closepath stroke + 4.57 3.09 moveto + 4.53 3.39 lineto +closepath stroke + 4.53 3.39 moveto + 4.44 3.68 lineto +closepath stroke + 4.53 3.39 moveto + 4.23 3.64 lineto +closepath stroke + 5.25 3.14 moveto + 5.05 2.75 lineto +closepath stroke + 5.25 3.14 moveto + 5.01 3.14 lineto +closepath stroke + 5.25 3.14 moveto + 5.46 3.59 lineto +closepath stroke + 5.25 3.14 moveto + 5.50 3.20 lineto +closepath stroke + 5.05 2.75 moveto + 5.01 3.14 lineto +closepath stroke + 5.05 2.75 moveto + 5.01 2.36 lineto +closepath stroke + 5.05 2.75 moveto + 5.25 2.36 lineto +closepath stroke + 5.01 3.14 moveto + 4.97 3.49 lineto +closepath stroke + 4.97 3.49 moveto + 4.87 3.82 lineto +closepath stroke + 4.97 3.49 moveto + 4.64 3.77 lineto +closepath stroke + 5.76 3.20 moveto + 6.04 3.20 lineto +closepath stroke + 5.76 3.20 moveto + 6.09 2.75 lineto +closepath stroke + 5.76 3.20 moveto + 5.50 3.20 lineto +closepath stroke + 5.76 3.20 moveto + 5.55 2.75 lineto +closepath stroke + 6.04 3.20 moveto + 6.09 2.75 lineto +closepath stroke + 6.04 3.20 moveto + 5.99 3.70 lineto +closepath stroke + 6.04 3.20 moveto + 6.32 3.26 lineto +closepath stroke + 6.09 2.75 moveto + 6.04 2.30 lineto +closepath stroke + 6.09 2.75 moveto + 5.76 2.30 lineto +closepath stroke + 5.50 3.20 moveto + 5.55 2.75 lineto +closepath stroke + 5.50 3.20 moveto + 5.46 3.59 lineto +closepath stroke + 5.55 2.75 moveto + 5.76 2.30 lineto +closepath stroke + 5.55 2.75 moveto + 5.50 2.30 lineto +closepath stroke + 5.46 3.59 moveto + 5.34 3.97 lineto +closepath stroke + 5.46 3.59 moveto + 5.08 3.91 lineto +closepath stroke + 6.32 3.26 moveto + 6.64 3.26 lineto +closepath stroke + 6.32 3.26 moveto + 6.69 2.75 lineto +closepath stroke + 6.32 3.26 moveto + 5.99 3.70 lineto +closepath stroke + 6.64 3.26 moveto + 6.69 2.75 lineto +closepath stroke + 6.64 3.26 moveto + 6.58 3.83 lineto +closepath stroke + 6.64 3.26 moveto + 6.94 3.32 lineto +closepath stroke + 6.69 2.75 moveto + 6.64 2.24 lineto +closepath stroke + 6.69 2.75 moveto + 6.32 2.24 lineto +closepath stroke + 5.99 3.70 moveto + 5.85 4.13 lineto +closepath stroke + 5.99 3.70 moveto + 5.57 4.07 lineto +closepath stroke + 6.58 3.83 moveto + 6.94 3.32 lineto +closepath stroke + 6.58 3.83 moveto + 6.42 4.31 lineto +closepath stroke + 6.58 3.83 moveto + 6.11 4.25 lineto +closepath stroke + 6.94 3.32 moveto + 7.22 3.97 lineto +closepath stroke + 6.94 3.32 moveto + 7.28 3.39 lineto +closepath stroke + 7.28 3.39 moveto + 7.63 3.39 lineto +closepath stroke + 7.28 3.39 moveto + 7.35 2.75 lineto +closepath stroke + 7.28 3.39 moveto + 7.22 3.97 lineto +closepath stroke + 7.63 3.39 moveto + 7.35 2.75 lineto +closepath stroke + 7.63 3.39 moveto + 7.93 4.12 lineto +closepath stroke + 7.63 3.39 moveto + 8.00 3.47 lineto +closepath stroke + 7.35 2.75 moveto + 7.29 2.18 lineto +closepath stroke + 7.35 2.75 moveto + 6.94 2.18 lineto +closepath stroke + 7.22 3.97 moveto + 7.04 4.51 lineto +closepath stroke + 7.22 3.97 moveto + 6.71 4.44 lineto +closepath stroke + 8.00 3.47 moveto + 8.38 3.47 lineto +closepath stroke + 8.00 3.47 moveto + 8.07 2.75 lineto +closepath stroke + 8.00 3.47 moveto + 7.93 4.12 lineto +closepath stroke + 8.38 3.47 moveto + 8.07 2.75 lineto +closepath stroke + 8.38 3.47 moveto + 8.71 4.28 lineto +closepath stroke + 8.38 3.47 moveto + 8.79 3.56 lineto +closepath stroke + 8.07 2.75 moveto + 8.38 2.03 lineto +closepath stroke + 8.07 2.75 moveto + 8.00 2.03 lineto +closepath stroke + 7.93 4.12 moveto + 7.36 4.77 lineto +closepath stroke + 7.93 4.12 moveto + 7.73 4.85 lineto +closepath stroke + 8.79 3.56 moveto + 9.20 3.56 lineto +closepath stroke + 8.79 3.56 moveto + 8.87 2.75 lineto +closepath stroke + 8.79 3.56 moveto + 8.71 4.28 lineto +closepath stroke + 9.20 3.56 moveto + 8.87 2.75 lineto +closepath stroke + 9.20 3.56 moveto + 10.06 4.47 lineto +closepath stroke + 9.20 3.56 moveto + 10.14 3.66 lineto +closepath stroke + 8.87 2.75 moveto + 9.20 1.94 lineto +closepath stroke + 8.87 2.75 moveto + 8.79 1.94 lineto +closepath stroke + 8.71 4.28 moveto + 7.73 4.85 lineto +closepath stroke + 8.71 4.28 moveto + 8.14 4.93 lineto +closepath stroke + 10.06 4.93 moveto + 11.00 5.03 lineto +closepath stroke + 10.06 4.93 moveto + 10.06 4.47 lineto +closepath stroke + 10.06 4.93 moveto + 9.08 5.50 lineto +closepath stroke + 10.06 4.93 moveto + 8.14 4.93 lineto +closepath stroke + 11.00 5.03 moveto + 10.06 4.47 lineto +closepath stroke + 10.06 4.47 moveto + 10.14 3.66 lineto +closepath stroke + 10.14 3.66 moveto + 11.00 3.66 lineto +closepath stroke + 10.14 3.66 moveto + 10.14 2.75 lineto +closepath stroke + 11.00 3.66 moveto + 10.14 2.75 lineto +closepath stroke + 10.14 2.75 moveto + 11.00 1.84 lineto +closepath stroke + 10.14 2.75 moveto + 10.14 1.84 lineto +closepath stroke + 2.17 2.96 moveto + 2.07 2.93 lineto +closepath stroke + 2.17 2.96 moveto + 2.14 3.03 lineto +closepath stroke + 2.17 2.96 moveto + 2.26 3.00 lineto +closepath stroke + 2.36 3.02 moveto + 2.26 3.00 lineto +closepath stroke + 2.36 3.02 moveto + 2.33 3.12 lineto +closepath stroke + 2.36 3.02 moveto + 2.46 3.06 lineto +closepath stroke + 2.26 3.00 moveto + 2.14 3.03 lineto +closepath stroke + 2.14 3.03 moveto + 2.19 3.15 lineto +closepath stroke + 2.14 3.03 moveto + 2.10 3.11 lineto +closepath stroke + 2.58 3.09 moveto + 2.46 3.06 lineto +closepath stroke + 2.58 3.09 moveto + 2.54 3.21 lineto +closepath stroke + 2.58 3.09 moveto + 2.69 3.14 lineto +closepath stroke + 2.46 3.06 moveto + 2.33 3.12 lineto +closepath stroke + 2.33 3.12 moveto + 2.38 3.26 lineto +closepath stroke + 2.33 3.12 moveto + 2.28 3.21 lineto +closepath stroke + 2.82 3.17 moveto + 2.69 3.14 lineto +closepath stroke + 2.82 3.17 moveto + 2.77 3.32 lineto +closepath stroke + 2.82 3.17 moveto + 2.95 3.22 lineto +closepath stroke + 2.69 3.14 moveto + 2.54 3.21 lineto +closepath stroke + 2.54 3.21 moveto + 2.59 3.38 lineto +closepath stroke + 2.54 3.21 moveto + 2.48 3.33 lineto +closepath stroke + 3.09 3.25 moveto + 2.95 3.22 lineto +closepath stroke + 3.09 3.25 moveto + 3.03 3.43 lineto +closepath stroke + 3.09 3.25 moveto + 3.22 3.31 lineto +closepath stroke + 2.95 3.22 moveto + 2.77 3.32 lineto +closepath stroke + 2.77 3.32 moveto + 2.82 3.51 lineto +closepath stroke + 2.77 3.32 moveto + 2.69 3.46 lineto +closepath stroke + 3.38 3.34 moveto + 3.22 3.31 lineto +closepath stroke + 3.38 3.34 moveto + 3.31 3.56 lineto +closepath stroke + 3.38 3.34 moveto + 3.53 3.41 lineto +closepath stroke + 3.22 3.31 moveto + 3.03 3.43 lineto +closepath stroke + 3.03 3.43 moveto + 3.07 3.66 lineto +closepath stroke + 3.03 3.43 moveto + 2.93 3.60 lineto +closepath stroke + 3.70 3.45 moveto + 3.53 3.41 lineto +closepath stroke + 3.70 3.45 moveto + 3.62 3.69 lineto +closepath stroke + 3.70 3.45 moveto + 3.86 3.52 lineto +closepath stroke + 3.53 3.41 moveto + 3.31 3.56 lineto +closepath stroke + 3.31 3.56 moveto + 3.35 3.82 lineto +closepath stroke + 3.31 3.56 moveto + 3.20 3.75 lineto +closepath stroke + 4.05 3.56 moveto + 3.86 3.52 lineto +closepath stroke + 4.05 3.56 moveto + 3.96 3.85 lineto +closepath stroke + 4.05 3.56 moveto + 4.23 3.64 lineto +closepath stroke + 3.86 3.52 moveto + 3.62 3.69 lineto +closepath stroke + 3.62 3.69 moveto + 3.51 3.89 lineto +closepath stroke + 3.62 3.69 moveto + 3.35 3.82 lineto +closepath stroke + 4.44 3.68 moveto + 4.23 3.64 lineto +closepath stroke + 4.44 3.68 moveto + 4.33 4.01 lineto +closepath stroke + 4.44 3.68 moveto + 4.64 3.77 lineto +closepath stroke + 4.23 3.64 moveto + 3.96 3.85 lineto +closepath stroke + 3.96 3.85 moveto + 3.99 4.19 lineto +closepath stroke + 3.96 3.85 moveto + 3.81 4.11 lineto +closepath stroke + 4.87 3.82 moveto + 4.64 3.77 lineto +closepath stroke + 4.87 3.82 moveto + 4.74 4.19 lineto +closepath stroke + 4.87 3.82 moveto + 5.08 3.91 lineto +closepath stroke + 4.64 3.77 moveto + 4.33 4.01 lineto +closepath stroke + 4.33 4.01 moveto + 4.36 4.40 lineto +closepath stroke + 4.33 4.01 moveto + 4.16 4.31 lineto +closepath stroke + 5.34 3.97 moveto + 5.08 3.91 lineto +closepath stroke + 5.34 3.97 moveto + 5.20 4.40 lineto +closepath stroke + 5.34 3.97 moveto + 5.57 4.07 lineto +closepath stroke + 5.08 3.91 moveto + 4.74 4.19 lineto +closepath stroke + 4.74 4.19 moveto + 4.76 4.63 lineto +closepath stroke + 4.74 4.19 moveto + 4.55 4.54 lineto +closepath stroke + 5.85 4.13 moveto + 5.57 4.07 lineto +closepath stroke + 5.85 4.13 moveto + 5.69 4.62 lineto +closepath stroke + 5.85 4.13 moveto + 6.11 4.25 lineto +closepath stroke + 5.57 4.07 moveto + 5.20 4.40 lineto +closepath stroke + 5.20 4.40 moveto + 5.00 4.74 lineto +closepath stroke + 5.20 4.40 moveto + 4.76 4.63 lineto +closepath stroke + 6.42 4.31 moveto + 6.11 4.25 lineto +closepath stroke + 6.42 4.31 moveto + 6.24 4.86 lineto +closepath stroke + 6.42 4.31 moveto + 6.71 4.44 lineto +closepath stroke + 6.11 4.25 moveto + 5.69 4.62 lineto +closepath stroke + 5.69 4.62 moveto + 5.47 5.12 lineto +closepath stroke + 5.69 4.62 moveto + 5.21 5.00 lineto +closepath stroke + 7.04 4.51 moveto + 6.71 4.44 lineto +closepath stroke + 7.04 4.51 moveto + 6.84 5.24 lineto +closepath stroke + 7.04 4.51 moveto + 7.36 4.77 lineto +closepath stroke + 6.71 4.44 moveto + 6.24 4.86 lineto +closepath stroke + 6.24 4.86 moveto + 5.76 5.24 lineto +closepath stroke + 6.24 4.86 moveto + 5.47 5.12 lineto +closepath stroke + 9.08 5.50 moveto + 8.14 4.93 lineto +closepath stroke + 8.14 4.93 moveto + 7.73 4.85 lineto +closepath stroke + 7.73 4.85 moveto + 7.36 4.77 lineto +closepath stroke + 7.36 4.77 moveto + 6.84 5.24 lineto +closepath stroke + 6.84 5.24 moveto + 5.76 5.24 lineto +closepath stroke + 6.84 5.24 moveto + 6.07 5.50 lineto +closepath stroke + 11.00 1.84 moveto + 10.14 1.84 lineto +closepath stroke + 10.14 1.84 moveto + 10.06 1.03 lineto +closepath stroke + 10.14 1.84 moveto + 9.20 1.94 lineto +closepath stroke + 2.19 3.15 moveto + 2.10 3.11 lineto +closepath stroke + 2.19 3.15 moveto + 2.24 3.28 lineto +closepath stroke + 2.19 3.15 moveto + 2.28 3.21 lineto +closepath stroke + 2.10 3.11 moveto + 2.07 3.16 lineto +closepath stroke + 2.10 3.11 moveto + 2.02 3.05 lineto +closepath stroke + 2.07 3.16 moveto + 2.02 3.05 lineto +closepath stroke + 2.07 3.16 moveto + 2.09 3.28 lineto +closepath stroke + 2.07 3.16 moveto + 2.01 3.22 lineto +closepath stroke + 2.38 3.26 moveto + 2.28 3.21 lineto +closepath stroke + 2.38 3.26 moveto + 2.42 3.42 lineto +closepath stroke + 2.38 3.26 moveto + 2.48 3.33 lineto +closepath stroke + 2.28 3.21 moveto + 2.24 3.28 lineto +closepath stroke + 2.24 3.28 moveto + 2.25 3.43 lineto +closepath stroke + 2.24 3.28 moveto + 2.16 3.36 lineto +closepath stroke + 2.59 3.38 moveto + 2.48 3.33 lineto +closepath stroke + 2.59 3.38 moveto + 2.63 3.57 lineto +closepath stroke + 2.59 3.38 moveto + 2.69 3.46 lineto +closepath stroke + 2.48 3.33 moveto + 2.42 3.42 lineto +closepath stroke + 2.42 3.42 moveto + 2.43 3.59 lineto +closepath stroke + 2.42 3.42 moveto + 2.33 3.52 lineto +closepath stroke + 2.82 3.51 moveto + 2.69 3.46 lineto +closepath stroke + 2.82 3.51 moveto + 2.85 3.73 lineto +closepath stroke + 2.82 3.51 moveto + 2.93 3.60 lineto +closepath stroke + 2.69 3.46 moveto + 2.63 3.57 lineto +closepath stroke + 2.63 3.57 moveto + 2.63 3.77 lineto +closepath stroke + 2.63 3.57 moveto + 2.52 3.69 lineto +closepath stroke + 3.07 3.66 moveto + 2.93 3.60 lineto +closepath stroke + 3.07 3.66 moveto + 3.10 3.92 lineto +closepath stroke + 3.07 3.66 moveto + 3.20 3.75 lineto +closepath stroke + 2.93 3.60 moveto + 2.85 3.73 lineto +closepath stroke + 2.85 3.73 moveto + 2.85 3.96 lineto +closepath stroke + 2.85 3.73 moveto + 2.73 3.88 lineto +closepath stroke + 3.51 3.89 moveto + 3.35 3.82 lineto +closepath stroke + 3.51 3.89 moveto + 3.38 4.11 lineto +closepath stroke + 3.51 3.89 moveto + 3.65 3.99 lineto +closepath stroke + 3.35 3.82 moveto + 3.20 3.75 lineto +closepath stroke + 3.20 3.75 moveto + 3.10 3.92 lineto +closepath stroke + 3.10 3.92 moveto + 3.08 4.18 lineto +closepath stroke + 3.10 3.92 moveto + 2.95 4.08 lineto +closepath stroke + 3.38 4.11 moveto + 3.65 3.99 lineto +closepath stroke + 3.38 4.11 moveto + 3.23 4.28 lineto +closepath stroke + 3.38 4.11 moveto + 3.08 4.18 lineto +closepath stroke + 3.65 3.99 moveto + 3.68 4.33 lineto +closepath stroke + 3.65 3.99 moveto + 3.81 4.11 lineto +closepath stroke + 3.99 4.19 moveto + 3.81 4.11 lineto +closepath stroke + 3.99 4.19 moveto + 4.01 4.57 lineto +closepath stroke + 3.99 4.19 moveto + 4.16 4.31 lineto +closepath stroke + 3.81 4.11 moveto + 3.68 4.33 lineto +closepath stroke + 3.68 4.33 moveto + 3.50 4.53 lineto +closepath stroke + 3.68 4.33 moveto + 3.35 4.41 lineto +closepath stroke + 4.36 4.40 moveto + 4.16 4.31 lineto +closepath stroke + 4.36 4.40 moveto + 4.37 4.84 lineto +closepath stroke + 4.36 4.40 moveto + 4.55 4.54 lineto +closepath stroke + 4.16 4.31 moveto + 4.01 4.57 lineto +closepath stroke + 4.01 4.57 moveto + 3.81 4.80 lineto +closepath stroke + 4.01 4.57 moveto + 3.63 4.67 lineto +closepath stroke + 4.76 4.63 moveto + 4.55 4.54 lineto +closepath stroke + 4.76 4.63 moveto + 5.00 4.74 lineto +closepath stroke + 4.55 4.54 moveto + 4.37 4.84 lineto +closepath stroke + 4.37 4.84 moveto + 4.14 5.24 lineto +closepath stroke + 4.37 4.84 moveto + 3.95 5.10 lineto +closepath stroke + 5.00 4.74 moveto + 4.77 5.24 lineto +closepath stroke + 5.00 4.74 moveto + 5.21 5.00 lineto +closepath stroke + 5.76 5.24 moveto + 5.47 5.12 lineto +closepath stroke + 5.76 5.24 moveto + 6.07 5.50 lineto +closepath stroke + 5.47 5.12 moveto + 5.21 5.00 lineto +closepath stroke + 5.21 5.00 moveto + 4.77 5.24 lineto +closepath stroke + 4.77 5.24 moveto + 4.14 5.24 lineto +closepath stroke + 4.77 5.24 moveto + 4.35 5.50 lineto +closepath stroke + 2.09 3.28 moveto + 2.01 3.22 lineto +closepath stroke + 2.09 3.28 moveto + 2.11 3.43 lineto +closepath stroke + 2.09 3.28 moveto + 2.16 3.36 lineto +closepath stroke + 2.01 3.22 moveto + 1.97 3.27 lineto +closepath stroke + 2.01 3.22 moveto + 1.94 3.15 lineto +closepath stroke + 1.97 3.27 moveto + 1.94 3.15 lineto +closepath stroke + 1.97 3.27 moveto + 1.97 3.39 lineto +closepath stroke + 1.97 3.27 moveto + 1.90 3.32 lineto +closepath stroke + 2.25 3.43 moveto + 2.16 3.36 lineto +closepath stroke + 2.25 3.43 moveto + 2.26 3.60 lineto +closepath stroke + 2.25 3.43 moveto + 2.33 3.52 lineto +closepath stroke + 2.16 3.36 moveto + 2.11 3.43 lineto +closepath stroke + 2.11 3.43 moveto + 2.04 3.48 lineto +closepath stroke + 2.11 3.43 moveto + 1.97 3.39 lineto +closepath stroke + 2.43 3.59 moveto + 2.33 3.52 lineto +closepath stroke + 2.43 3.59 moveto + 2.43 3.79 lineto +closepath stroke + 2.43 3.59 moveto + 2.52 3.69 lineto +closepath stroke + 2.33 3.52 moveto + 2.26 3.60 lineto +closepath stroke + 2.26 3.60 moveto + 2.24 3.77 lineto +closepath stroke + 2.26 3.60 moveto + 2.16 3.68 lineto +closepath stroke + 2.63 3.77 moveto + 2.52 3.69 lineto +closepath stroke + 2.63 3.77 moveto + 2.62 3.99 lineto +closepath stroke + 2.63 3.77 moveto + 2.73 3.88 lineto +closepath stroke + 2.52 3.69 moveto + 2.43 3.79 lineto +closepath stroke + 2.43 3.79 moveto + 2.33 3.86 lineto +closepath stroke + 2.43 3.79 moveto + 2.24 3.77 lineto +closepath stroke + 2.85 3.96 moveto + 2.73 3.88 lineto +closepath stroke + 2.85 3.96 moveto + 2.83 4.22 lineto +closepath stroke + 2.85 3.96 moveto + 2.95 4.08 lineto +closepath stroke + 2.73 3.88 moveto + 2.62 3.99 lineto +closepath stroke + 2.62 3.99 moveto + 2.49 4.09 lineto +closepath stroke + 2.62 3.99 moveto + 2.39 3.98 lineto +closepath stroke + 3.23 4.28 moveto + 3.08 4.18 lineto +closepath stroke + 3.23 4.28 moveto + 3.05 4.47 lineto +closepath stroke + 3.23 4.28 moveto + 3.35 4.41 lineto +closepath stroke + 3.08 4.18 moveto + 2.95 4.08 lineto +closepath stroke + 2.95 4.08 moveto + 2.83 4.22 lineto +closepath stroke + 2.83 4.22 moveto + 2.67 4.33 lineto +closepath stroke + 2.83 4.22 moveto + 2.56 4.22 lineto +closepath stroke + 3.50 4.53 moveto + 3.35 4.41 lineto +closepath stroke + 3.50 4.53 moveto + 3.30 4.75 lineto +closepath stroke + 3.50 4.53 moveto + 3.63 4.67 lineto +closepath stroke + 3.35 4.41 moveto + 3.05 4.47 lineto +closepath stroke + 3.05 4.47 moveto + 2.96 4.76 lineto +closepath stroke + 3.05 4.47 moveto + 2.84 4.63 lineto +closepath stroke + 3.81 4.80 moveto + 3.63 4.67 lineto +closepath stroke + 3.81 4.80 moveto + 3.58 5.20 lineto +closepath stroke + 3.81 4.80 moveto + 3.95 5.10 lineto +closepath stroke + 3.63 4.67 moveto + 3.30 4.75 lineto +closepath stroke + 3.30 4.75 moveto + 3.09 4.90 lineto +closepath stroke + 3.30 4.75 moveto + 2.96 4.76 lineto +closepath stroke + 4.14 5.24 moveto + 3.95 5.10 lineto +closepath stroke + 4.14 5.24 moveto + 4.35 5.50 lineto +closepath stroke + 3.95 5.10 moveto + 3.58 5.20 lineto +closepath stroke + 3.58 5.20 moveto + 3.19 5.20 lineto +closepath stroke + 3.58 5.20 moveto + 3.33 5.50 lineto +closepath stroke + 1.97 3.39 moveto + 1.90 3.32 lineto +closepath stroke + 1.97 3.39 moveto + 2.04 3.48 lineto +closepath stroke + 1.90 3.32 moveto + 1.85 3.36 lineto +closepath stroke + 1.90 3.32 moveto + 1.85 3.23 lineto +closepath stroke + 1.85 3.36 moveto + 1.85 3.23 lineto +closepath stroke + 1.85 3.36 moveto + 1.82 3.48 lineto +closepath stroke + 1.85 3.36 moveto + 1.77 3.39 lineto +closepath stroke + 2.04 3.48 moveto + 1.95 3.54 lineto +closepath stroke + 2.04 3.48 moveto + 2.10 3.57 lineto +closepath stroke + 1.95 3.54 moveto + 2.10 3.57 lineto +closepath stroke + 1.95 3.54 moveto + 1.88 3.57 lineto +closepath stroke + 1.95 3.54 moveto + 1.82 3.48 lineto +closepath stroke + 2.10 3.57 moveto + 2.07 3.74 lineto +closepath stroke + 2.10 3.57 moveto + 2.16 3.68 lineto +closepath stroke + 2.33 3.86 moveto + 2.24 3.77 lineto +closepath stroke + 2.33 3.86 moveto + 2.20 3.96 lineto +closepath stroke + 2.33 3.86 moveto + 2.39 3.98 lineto +closepath stroke + 2.24 3.77 moveto + 2.16 3.68 lineto +closepath stroke + 2.16 3.68 moveto + 2.07 3.74 lineto +closepath stroke + 2.07 3.74 moveto + 1.97 3.78 lineto +closepath stroke + 2.07 3.74 moveto + 1.91 3.68 lineto +closepath stroke + 2.49 4.09 moveto + 2.39 3.98 lineto +closepath stroke + 2.49 4.09 moveto + 2.34 4.20 lineto +closepath stroke + 2.49 4.09 moveto + 2.56 4.22 lineto +closepath stroke + 2.39 3.98 moveto + 2.20 3.96 lineto +closepath stroke + 2.20 3.96 moveto + 2.08 4.01 lineto +closepath stroke + 2.20 3.96 moveto + 2.01 3.90 lineto +closepath stroke + 2.67 4.33 moveto + 2.56 4.22 lineto +closepath stroke + 2.67 4.33 moveto + 2.49 4.47 lineto +closepath stroke + 2.67 4.33 moveto + 2.75 4.47 lineto +closepath stroke + 2.56 4.22 moveto + 2.34 4.20 lineto +closepath stroke + 2.34 4.20 moveto + 2.24 4.40 lineto +closepath stroke + 2.34 4.20 moveto + 2.16 4.28 lineto +closepath stroke + 2.49 4.47 moveto + 2.75 4.47 lineto +closepath stroke + 2.49 4.47 moveto + 2.37 4.70 lineto +closepath stroke + 2.49 4.47 moveto + 2.29 4.56 lineto +closepath stroke + 2.75 4.47 moveto + 2.66 4.76 lineto +closepath stroke + 2.75 4.47 moveto + 2.84 4.63 lineto +closepath stroke + 3.09 4.90 moveto + 2.96 4.76 lineto +closepath stroke + 3.09 4.90 moveto + 3.19 5.20 lineto +closepath stroke + 3.09 4.90 moveto + 2.85 5.21 lineto +closepath stroke + 2.96 4.76 moveto + 2.84 4.63 lineto +closepath stroke + 2.84 4.63 moveto + 2.66 4.76 lineto +closepath stroke + 2.66 4.76 moveto + 2.51 5.02 lineto +closepath stroke + 2.66 4.76 moveto + 2.42 4.87 lineto +closepath stroke + 3.19 5.20 moveto + 2.85 5.21 lineto +closepath stroke + 3.19 5.20 moveto + 3.33 5.50 lineto +closepath stroke + 2.85 5.21 moveto + 2.61 5.31 lineto +closepath stroke + 2.85 5.21 moveto + 2.51 5.02 lineto +closepath stroke + 10.06 1.03 moveto + 9.20 1.94 lineto +closepath stroke + 10.06 1.03 moveto + 11.00 0.47 lineto +closepath stroke + 10.06 1.03 moveto + 10.06 0.57 lineto +closepath stroke + 9.20 1.94 moveto + 8.79 1.94 lineto +closepath stroke + 11.00 0.47 moveto + 10.06 0.57 lineto +closepath stroke + 10.06 0.57 moveto + 8.14 0.57 lineto +closepath stroke + 10.06 0.57 moveto + 9.08 0.00 lineto +closepath stroke + 8.79 1.94 moveto + 8.71 1.22 lineto +closepath stroke + 8.79 1.94 moveto + 8.38 2.03 lineto +closepath stroke + 1.82 3.48 moveto + 1.77 3.39 lineto +closepath stroke + 1.82 3.48 moveto + 1.88 3.57 lineto +closepath stroke + 1.77 3.39 moveto + 1.72 3.42 lineto +closepath stroke + 1.77 3.39 moveto + 1.74 3.30 lineto +closepath stroke + 1.72 3.42 moveto + 1.74 3.30 lineto +closepath stroke + 1.72 3.42 moveto + 1.65 3.43 lineto +closepath stroke + 1.72 3.42 moveto + 1.62 3.33 lineto +closepath stroke + 1.88 3.57 moveto + 1.78 3.62 lineto +closepath stroke + 1.88 3.57 moveto + 1.91 3.68 lineto +closepath stroke + 1.97 3.78 moveto + 1.91 3.68 lineto +closepath stroke + 1.97 3.78 moveto + 1.85 3.84 lineto +closepath stroke + 1.97 3.78 moveto + 2.01 3.90 lineto +closepath stroke + 1.91 3.68 moveto + 1.78 3.62 lineto +closepath stroke + 1.78 3.62 moveto + 1.70 3.63 lineto +closepath stroke + 1.78 3.62 moveto + 1.67 3.53 lineto +closepath stroke + 2.08 4.01 moveto + 2.01 3.90 lineto +closepath stroke + 2.08 4.01 moveto + 1.93 4.08 lineto +closepath stroke + 2.08 4.01 moveto + 2.12 4.14 lineto +closepath stroke + 2.01 3.90 moveto + 1.85 3.84 lineto +closepath stroke + 1.85 3.84 moveto + 1.75 3.86 lineto +closepath stroke + 1.85 3.84 moveto + 1.71 3.74 lineto +closepath stroke + 1.93 4.08 moveto + 2.12 4.14 lineto +closepath stroke + 1.93 4.08 moveto + 1.82 4.24 lineto +closepath stroke + 1.93 4.08 moveto + 1.77 4.11 lineto +closepath stroke + 2.12 4.14 moveto + 2.02 4.34 lineto +closepath stroke + 2.12 4.14 moveto + 2.16 4.28 lineto +closepath stroke + 2.24 4.40 moveto + 2.16 4.28 lineto +closepath stroke + 2.24 4.40 moveto + 2.11 4.64 lineto +closepath stroke + 2.24 4.40 moveto + 2.29 4.56 lineto +closepath stroke + 2.16 4.28 moveto + 2.02 4.34 lineto +closepath stroke + 2.02 4.34 moveto + 1.88 4.52 lineto +closepath stroke + 2.02 4.34 moveto + 1.83 4.38 lineto +closepath stroke + 2.37 4.70 moveto + 2.29 4.56 lineto +closepath stroke + 2.37 4.70 moveto + 2.22 4.96 lineto +closepath stroke + 2.37 4.70 moveto + 2.42 4.87 lineto +closepath stroke + 2.29 4.56 moveto + 2.11 4.64 lineto +closepath stroke + 2.11 4.64 moveto + 1.94 4.83 lineto +closepath stroke + 2.11 4.64 moveto + 1.89 4.68 lineto +closepath stroke + 2.61 5.31 moveto + 2.51 5.02 lineto +closepath stroke + 2.61 5.31 moveto + 2.61 5.50 lineto +closepath stroke + 2.61 5.31 moveto + 2.27 5.31 lineto +closepath stroke + 2.51 5.02 moveto + 2.42 4.87 lineto +closepath stroke + 2.42 4.87 moveto + 2.22 4.96 lineto +closepath stroke + 2.22 4.96 moveto + 2.00 5.00 lineto +closepath stroke + 2.22 4.96 moveto + 1.94 4.83 lineto +closepath stroke + 2.61 5.50 moveto + 2.27 5.31 lineto +closepath stroke + 2.27 5.31 moveto + 2.02 5.50 lineto +closepath stroke + 2.27 5.31 moveto + 2.02 5.31 lineto +closepath stroke + 1.65 3.43 moveto + 1.62 3.33 lineto +closepath stroke + 1.65 3.43 moveto + 1.57 3.45 lineto +closepath stroke + 1.65 3.43 moveto + 1.67 3.53 lineto +closepath stroke + 1.70 3.63 moveto + 1.67 3.53 lineto +closepath stroke + 1.70 3.63 moveto + 1.60 3.66 lineto +closepath stroke + 1.70 3.63 moveto + 1.71 3.74 lineto +closepath stroke + 1.67 3.53 moveto + 1.57 3.45 lineto +closepath stroke + 1.57 3.45 moveto + 1.50 3.55 lineto +closepath stroke + 1.57 3.45 moveto + 1.49 3.45 lineto +closepath stroke + 1.75 3.86 moveto + 1.71 3.74 lineto +closepath stroke + 1.75 3.86 moveto + 1.62 3.88 lineto +closepath stroke + 1.75 3.86 moveto + 1.76 3.98 lineto +closepath stroke + 1.71 3.74 moveto + 1.60 3.66 lineto +closepath stroke + 1.60 3.66 moveto + 1.50 3.76 lineto +closepath stroke + 1.60 3.66 moveto + 1.49 3.66 lineto +closepath stroke + 1.62 3.88 moveto + 1.76 3.98 lineto +closepath stroke + 1.62 3.88 moveto + 1.50 4.01 lineto +closepath stroke + 1.62 3.88 moveto + 1.49 3.88 lineto +closepath stroke + 1.76 3.98 moveto + 1.65 4.14 lineto +closepath stroke + 1.76 3.98 moveto + 1.77 4.11 lineto +closepath stroke + 1.82 4.24 moveto + 1.77 4.11 lineto +closepath stroke + 1.82 4.24 moveto + 1.68 4.42 lineto +closepath stroke + 1.82 4.24 moveto + 1.83 4.38 lineto +closepath stroke + 1.77 4.11 moveto + 1.65 4.14 lineto +closepath stroke + 1.65 4.14 moveto + 1.50 4.27 lineto +closepath stroke + 1.65 4.14 moveto + 1.49 4.14 lineto +closepath stroke + 1.88 4.52 moveto + 1.83 4.38 lineto +closepath stroke + 1.88 4.52 moveto + 1.71 4.72 lineto +closepath stroke + 1.88 4.52 moveto + 1.89 4.68 lineto +closepath stroke + 1.83 4.38 moveto + 1.68 4.42 lineto +closepath stroke + 1.68 4.42 moveto + 1.52 4.42 lineto +closepath stroke + 1.68 4.42 moveto + 1.50 4.27 lineto +closepath stroke + 2.00 5.00 moveto + 1.94 4.83 lineto +closepath stroke + 2.00 5.00 moveto + 1.74 5.19 lineto +closepath stroke + 2.00 5.00 moveto + 2.02 5.31 lineto +closepath stroke + 1.94 4.83 moveto + 1.89 4.68 lineto +closepath stroke + 1.89 4.68 moveto + 1.71 4.72 lineto +closepath stroke + 1.71 4.72 moveto + 1.52 4.72 lineto +closepath stroke + 1.71 4.72 moveto + 1.50 4.56 lineto +closepath stroke + 2.02 5.50 moveto + 2.02 5.31 lineto +closepath stroke + 2.02 5.31 moveto + 1.74 5.19 lineto +closepath stroke + 1.74 5.19 moveto + 1.52 5.19 lineto +closepath stroke + 1.74 5.19 moveto + 1.50 4.88 lineto +closepath stroke + 8.71 1.22 moveto + 8.38 2.03 lineto +closepath stroke + 8.71 1.22 moveto + 7.73 0.65 lineto +closepath stroke + 8.71 1.22 moveto + 8.14 0.57 lineto +closepath stroke + 8.38 2.03 moveto + 8.00 2.03 lineto +closepath stroke + 1.50 3.55 moveto + 1.49 3.45 lineto +closepath stroke + 1.50 3.55 moveto + 1.40 3.66 lineto +closepath stroke + 1.50 3.55 moveto + 1.49 3.66 lineto +closepath stroke + 1.49 3.45 moveto + 1.43 3.45 lineto +closepath stroke + 1.49 3.45 moveto + 1.50 3.35 lineto +closepath stroke + 1.43 3.45 moveto + 1.50 3.35 lineto +closepath stroke + 1.43 3.45 moveto + 1.37 3.43 lineto +closepath stroke + 1.43 3.45 moveto + 1.38 3.33 lineto +closepath stroke + 1.50 3.76 moveto + 1.49 3.66 lineto +closepath stroke + 1.50 3.76 moveto + 1.38 3.88 lineto +closepath stroke + 1.50 3.76 moveto + 1.49 3.88 lineto +closepath stroke + 1.49 3.66 moveto + 1.40 3.66 lineto +closepath stroke + 1.40 3.66 moveto + 1.32 3.64 lineto +closepath stroke + 1.40 3.66 moveto + 1.33 3.53 lineto +closepath stroke + 1.50 4.01 moveto + 1.49 3.88 lineto +closepath stroke + 1.50 4.01 moveto + 1.35 4.14 lineto +closepath stroke + 1.50 4.01 moveto + 1.49 4.14 lineto +closepath stroke + 1.49 3.88 moveto + 1.38 3.88 lineto +closepath stroke + 1.38 3.88 moveto + 1.28 3.86 lineto +closepath stroke + 1.38 3.88 moveto + 1.29 3.74 lineto +closepath stroke + 1.52 4.42 moveto + 1.50 4.27 lineto +closepath stroke + 1.52 4.42 moveto + 1.32 4.42 lineto +closepath stroke + 1.52 4.42 moveto + 1.50 4.56 lineto +closepath stroke + 1.50 4.27 moveto + 1.49 4.14 lineto +closepath stroke + 1.49 4.14 moveto + 1.35 4.14 lineto +closepath stroke + 1.35 4.14 moveto + 1.23 4.11 lineto +closepath stroke + 1.35 4.14 moveto + 1.24 3.98 lineto +closepath stroke + 1.52 4.72 moveto + 1.50 4.56 lineto +closepath stroke + 1.52 4.72 moveto + 1.29 4.72 lineto +closepath stroke + 1.52 4.72 moveto + 1.50 4.88 lineto +closepath stroke + 1.50 4.56 moveto + 1.32 4.42 lineto +closepath stroke + 1.32 4.42 moveto + 1.17 4.38 lineto +closepath stroke + 1.32 4.42 moveto + 1.18 4.24 lineto +closepath stroke + 1.52 5.19 moveto + 1.50 4.88 lineto +closepath stroke + 1.52 5.19 moveto + 1.50 5.50 lineto +closepath stroke + 1.52 5.19 moveto + 1.26 5.19 lineto +closepath stroke + 1.50 4.88 moveto + 1.29 4.72 lineto +closepath stroke + 1.29 4.72 moveto + 1.06 4.83 lineto +closepath stroke + 1.29 4.72 moveto + 1.07 4.67 lineto +closepath stroke + 1.50 5.50 moveto + 1.26 5.19 lineto +closepath stroke + 1.26 5.19 moveto + 0.98 5.31 lineto +closepath stroke + 1.26 5.19 moveto + 1.00 5.00 lineto +closepath stroke + 1.37 3.43 moveto + 1.38 3.33 lineto +closepath stroke + 1.37 3.43 moveto + 1.28 3.42 lineto +closepath stroke + 1.37 3.43 moveto + 1.33 3.53 lineto +closepath stroke + 1.32 3.64 moveto + 1.33 3.53 lineto +closepath stroke + 1.32 3.64 moveto + 1.22 3.62 lineto +closepath stroke + 1.32 3.64 moveto + 1.29 3.74 lineto +closepath stroke + 1.33 3.53 moveto + 1.28 3.42 lineto +closepath stroke + 1.28 3.42 moveto + 1.18 3.48 lineto +closepath stroke + 1.28 3.42 moveto + 1.21 3.38 lineto +closepath stroke + 1.28 3.86 moveto + 1.29 3.74 lineto +closepath stroke + 1.28 3.86 moveto + 1.15 3.84 lineto +closepath stroke + 1.28 3.86 moveto + 1.24 3.98 lineto +closepath stroke + 1.29 3.74 moveto + 1.22 3.62 lineto +closepath stroke + 1.22 3.62 moveto + 1.09 3.68 lineto +closepath stroke + 1.22 3.62 moveto + 1.12 3.57 lineto +closepath stroke + 1.23 4.11 moveto + 1.24 3.98 lineto +closepath stroke + 1.23 4.11 moveto + 1.07 4.08 lineto +closepath stroke + 1.23 4.11 moveto + 1.18 4.24 lineto +closepath stroke + 1.24 3.98 moveto + 1.15 3.84 lineto +closepath stroke + 1.15 3.84 moveto + 0.99 3.90 lineto +closepath stroke + 1.15 3.84 moveto + 1.03 3.78 lineto +closepath stroke + 1.17 4.38 moveto + 1.18 4.24 lineto +closepath stroke + 1.17 4.38 moveto + 0.98 4.34 lineto +closepath stroke + 1.17 4.38 moveto + 1.12 4.52 lineto +closepath stroke + 1.18 4.24 moveto + 1.07 4.08 lineto +closepath stroke + 1.07 4.08 moveto + 0.88 4.14 lineto +closepath stroke + 1.07 4.08 moveto + 0.92 4.01 lineto +closepath stroke + 0.98 4.34 moveto + 1.12 4.52 lineto +closepath stroke + 0.98 4.34 moveto + 0.76 4.40 lineto +closepath stroke + 0.98 4.34 moveto + 0.81 4.27 lineto +closepath stroke + 1.12 4.52 moveto + 0.89 4.64 lineto +closepath stroke + 1.12 4.52 moveto + 1.07 4.67 lineto +closepath stroke + 1.06 4.83 moveto + 1.07 4.67 lineto +closepath stroke + 1.06 4.83 moveto + 0.78 4.96 lineto +closepath stroke + 1.06 4.83 moveto + 1.00 5.00 lineto +closepath stroke + 1.07 4.67 moveto + 0.89 4.64 lineto +closepath stroke + 0.89 4.64 moveto + 0.71 4.56 lineto +closepath stroke + 0.89 4.64 moveto + 0.76 4.40 lineto +closepath stroke + 0.98 5.31 moveto + 1.00 5.00 lineto +closepath stroke + 0.98 5.31 moveto + 0.98 5.50 lineto +closepath stroke + 0.98 5.31 moveto + 0.73 5.31 lineto +closepath stroke + 1.00 5.00 moveto + 0.78 4.96 lineto +closepath stroke + 0.78 4.96 moveto + 0.58 4.87 lineto +closepath stroke + 0.78 4.96 moveto + 0.63 4.70 lineto +closepath stroke + 0.98 5.50 moveto + 0.73 5.31 lineto +closepath stroke + 0.73 5.31 moveto + 0.36 5.50 lineto +closepath stroke + 0.73 5.31 moveto + 0.36 5.31 lineto +closepath stroke + 0.36 5.50 moveto + 0.36 5.31 lineto +closepath stroke + 0.36 5.31 moveto + 0.49 5.02 lineto +closepath stroke + 0.36 5.31 moveto + 0.13 5.21 lineto +closepath stroke + 7.73 0.65 moveto + 8.14 0.57 lineto +closepath stroke + 7.73 0.65 moveto + 7.36 0.73 lineto +closepath stroke + 7.73 0.65 moveto + 7.93 1.38 lineto +closepath stroke + 8.14 0.57 moveto + 9.08 0.00 lineto +closepath stroke + 1.18 3.48 moveto + 1.21 3.38 lineto +closepath stroke + 1.18 3.48 moveto + 1.04 3.54 lineto +closepath stroke + 1.18 3.48 moveto + 1.12 3.57 lineto +closepath stroke + 1.21 3.38 moveto + 1.15 3.36 lineto +closepath stroke + 1.21 3.38 moveto + 1.26 3.30 lineto +closepath stroke + 1.15 3.36 moveto + 1.26 3.30 lineto +closepath stroke + 1.15 3.36 moveto + 1.10 3.32 lineto +closepath stroke + 1.15 3.36 moveto + 1.15 3.23 lineto +closepath stroke + 1.09 3.68 moveto + 1.12 3.57 lineto +closepath stroke + 1.09 3.68 moveto + 0.93 3.74 lineto +closepath stroke + 1.09 3.68 moveto + 1.03 3.78 lineto +closepath stroke + 1.12 3.57 moveto + 1.04 3.54 lineto +closepath stroke + 1.04 3.54 moveto + 0.98 3.49 lineto +closepath stroke + 1.04 3.54 moveto + 1.03 3.39 lineto +closepath stroke + 0.99 3.90 moveto + 1.03 3.78 lineto +closepath stroke + 0.99 3.90 moveto + 0.80 3.96 lineto +closepath stroke + 0.99 3.90 moveto + 0.92 4.01 lineto +closepath stroke + 1.03 3.78 moveto + 0.93 3.74 lineto +closepath stroke + 0.93 3.74 moveto + 0.76 3.77 lineto +closepath stroke + 0.93 3.74 moveto + 0.82 3.66 lineto +closepath stroke + 0.88 4.14 moveto + 0.92 4.01 lineto +closepath stroke + 0.88 4.14 moveto + 0.66 4.20 lineto +closepath stroke + 0.88 4.14 moveto + 0.81 4.27 lineto +closepath stroke + 0.92 4.01 moveto + 0.80 3.96 lineto +closepath stroke + 0.80 3.96 moveto + 0.61 3.98 lineto +closepath stroke + 0.80 3.96 moveto + 0.67 3.86 lineto +closepath stroke + 0.71 4.56 moveto + 0.76 4.40 lineto +closepath stroke + 0.71 4.56 moveto + 0.51 4.47 lineto +closepath stroke + 0.71 4.56 moveto + 0.63 4.70 lineto +closepath stroke + 0.76 4.40 moveto + 0.81 4.27 lineto +closepath stroke + 0.81 4.27 moveto + 0.66 4.20 lineto +closepath stroke + 0.66 4.20 moveto + 0.44 4.22 lineto +closepath stroke + 0.66 4.20 moveto + 0.51 4.09 lineto +closepath stroke + 0.58 4.87 moveto + 0.63 4.70 lineto +closepath stroke + 0.58 4.87 moveto + 0.49 5.02 lineto +closepath stroke + 0.58 4.87 moveto + 0.34 4.76 lineto +closepath stroke + 0.63 4.70 moveto + 0.51 4.47 lineto +closepath stroke + 0.51 4.47 moveto + 0.35 4.35 lineto +closepath stroke + 0.51 4.47 moveto + 0.44 4.22 lineto +closepath stroke + 0.49 5.02 moveto + 0.34 4.76 lineto +closepath stroke + 0.49 5.02 moveto + 0.13 5.21 lineto +closepath stroke + 0.34 4.76 moveto + 0.13 4.91 lineto +closepath stroke + 0.34 4.76 moveto + 0.21 4.76 lineto +closepath stroke + 0.13 5.21 moveto + 0.00 5.21 lineto +closepath stroke + 0.13 5.21 moveto + 0.13 4.91 lineto +closepath stroke + 0.13 4.91 moveto + 0.21 4.76 lineto +closepath stroke + 0.13 4.91 moveto + 0.00 5.21 lineto +closepath stroke + 0.21 4.76 moveto + 0.21 4.47 lineto +closepath stroke + 0.21 4.76 moveto + 0.00 4.63 lineto +closepath stroke + 1.10 3.32 moveto + 1.15 3.23 lineto +closepath stroke + 1.10 3.32 moveto + 1.03 3.27 lineto +closepath stroke + 1.10 3.32 moveto + 1.03 3.39 lineto +closepath stroke + 0.98 3.49 moveto + 1.03 3.39 lineto +closepath stroke + 0.98 3.49 moveto + 0.89 3.43 lineto +closepath stroke + 0.98 3.49 moveto + 0.90 3.57 lineto +closepath stroke + 1.03 3.39 moveto + 1.03 3.27 lineto +closepath stroke + 1.03 3.27 moveto + 0.91 3.28 lineto +closepath stroke + 1.03 3.27 moveto + 0.98 3.21 lineto +closepath stroke + 0.89 3.43 moveto + 0.90 3.57 lineto +closepath stroke + 0.89 3.43 moveto + 0.75 3.43 lineto +closepath stroke + 0.89 3.43 moveto + 0.82 3.35 lineto +closepath stroke + 0.90 3.57 moveto + 0.74 3.60 lineto +closepath stroke + 0.90 3.57 moveto + 0.82 3.66 lineto +closepath stroke + 0.76 3.77 moveto + 0.82 3.66 lineto +closepath stroke + 0.76 3.77 moveto + 0.57 3.79 lineto +closepath stroke + 0.76 3.77 moveto + 0.67 3.86 lineto +closepath stroke + 0.82 3.66 moveto + 0.74 3.60 lineto +closepath stroke + 0.74 3.60 moveto + 0.57 3.59 lineto +closepath stroke + 0.74 3.60 moveto + 0.65 3.50 lineto +closepath stroke + 0.61 3.98 moveto + 0.67 3.86 lineto +closepath stroke + 0.61 3.98 moveto + 0.38 3.99 lineto +closepath stroke + 0.61 3.98 moveto + 0.51 4.09 lineto +closepath stroke + 0.67 3.86 moveto + 0.57 3.79 lineto +closepath stroke + 0.57 3.79 moveto + 0.48 3.69 lineto +closepath stroke + 0.57 3.79 moveto + 0.57 3.59 lineto +closepath stroke + 0.35 4.35 moveto + 0.44 4.22 lineto +closepath stroke + 0.35 4.35 moveto + 0.21 4.47 lineto +closepath stroke + 0.35 4.35 moveto + 0.14 4.22 lineto +closepath stroke + 0.44 4.22 moveto + 0.51 4.09 lineto +closepath stroke + 0.51 4.09 moveto + 0.38 3.99 lineto +closepath stroke + 0.38 3.99 moveto + 0.27 3.88 lineto +closepath stroke + 0.38 3.99 moveto + 0.37 3.77 lineto +closepath stroke + 0.21 4.47 moveto + 0.14 4.22 lineto +closepath stroke + 0.21 4.47 moveto + 0.00 4.63 lineto +closepath stroke + 0.14 4.22 moveto + 0.14 3.88 lineto +closepath stroke + 0.14 4.22 moveto + 0.00 4.00 lineto +closepath stroke + 8.00 2.03 moveto + 7.93 1.38 lineto +closepath stroke + 8.00 2.03 moveto + 7.63 2.11 lineto +closepath stroke + 0.91 3.28 moveto + 0.98 3.21 lineto +closepath stroke + 0.91 3.28 moveto + 0.76 3.28 lineto +closepath stroke + 0.91 3.28 moveto + 0.82 3.35 lineto +closepath stroke + 0.98 3.21 moveto + 0.93 3.16 lineto +closepath stroke + 0.98 3.21 moveto + 1.06 3.15 lineto +closepath stroke + 0.93 3.16 moveto + 1.06 3.15 lineto +closepath stroke + 0.93 3.16 moveto + 0.90 3.11 lineto +closepath stroke + 0.93 3.16 moveto + 0.98 3.05 lineto +closepath stroke + 0.75 3.43 moveto + 0.82 3.35 lineto +closepath stroke + 0.75 3.43 moveto + 0.58 3.42 lineto +closepath stroke + 0.75 3.43 moveto + 0.65 3.50 lineto +closepath stroke + 0.82 3.35 moveto + 0.76 3.28 lineto +closepath stroke + 0.76 3.28 moveto + 0.72 3.21 lineto +closepath stroke + 0.76 3.28 moveto + 0.81 3.15 lineto +closepath stroke + 0.48 3.69 moveto + 0.57 3.59 lineto +closepath stroke + 0.48 3.69 moveto + 0.37 3.57 lineto +closepath stroke + 0.48 3.69 moveto + 0.37 3.77 lineto +closepath stroke + 0.57 3.59 moveto + 0.65 3.50 lineto +closepath stroke + 0.65 3.50 moveto + 0.58 3.42 lineto +closepath stroke + 0.58 3.42 moveto + 0.52 3.33 lineto +closepath stroke + 0.58 3.42 moveto + 0.62 3.26 lineto +closepath stroke + 0.27 3.88 moveto + 0.37 3.77 lineto +closepath stroke + 0.27 3.88 moveto + 0.14 3.88 lineto +closepath stroke + 0.27 3.88 moveto + 0.13 3.65 lineto +closepath stroke + 0.37 3.77 moveto + 0.37 3.57 lineto +closepath stroke + 0.37 3.57 moveto + 0.31 3.46 lineto +closepath stroke + 0.37 3.57 moveto + 0.41 3.38 lineto +closepath stroke + 0.14 3.88 moveto + 0.13 3.65 lineto +closepath stroke + 0.14 3.88 moveto + 0.00 4.00 lineto +closepath stroke + 0.13 3.65 moveto + 0.13 3.51 lineto +closepath stroke + 0.13 3.65 moveto + 0.00 3.51 lineto +closepath stroke + 7.93 1.38 moveto + 7.63 2.11 lineto +closepath stroke + 7.93 1.38 moveto + 7.36 0.73 lineto +closepath stroke + 7.63 2.11 moveto + 7.22 1.53 lineto +closepath stroke + 7.63 2.11 moveto + 7.29 2.18 lineto +closepath stroke + 0.90 3.11 moveto + 0.98 3.05 lineto +closepath stroke + 0.90 3.11 moveto + 0.86 3.03 lineto +closepath stroke + 0.90 3.11 moveto + 0.81 3.15 lineto +closepath stroke + 0.72 3.21 moveto + 0.81 3.15 lineto +closepath stroke + 0.72 3.21 moveto + 0.67 3.12 lineto +closepath stroke + 0.72 3.21 moveto + 0.62 3.26 lineto +closepath stroke + 0.81 3.15 moveto + 0.86 3.03 lineto +closepath stroke + 0.86 3.03 moveto + 0.74 3.00 lineto +closepath stroke + 0.86 3.03 moveto + 0.83 2.96 lineto +closepath stroke + 0.52 3.33 moveto + 0.62 3.26 lineto +closepath stroke + 0.52 3.33 moveto + 0.41 3.38 lineto +closepath stroke + 0.52 3.33 moveto + 0.46 3.21 lineto +closepath stroke + 0.62 3.26 moveto + 0.67 3.12 lineto +closepath stroke + 0.67 3.12 moveto + 0.64 3.04 lineto +closepath stroke + 0.67 3.12 moveto + 0.74 3.00 lineto +closepath stroke + 0.31 3.46 moveto + 0.41 3.38 lineto +closepath stroke + 0.31 3.46 moveto + 0.13 3.51 lineto +closepath stroke + 0.31 3.46 moveto + 0.17 3.32 lineto +closepath stroke + 0.41 3.38 moveto + 0.46 3.21 lineto +closepath stroke + 0.46 3.21 moveto + 0.31 3.14 lineto +closepath stroke + 0.46 3.21 moveto + 0.42 3.09 lineto +closepath stroke + 0.13 3.51 moveto + 0.17 3.32 lineto +closepath stroke + 0.13 3.51 moveto + 0.00 3.51 lineto +closepath stroke + 0.17 3.32 moveto + 0.13 3.19 lineto +closepath stroke + 0.17 3.32 moveto + 0.31 3.14 lineto +closepath stroke + 0.74 3.00 moveto + 0.83 2.96 lineto +closepath stroke + 0.74 3.00 moveto + 0.64 3.04 lineto +closepath stroke + 0.83 2.96 moveto + 0.82 2.90 lineto +closepath stroke + 0.83 2.96 moveto + 0.93 2.93 lineto +closepath stroke + 0.82 2.90 moveto + 0.93 2.93 lineto +closepath stroke + 0.82 2.90 moveto + 0.81 2.83 lineto +closepath stroke + 0.82 2.90 moveto + 0.91 2.81 lineto +closepath stroke + 0.64 3.04 moveto + 0.61 2.94 lineto +closepath stroke + 0.64 3.04 moveto + 0.54 3.06 lineto +closepath stroke + 0.61 2.94 moveto + 0.54 3.06 lineto +closepath stroke + 0.61 2.94 moveto + 0.60 2.86 lineto +closepath stroke + 0.61 2.94 moveto + 0.71 2.83 lineto +closepath stroke + 0.54 3.06 moveto + 0.38 2.99 lineto +closepath stroke + 0.54 3.06 moveto + 0.42 3.09 lineto +closepath stroke + 0.13 3.19 moveto + 0.31 3.14 lineto +closepath stroke + 0.13 3.19 moveto + 0.00 3.19 lineto +closepath stroke + 0.13 3.19 moveto + 0.13 3.01 lineto +closepath stroke + 0.31 3.14 moveto + 0.42 3.09 lineto +closepath stroke + 0.42 3.09 moveto + 0.38 2.99 lineto +closepath stroke + 0.38 2.99 moveto + 0.37 2.88 lineto +closepath stroke + 0.38 2.99 moveto + 0.49 2.86 lineto +closepath stroke + 0.00 3.19 moveto + 0.13 3.01 lineto +closepath stroke + 0.13 3.01 moveto + 0.13 2.88 lineto +closepath stroke + 0.13 3.01 moveto + 0.00 2.88 lineto +closepath stroke + 0.81 2.83 moveto + 0.91 2.81 lineto +closepath stroke + 0.81 2.83 moveto + 0.80 2.75 lineto +closepath stroke + 0.81 2.83 moveto + 0.71 2.83 lineto +closepath stroke + 0.60 2.86 moveto + 0.71 2.83 lineto +closepath stroke + 0.60 2.86 moveto + 0.59 2.75 lineto +closepath stroke + 0.60 2.86 moveto + 0.49 2.86 lineto +closepath stroke + 0.71 2.83 moveto + 0.80 2.75 lineto +closepath stroke + 0.80 2.75 moveto + 0.81 2.69 lineto +closepath stroke + 0.80 2.75 moveto + 0.91 2.69 lineto +closepath stroke + 0.37 2.88 moveto + 0.49 2.86 lineto +closepath stroke + 0.37 2.88 moveto + 0.13 2.88 lineto +closepath stroke + 0.37 2.88 moveto + 0.24 2.75 lineto +closepath stroke + 0.49 2.86 moveto + 0.59 2.75 lineto +closepath stroke + 0.59 2.75 moveto + 0.60 2.67 lineto +closepath stroke + 0.59 2.75 moveto + 0.71 2.67 lineto +closepath stroke + 0.13 2.88 moveto + 0.24 2.75 lineto +closepath stroke + 0.13 2.88 moveto + 0.00 2.88 lineto +closepath stroke + 0.24 2.75 moveto + 0.13 2.62 lineto +closepath stroke + 0.24 2.75 moveto + 0.37 2.62 lineto +closepath stroke + 7.36 0.73 moveto + 6.84 0.26 lineto +closepath stroke + 7.36 0.73 moveto + 7.04 0.99 lineto +closepath stroke + 7.22 1.53 moveto + 7.29 2.18 lineto +closepath stroke + 7.22 1.53 moveto + 7.04 0.99 lineto +closepath stroke + 7.22 1.53 moveto + 6.71 1.06 lineto +closepath stroke + 7.29 2.18 moveto + 6.94 2.18 lineto +closepath stroke + 7.04 0.99 moveto + 6.71 1.06 lineto +closepath stroke + 7.04 0.99 moveto + 6.84 0.26 lineto +closepath stroke + 6.71 1.06 moveto + 6.24 0.64 lineto +closepath stroke + 6.71 1.06 moveto + 6.42 1.19 lineto +closepath stroke + 0.81 2.69 moveto + 0.91 2.69 lineto +closepath stroke + 0.81 2.69 moveto + 0.82 2.60 lineto +closepath stroke + 0.81 2.69 moveto + 0.71 2.67 lineto +closepath stroke + 0.60 2.67 moveto + 0.71 2.67 lineto +closepath stroke + 0.60 2.67 moveto + 0.61 2.56 lineto +closepath stroke + 0.60 2.67 moveto + 0.49 2.64 lineto +closepath stroke + 0.71 2.67 moveto + 0.82 2.60 lineto +closepath stroke + 0.82 2.60 moveto + 0.83 2.54 lineto +closepath stroke + 0.82 2.60 moveto + 0.93 2.57 lineto +closepath stroke + 0.61 2.56 moveto + 0.49 2.64 lineto +closepath stroke + 0.61 2.56 moveto + 0.54 2.44 lineto +closepath stroke + 0.61 2.56 moveto + 0.64 2.46 lineto +closepath stroke + 0.49 2.64 moveto + 0.38 2.51 lineto +closepath stroke + 0.49 2.64 moveto + 0.37 2.62 lineto +closepath stroke + 0.13 2.62 moveto + 0.37 2.62 lineto +closepath stroke + 0.13 2.62 moveto + 0.00 2.62 lineto +closepath stroke + 0.13 2.62 moveto + 0.13 2.49 lineto +closepath stroke + 0.37 2.62 moveto + 0.38 2.51 lineto +closepath stroke + 0.38 2.51 moveto + 0.31 2.36 lineto +closepath stroke + 0.38 2.51 moveto + 0.42 2.39 lineto +closepath stroke + 0.00 2.62 moveto + 0.13 2.49 lineto +closepath stroke + 0.13 2.49 moveto + 0.00 2.31 lineto +closepath stroke + 0.13 2.49 moveto + 0.13 2.31 lineto +closepath stroke + 0.83 2.54 moveto + 0.93 2.57 lineto +closepath stroke + 0.83 2.54 moveto + 0.86 2.47 lineto +closepath stroke + 0.83 2.54 moveto + 0.74 2.50 lineto +closepath stroke + 0.86 2.47 moveto + 0.74 2.50 lineto +closepath stroke + 0.86 2.47 moveto + 0.89 2.41 lineto +closepath stroke + 0.86 2.47 moveto + 0.98 2.45 lineto +closepath stroke + 0.74 2.50 moveto + 0.67 2.38 lineto +closepath stroke + 0.74 2.50 moveto + 0.64 2.46 lineto +closepath stroke + 0.54 2.44 moveto + 0.64 2.46 lineto +closepath stroke + 0.54 2.44 moveto + 0.46 2.29 lineto +closepath stroke + 0.54 2.44 moveto + 0.42 2.39 lineto +closepath stroke + 0.64 2.46 moveto + 0.67 2.38 lineto +closepath stroke + 0.67 2.38 moveto + 0.71 2.31 lineto +closepath stroke + 0.67 2.38 moveto + 0.81 2.35 lineto +closepath stroke + 0.31 2.36 moveto + 0.42 2.39 lineto +closepath stroke + 0.31 2.36 moveto + 0.17 2.18 lineto +closepath stroke + 0.31 2.36 moveto + 0.13 2.31 lineto +closepath stroke + 0.42 2.39 moveto + 0.46 2.29 lineto +closepath stroke + 0.46 2.29 moveto + 0.51 2.19 lineto +closepath stroke + 0.46 2.29 moveto + 0.62 2.24 lineto +closepath stroke + 0.00 2.31 moveto + 0.13 2.31 lineto +closepath stroke + 0.13 2.31 moveto + 0.17 2.18 lineto +closepath stroke + 0.17 2.18 moveto + 0.13 1.99 lineto +closepath stroke + 0.17 2.18 moveto + 0.31 2.04 lineto +closepath stroke + 0.89 2.41 moveto + 0.98 2.45 lineto +closepath stroke + 0.89 2.41 moveto + 0.93 2.34 lineto +closepath stroke + 0.89 2.41 moveto + 0.81 2.35 lineto +closepath stroke + 0.71 2.31 moveto + 0.81 2.35 lineto +closepath stroke + 0.71 2.31 moveto + 0.76 2.22 lineto +closepath stroke + 0.71 2.31 moveto + 0.62 2.24 lineto +closepath stroke + 0.81 2.35 moveto + 0.93 2.34 lineto +closepath stroke + 0.93 2.34 moveto + 0.99 2.28 lineto +closepath stroke + 0.93 2.34 moveto + 0.91 2.22 lineto +closepath stroke + 0.51 2.19 moveto + 0.62 2.24 lineto +closepath stroke + 0.51 2.19 moveto + 0.58 2.08 lineto +closepath stroke + 0.51 2.19 moveto + 0.41 2.12 lineto +closepath stroke + 0.62 2.24 moveto + 0.76 2.22 lineto +closepath stroke + 0.76 2.22 moveto + 0.75 2.07 lineto +closepath stroke + 0.76 2.22 moveto + 0.84 2.14 lineto +closepath stroke + 0.58 2.08 moveto + 0.41 2.12 lineto +closepath stroke + 0.58 2.08 moveto + 0.57 1.91 lineto +closepath stroke + 0.58 2.08 moveto + 0.67 1.98 lineto +closepath stroke + 0.41 2.12 moveto + 0.37 1.93 lineto +closepath stroke + 0.41 2.12 moveto + 0.31 2.04 lineto +closepath stroke + 0.13 1.99 moveto + 0.31 2.04 lineto +closepath stroke + 0.13 1.99 moveto + 0.00 1.99 lineto +closepath stroke + 0.13 1.99 moveto + 0.13 1.85 lineto +closepath stroke + 0.31 2.04 moveto + 0.37 1.93 lineto +closepath stroke + 0.37 1.93 moveto + 0.37 1.73 lineto +closepath stroke + 0.37 1.93 moveto + 0.48 1.81 lineto +closepath stroke + 0.00 1.99 moveto + 0.13 1.85 lineto +closepath stroke + 0.13 1.85 moveto + 0.14 1.62 lineto +closepath stroke + 0.13 1.85 moveto + 0.27 1.62 lineto +closepath stroke + 6.84 0.26 moveto + 5.76 0.26 lineto +closepath stroke + 6.84 0.26 moveto + 6.07 0.00 lineto +closepath stroke + 6.58 1.67 moveto + 6.42 1.19 lineto +closepath stroke + 6.58 1.67 moveto + 6.11 1.25 lineto +closepath stroke + 6.58 1.67 moveto + 6.94 2.18 lineto +closepath stroke + 6.58 1.67 moveto + 6.64 2.24 lineto +closepath stroke + 6.42 1.19 moveto + 6.11 1.25 lineto +closepath stroke + 6.42 1.19 moveto + 6.24 0.64 lineto +closepath stroke + 6.11 1.25 moveto + 5.69 0.88 lineto +closepath stroke + 6.11 1.25 moveto + 5.85 1.37 lineto +closepath stroke + 6.24 0.64 moveto + 5.47 0.38 lineto +closepath stroke + 6.24 0.64 moveto + 5.76 0.26 lineto +closepath stroke + 0.99 2.28 moveto + 0.91 2.22 lineto +closepath stroke + 0.99 2.28 moveto + 1.06 2.35 lineto +closepath stroke + 0.99 2.28 moveto + 1.03 2.23 lineto +closepath stroke + 0.91 2.22 moveto + 0.89 2.07 lineto +closepath stroke + 0.91 2.22 moveto + 0.84 2.14 lineto +closepath stroke + 1.06 2.35 moveto + 1.03 2.23 lineto +closepath stroke + 1.03 2.23 moveto + 1.15 2.27 lineto +closepath stroke + 1.03 2.23 moveto + 1.08 2.19 lineto +closepath stroke + 0.75 2.07 moveto + 0.84 2.14 lineto +closepath stroke + 0.75 2.07 moveto + 0.74 1.90 lineto +closepath stroke + 0.75 2.07 moveto + 0.67 1.98 lineto +closepath stroke + 0.84 2.14 moveto + 0.89 2.07 lineto +closepath stroke + 0.89 2.07 moveto + 1.03 2.11 lineto +closepath stroke + 0.89 2.07 moveto + 0.96 2.02 lineto +closepath stroke + 0.57 1.91 moveto + 0.67 1.98 lineto +closepath stroke + 0.57 1.91 moveto + 0.57 1.71 lineto +closepath stroke + 0.57 1.91 moveto + 0.48 1.81 lineto +closepath stroke + 0.67 1.98 moveto + 0.74 1.90 lineto +closepath stroke + 0.74 1.90 moveto + 0.90 1.93 lineto +closepath stroke + 0.74 1.90 moveto + 0.82 1.84 lineto +closepath stroke + 0.37 1.73 moveto + 0.48 1.81 lineto +closepath stroke + 0.37 1.73 moveto + 0.38 1.51 lineto +closepath stroke + 0.37 1.73 moveto + 0.27 1.62 lineto +closepath stroke + 0.48 1.81 moveto + 0.57 1.71 lineto +closepath stroke + 0.57 1.71 moveto + 0.67 1.64 lineto +closepath stroke + 0.57 1.71 moveto + 0.76 1.73 lineto +closepath stroke + 0.14 1.62 moveto + 0.27 1.62 lineto +closepath stroke + 0.14 1.62 moveto + 0.00 1.50 lineto +closepath stroke + 0.14 1.62 moveto + 0.14 1.28 lineto +closepath stroke + 0.27 1.62 moveto + 0.38 1.51 lineto +closepath stroke + 0.38 1.51 moveto + 0.51 1.41 lineto +closepath stroke + 0.38 1.51 moveto + 0.61 1.52 lineto +closepath stroke + 0.00 1.50 moveto + 0.14 1.28 lineto +closepath stroke + 0.14 1.28 moveto + 0.21 1.03 lineto +closepath stroke + 0.14 1.28 moveto + 0.35 1.15 lineto +closepath stroke + 6.94 2.18 moveto + 6.64 2.24 lineto +closepath stroke + 6.64 2.24 moveto + 6.32 2.24 lineto +closepath stroke + 1.15 2.27 moveto + 1.08 2.19 lineto +closepath stroke + 1.08 2.19 moveto + 1.15 2.14 lineto +closepath stroke + 1.08 2.19 moveto + 1.03 2.11 lineto +closepath stroke + 1.03 2.11 moveto + 0.96 2.02 lineto +closepath stroke + 1.03 2.11 moveto + 1.15 2.14 lineto +closepath stroke + 0.96 2.02 moveto + 1.05 1.96 lineto +closepath stroke + 0.96 2.02 moveto + 0.90 1.93 lineto +closepath stroke + 1.15 2.14 moveto + 1.26 2.20 lineto +closepath stroke + 1.15 2.14 moveto + 1.21 2.12 lineto +closepath stroke + 0.90 1.93 moveto + 0.82 1.84 lineto +closepath stroke + 0.90 1.93 moveto + 1.05 1.96 lineto +closepath stroke + 0.82 1.84 moveto + 0.93 1.76 lineto +closepath stroke + 0.82 1.84 moveto + 0.76 1.73 lineto +closepath stroke + 1.05 1.96 moveto + 1.18 2.02 lineto +closepath stroke + 1.05 1.96 moveto + 1.12 1.93 lineto +closepath stroke + 0.67 1.64 moveto + 0.76 1.73 lineto +closepath stroke + 0.67 1.64 moveto + 0.80 1.54 lineto +closepath stroke + 0.67 1.64 moveto + 0.61 1.52 lineto +closepath stroke + 0.76 1.73 moveto + 0.93 1.76 lineto +closepath stroke + 0.93 1.76 moveto + 1.09 1.82 lineto +closepath stroke + 0.93 1.76 moveto + 1.03 1.72 lineto +closepath stroke + 0.51 1.41 moveto + 0.61 1.52 lineto +closepath stroke + 0.51 1.41 moveto + 0.66 1.30 lineto +closepath stroke + 0.51 1.41 moveto + 0.44 1.28 lineto +closepath stroke + 0.61 1.52 moveto + 0.80 1.54 lineto +closepath stroke + 0.80 1.54 moveto + 0.99 1.60 lineto +closepath stroke + 0.80 1.54 moveto + 0.92 1.49 lineto +closepath stroke + 0.66 1.30 moveto + 0.44 1.28 lineto +closepath stroke + 0.66 1.30 moveto + 0.88 1.36 lineto +closepath stroke + 0.66 1.30 moveto + 0.81 1.23 lineto +closepath stroke + 0.44 1.28 moveto + 0.51 1.03 lineto +closepath stroke + 0.44 1.28 moveto + 0.35 1.15 lineto +closepath stroke + 0.21 1.03 moveto + 0.35 1.15 lineto +closepath stroke + 0.21 1.03 moveto + 0.00 0.87 lineto +closepath stroke + 0.21 1.03 moveto + 0.21 0.74 lineto +closepath stroke + 0.35 1.15 moveto + 0.51 1.03 lineto +closepath stroke + 0.51 1.03 moveto + 0.76 1.10 lineto +closepath stroke + 0.51 1.03 moveto + 0.68 0.96 lineto +closepath stroke + 0.00 0.87 moveto + 0.21 0.74 lineto +closepath stroke + 0.21 0.74 moveto + 0.13 0.59 lineto +closepath stroke + 0.21 0.74 moveto + 0.34 0.74 lineto +closepath stroke + 0.13 0.59 moveto + 0.34 0.74 lineto +closepath stroke + 0.13 0.59 moveto + 0.00 0.29 lineto +closepath stroke + 0.13 0.59 moveto + 0.13 0.29 lineto +closepath stroke + 0.34 0.74 moveto + 0.63 0.80 lineto +closepath stroke + 0.34 0.74 moveto + 0.54 0.65 lineto +closepath stroke + 0.00 0.29 moveto + 0.13 0.29 lineto +closepath stroke + 0.13 0.29 moveto + 0.49 0.48 lineto +closepath stroke + 0.13 0.29 moveto + 0.36 0.19 lineto +closepath stroke + 1.26 2.20 moveto + 1.21 2.12 lineto +closepath stroke + 1.21 2.12 moveto + 1.28 2.08 lineto +closepath stroke + 1.21 2.12 moveto + 1.18 2.02 lineto +closepath stroke + 1.18 2.02 moveto + 1.12 1.93 lineto +closepath stroke + 1.18 2.02 moveto + 1.28 2.08 lineto +closepath stroke + 1.12 1.93 moveto + 1.22 1.88 lineto +closepath stroke + 1.12 1.93 moveto + 1.09 1.82 lineto +closepath stroke + 1.28 2.08 moveto + 1.37 2.07 lineto +closepath stroke + 1.28 2.08 moveto + 1.33 1.97 lineto +closepath stroke + 1.09 1.82 moveto + 1.03 1.72 lineto +closepath stroke + 1.09 1.82 moveto + 1.22 1.88 lineto +closepath stroke + 1.03 1.72 moveto + 1.15 1.66 lineto +closepath stroke + 1.03 1.72 moveto + 0.99 1.60 lineto +closepath stroke + 1.22 1.88 moveto + 1.32 1.86 lineto +closepath stroke + 1.22 1.88 moveto + 1.29 1.76 lineto +closepath stroke + 0.99 1.60 moveto + 0.92 1.49 lineto +closepath stroke + 0.99 1.60 moveto + 1.15 1.66 lineto +closepath stroke + 0.92 1.49 moveto + 1.07 1.42 lineto +closepath stroke + 0.92 1.49 moveto + 0.88 1.36 lineto +closepath stroke + 1.15 1.66 moveto + 1.28 1.64 lineto +closepath stroke + 1.15 1.66 moveto + 1.24 1.52 lineto +closepath stroke + 0.88 1.36 moveto + 0.81 1.23 lineto +closepath stroke + 0.88 1.36 moveto + 1.07 1.42 lineto +closepath stroke + 0.81 1.23 moveto + 0.98 1.16 lineto +closepath stroke + 0.81 1.23 moveto + 0.76 1.10 lineto +closepath stroke + 1.07 1.42 moveto + 1.23 1.39 lineto +closepath stroke + 1.07 1.42 moveto + 1.18 1.26 lineto +closepath stroke + 0.76 1.10 moveto + 0.68 0.96 lineto +closepath stroke + 0.76 1.10 moveto + 0.98 1.16 lineto +closepath stroke + 0.68 0.96 moveto + 0.89 0.86 lineto +closepath stroke + 0.68 0.96 moveto + 0.63 0.80 lineto +closepath stroke + 0.98 1.16 moveto + 1.17 1.12 lineto +closepath stroke + 0.98 1.16 moveto + 1.12 0.98 lineto +closepath stroke + 0.63 0.80 moveto + 0.54 0.65 lineto +closepath stroke + 0.63 0.80 moveto + 0.89 0.86 lineto +closepath stroke + 0.54 0.65 moveto + 0.49 0.48 lineto +closepath stroke + 0.54 0.65 moveto + 0.78 0.54 lineto +closepath stroke + 0.89 0.86 moveto + 1.11 0.82 lineto +closepath stroke + 0.89 0.86 moveto + 1.06 0.67 lineto +closepath stroke + 0.49 0.48 moveto + 0.78 0.54 lineto +closepath stroke + 0.49 0.48 moveto + 0.36 0.19 lineto +closepath stroke + 0.78 0.54 moveto + 1.06 0.67 lineto +closepath stroke + 0.78 0.54 moveto + 1.00 0.50 lineto +closepath stroke + 0.36 0.19 moveto + 0.73 0.19 lineto +closepath stroke + 0.36 0.19 moveto + 0.36 0.00 lineto +closepath stroke + 0.73 0.19 moveto + 0.36 0.00 lineto +closepath stroke + 0.73 0.19 moveto + 0.98 0.00 lineto +closepath stroke + 0.73 0.19 moveto + 0.98 0.19 lineto +closepath stroke + 5.99 1.80 moveto + 5.85 1.37 lineto +closepath stroke + 5.99 1.80 moveto + 5.57 1.43 lineto +closepath stroke + 5.99 1.80 moveto + 6.32 2.24 lineto +closepath stroke + 5.99 1.80 moveto + 6.04 2.30 lineto +closepath stroke + 5.85 1.37 moveto + 5.57 1.43 lineto +closepath stroke + 5.85 1.37 moveto + 5.69 0.88 lineto +closepath stroke + 5.57 1.43 moveto + 5.20 1.10 lineto +closepath stroke + 5.57 1.43 moveto + 5.34 1.53 lineto +closepath stroke + 1.37 2.07 moveto + 1.33 1.97 lineto +closepath stroke + 1.37 2.07 moveto + 1.38 2.17 lineto +closepath stroke + 1.37 2.07 moveto + 1.43 2.05 lineto +closepath stroke + 1.33 1.97 moveto + 1.40 1.84 lineto +closepath stroke + 1.33 1.97 moveto + 1.32 1.86 lineto +closepath stroke + 1.38 2.17 moveto + 1.43 2.05 lineto +closepath stroke + 1.43 2.05 moveto + 1.50 2.15 lineto +closepath stroke + 1.43 2.05 moveto + 1.49 2.05 lineto +closepath stroke + 1.32 1.86 moveto + 1.29 1.76 lineto +closepath stroke + 1.32 1.86 moveto + 1.40 1.84 lineto +closepath stroke + 1.29 1.76 moveto + 1.38 1.62 lineto +closepath stroke + 1.29 1.76 moveto + 1.28 1.64 lineto +closepath stroke + 1.40 1.84 moveto + 1.50 1.95 lineto +closepath stroke + 1.40 1.84 moveto + 1.49 1.84 lineto +closepath stroke + 1.28 1.64 moveto + 1.24 1.52 lineto +closepath stroke + 1.28 1.64 moveto + 1.38 1.62 lineto +closepath stroke + 1.24 1.52 moveto + 1.35 1.36 lineto +closepath stroke + 1.24 1.52 moveto + 1.23 1.39 lineto +closepath stroke + 1.38 1.62 moveto + 1.50 1.74 lineto +closepath stroke + 1.38 1.62 moveto + 1.49 1.62 lineto +closepath stroke + 1.23 1.39 moveto + 1.18 1.26 lineto +closepath stroke + 1.23 1.39 moveto + 1.35 1.36 lineto +closepath stroke + 1.18 1.26 moveto + 1.32 1.08 lineto +closepath stroke + 1.18 1.26 moveto + 1.17 1.12 lineto +closepath stroke + 1.35 1.36 moveto + 1.50 1.49 lineto +closepath stroke + 1.35 1.36 moveto + 1.49 1.36 lineto +closepath stroke + 1.17 1.12 moveto + 1.12 0.98 lineto +closepath stroke + 1.17 1.12 moveto + 1.32 1.08 lineto +closepath stroke + 1.12 0.98 moveto + 1.29 0.78 lineto +closepath stroke + 1.12 0.98 moveto + 1.11 0.82 lineto +closepath stroke + 1.32 1.08 moveto + 1.50 1.23 lineto +closepath stroke + 1.32 1.08 moveto + 1.48 1.08 lineto +closepath stroke + 1.06 0.67 moveto + 1.00 0.50 lineto +closepath stroke + 1.06 0.67 moveto + 1.11 0.82 lineto +closepath stroke + 1.00 0.50 moveto + 1.26 0.31 lineto +closepath stroke + 1.00 0.50 moveto + 0.98 0.19 lineto +closepath stroke + 1.11 0.82 moveto + 1.29 0.78 lineto +closepath stroke + 1.29 0.78 moveto + 1.52 0.78 lineto +closepath stroke + 1.29 0.78 moveto + 1.50 0.62 lineto +closepath stroke + 0.98 0.00 moveto + 0.98 0.19 lineto +closepath stroke + 0.98 0.19 moveto + 1.26 0.31 lineto +closepath stroke + 1.26 0.31 moveto + 1.50 0.62 lineto +closepath stroke + 1.26 0.31 moveto + 1.48 0.31 lineto +closepath stroke + 1.50 2.15 moveto + 1.49 2.05 lineto +closepath stroke + 1.49 2.05 moveto + 1.57 2.05 lineto +closepath stroke + 1.49 2.05 moveto + 1.50 1.95 lineto +closepath stroke + 1.50 1.95 moveto + 1.49 1.84 lineto +closepath stroke + 1.50 1.95 moveto + 1.57 2.05 lineto +closepath stroke + 1.49 1.84 moveto + 1.60 1.84 lineto +closepath stroke + 1.49 1.84 moveto + 1.50 1.74 lineto +closepath stroke + 1.57 2.05 moveto + 1.62 2.17 lineto +closepath stroke + 1.57 2.05 moveto + 1.63 2.07 lineto +closepath stroke + 1.50 1.74 moveto + 1.49 1.62 lineto +closepath stroke + 1.50 1.74 moveto + 1.60 1.84 lineto +closepath stroke + 1.49 1.62 moveto + 1.62 1.62 lineto +closepath stroke + 1.49 1.62 moveto + 1.50 1.49 lineto +closepath stroke + 1.60 1.84 moveto + 1.67 1.97 lineto +closepath stroke + 1.60 1.84 moveto + 1.68 1.86 lineto +closepath stroke + 1.50 1.49 moveto + 1.49 1.36 lineto +closepath stroke + 1.50 1.49 moveto + 1.62 1.62 lineto +closepath stroke + 1.49 1.36 moveto + 1.65 1.36 lineto +closepath stroke + 1.49 1.36 moveto + 1.50 1.23 lineto +closepath stroke + 1.62 1.62 moveto + 1.71 1.76 lineto +closepath stroke + 1.62 1.62 moveto + 1.72 1.64 lineto +closepath stroke + 1.50 1.23 moveto + 1.48 1.08 lineto +closepath stroke + 1.50 1.23 moveto + 1.65 1.36 lineto +closepath stroke + 1.48 1.08 moveto + 1.68 1.08 lineto +closepath stroke + 1.48 1.08 moveto + 1.50 0.94 lineto +closepath stroke + 1.65 1.36 moveto + 1.76 1.52 lineto +closepath stroke + 1.65 1.36 moveto + 1.77 1.39 lineto +closepath stroke + 1.68 1.08 moveto + 1.50 0.94 lineto +closepath stroke + 1.68 1.08 moveto + 1.82 1.26 lineto +closepath stroke + 1.68 1.08 moveto + 1.83 1.12 lineto +closepath stroke + 1.50 0.94 moveto + 1.71 0.78 lineto +closepath stroke + 1.50 0.94 moveto + 1.52 0.78 lineto +closepath stroke + 1.52 0.78 moveto + 1.50 0.62 lineto +closepath stroke + 1.52 0.78 moveto + 1.71 0.78 lineto +closepath stroke + 1.50 0.62 moveto + 1.48 0.31 lineto +closepath stroke + 1.71 0.78 moveto + 1.88 0.98 lineto +closepath stroke + 1.71 0.78 moveto + 1.89 0.82 lineto +closepath stroke + 1.48 0.31 moveto + 1.74 0.31 lineto +closepath stroke + 1.48 0.31 moveto + 1.50 0.00 lineto +closepath stroke + 1.74 0.31 moveto + 1.50 0.00 lineto +closepath stroke + 1.74 0.31 moveto + 2.00 0.50 lineto +closepath stroke + 1.74 0.31 moveto + 2.02 0.19 lineto +closepath stroke + 1.62 2.17 moveto + 1.63 2.07 lineto +closepath stroke + 1.63 2.07 moveto + 1.72 2.08 lineto +closepath stroke + 1.63 2.07 moveto + 1.67 1.97 lineto +closepath stroke + 1.67 1.97 moveto + 1.68 1.86 lineto +closepath stroke + 1.67 1.97 moveto + 1.72 2.08 lineto +closepath stroke + 1.68 1.86 moveto + 1.78 1.88 lineto +closepath stroke + 1.68 1.86 moveto + 1.71 1.76 lineto +closepath stroke + 1.72 2.08 moveto + 1.79 2.12 lineto +closepath stroke + 1.72 2.08 moveto + 1.82 2.02 lineto +closepath stroke + 1.71 1.76 moveto + 1.72 1.64 lineto +closepath stroke + 1.71 1.76 moveto + 1.78 1.88 lineto +closepath stroke + 1.72 1.64 moveto + 1.85 1.66 lineto +closepath stroke + 1.72 1.64 moveto + 1.76 1.52 lineto +closepath stroke + 1.78 1.88 moveto + 1.88 1.93 lineto +closepath stroke + 1.78 1.88 moveto + 1.91 1.82 lineto +closepath stroke + 1.76 1.52 moveto + 1.77 1.39 lineto +closepath stroke + 1.76 1.52 moveto + 1.85 1.66 lineto +closepath stroke + 1.77 1.39 moveto + 1.93 1.42 lineto +closepath stroke + 1.77 1.39 moveto + 1.82 1.26 lineto +closepath stroke + 1.85 1.66 moveto + 1.97 1.72 lineto +closepath stroke + 1.85 1.66 moveto + 2.01 1.60 lineto +closepath stroke + 1.82 1.26 moveto + 1.83 1.12 lineto +closepath stroke + 1.82 1.26 moveto + 1.93 1.42 lineto +closepath stroke + 1.83 1.12 moveto + 2.02 1.16 lineto +closepath stroke + 1.83 1.12 moveto + 1.88 0.98 lineto +closepath stroke + 1.93 1.42 moveto + 2.08 1.49 lineto +closepath stroke + 1.93 1.42 moveto + 2.12 1.36 lineto +closepath stroke + 1.88 0.98 moveto + 1.89 0.82 lineto +closepath stroke + 1.88 0.98 moveto + 2.02 1.16 lineto +closepath stroke + 1.89 0.82 moveto + 2.11 0.86 lineto +closepath stroke + 1.89 0.82 moveto + 1.94 0.67 lineto +closepath stroke + 2.02 1.16 moveto + 2.19 1.23 lineto +closepath stroke + 2.02 1.16 moveto + 2.24 1.10 lineto +closepath stroke + 2.11 0.86 moveto + 1.94 0.67 lineto +closepath stroke + 2.11 0.86 moveto + 2.32 0.96 lineto +closepath stroke + 2.11 0.86 moveto + 2.37 0.80 lineto +closepath stroke + 1.94 0.67 moveto + 2.22 0.54 lineto +closepath stroke + 1.94 0.67 moveto + 2.00 0.50 lineto +closepath stroke + 2.00 0.50 moveto + 2.02 0.19 lineto +closepath stroke + 2.00 0.50 moveto + 2.22 0.54 lineto +closepath stroke + 2.02 0.19 moveto + 2.27 0.19 lineto +closepath stroke + 2.02 0.19 moveto + 2.02 0.00 lineto +closepath stroke + 2.22 0.54 moveto + 2.46 0.65 lineto +closepath stroke + 2.22 0.54 moveto + 2.51 0.48 lineto +closepath stroke + 2.27 0.19 moveto + 2.02 0.00 lineto +closepath stroke + 2.27 0.19 moveto + 2.61 0.19 lineto +closepath stroke + 2.27 0.19 moveto + 2.61 0.00 lineto +closepath stroke + 5.69 0.88 moveto + 5.21 0.50 lineto +closepath stroke + 5.69 0.88 moveto + 5.47 0.38 lineto +closepath stroke + 6.32 2.24 moveto + 6.04 2.30 lineto +closepath stroke + 1.79 2.12 moveto + 1.82 2.02 lineto +closepath stroke + 1.79 2.12 moveto + 1.74 2.20 lineto +closepath stroke + 1.79 2.12 moveto + 1.85 2.14 lineto +closepath stroke + 1.82 2.02 moveto + 1.96 1.96 lineto +closepath stroke + 1.82 2.02 moveto + 1.88 1.93 lineto +closepath stroke + 1.74 2.20 moveto + 1.85 2.14 lineto +closepath stroke + 1.85 2.14 moveto + 1.92 2.19 lineto +closepath stroke + 1.85 2.14 moveto + 1.97 2.11 lineto +closepath stroke + 1.88 1.93 moveto + 1.91 1.82 lineto +closepath stroke + 1.88 1.93 moveto + 1.96 1.96 lineto +closepath stroke + 1.91 1.82 moveto + 2.07 1.76 lineto +closepath stroke + 1.91 1.82 moveto + 1.97 1.72 lineto +closepath stroke + 1.96 1.96 moveto + 1.97 2.11 lineto +closepath stroke + 1.96 1.96 moveto + 2.02 2.01 lineto +closepath stroke + 1.97 1.72 moveto + 2.01 1.60 lineto +closepath stroke + 1.97 1.72 moveto + 2.07 1.76 lineto +closepath stroke + 2.01 1.60 moveto + 2.20 1.54 lineto +closepath stroke + 2.01 1.60 moveto + 2.08 1.49 lineto +closepath stroke + 2.07 1.76 moveto + 2.10 1.93 lineto +closepath stroke + 2.07 1.76 moveto + 2.16 1.82 lineto +closepath stroke + 2.08 1.49 moveto + 2.12 1.36 lineto +closepath stroke + 2.08 1.49 moveto + 2.20 1.54 lineto +closepath stroke + 2.12 1.36 moveto + 2.34 1.30 lineto +closepath stroke + 2.12 1.36 moveto + 2.19 1.23 lineto +closepath stroke + 2.20 1.54 moveto + 2.24 1.73 lineto +closepath stroke + 2.20 1.54 moveto + 2.30 1.62 lineto +closepath stroke + 2.19 1.23 moveto + 2.24 1.10 lineto +closepath stroke + 2.19 1.23 moveto + 2.34 1.30 lineto +closepath stroke + 2.24 1.10 moveto + 2.49 1.03 lineto +closepath stroke + 2.24 1.10 moveto + 2.32 0.96 lineto +closepath stroke + 2.34 1.30 moveto + 2.39 1.52 lineto +closepath stroke + 2.34 1.30 moveto + 2.47 1.39 lineto +closepath stroke + 2.32 0.96 moveto + 2.37 0.80 lineto +closepath stroke + 2.32 0.96 moveto + 2.49 1.03 lineto +closepath stroke + 2.37 0.80 moveto + 2.66 0.74 lineto +closepath stroke + 2.37 0.80 moveto + 2.46 0.65 lineto +closepath stroke + 2.49 1.03 moveto + 2.56 1.28 lineto +closepath stroke + 2.49 1.03 moveto + 2.65 1.15 lineto +closepath stroke + 2.46 0.65 moveto + 2.51 0.48 lineto +closepath stroke + 2.46 0.65 moveto + 2.66 0.74 lineto +closepath stroke + 2.51 0.48 moveto + 2.85 0.29 lineto +closepath stroke + 2.51 0.48 moveto + 2.61 0.19 lineto +closepath stroke + 2.66 0.74 moveto + 2.75 1.03 lineto +closepath stroke + 2.66 0.74 moveto + 2.84 0.87 lineto +closepath stroke + 2.61 0.19 moveto + 2.61 0.00 lineto +closepath stroke + 2.61 0.19 moveto + 2.85 0.29 lineto +closepath stroke + 2.85 0.29 moveto + 3.09 0.60 lineto +closepath stroke + 2.85 0.29 moveto + 3.19 0.30 lineto +closepath stroke + 6.04 2.30 moveto + 5.76 2.30 lineto +closepath stroke + 5.46 1.91 moveto + 5.34 1.53 lineto +closepath stroke + 5.46 1.91 moveto + 5.08 1.59 lineto +closepath stroke + 5.46 1.91 moveto + 5.50 2.30 lineto +closepath stroke + 5.46 1.91 moveto + 5.25 2.36 lineto +closepath stroke + 5.34 1.53 moveto + 5.08 1.59 lineto +closepath stroke + 5.34 1.53 moveto + 5.20 1.10 lineto +closepath stroke + 5.08 1.59 moveto + 4.74 1.31 lineto +closepath stroke + 5.08 1.59 moveto + 4.87 1.68 lineto +closepath stroke + 5.20 1.10 moveto + 5.00 0.76 lineto +closepath stroke + 5.20 1.10 moveto + 4.76 0.87 lineto +closepath stroke + 5.76 2.30 moveto + 5.50 2.30 lineto +closepath stroke + 5.50 2.30 moveto + 5.25 2.36 lineto +closepath stroke + 1.92 2.19 moveto + 1.97 2.11 lineto +closepath stroke + 1.92 2.19 moveto + 1.85 2.27 lineto +closepath stroke + 1.92 2.19 moveto + 1.97 2.23 lineto +closepath stroke + 1.97 2.11 moveto + 2.02 2.01 lineto +closepath stroke + 1.85 2.27 moveto + 1.97 2.23 lineto +closepath stroke + 1.97 2.23 moveto + 1.94 2.35 lineto +closepath stroke + 1.97 2.23 moveto + 2.01 2.28 lineto +closepath stroke + 2.02 2.01 moveto + 2.11 2.07 lineto +closepath stroke + 2.02 2.01 moveto + 2.10 1.93 lineto +closepath stroke + 2.10 1.93 moveto + 2.16 1.82 lineto +closepath stroke + 2.10 1.93 moveto + 2.11 2.07 lineto +closepath stroke + 2.16 1.82 moveto + 2.26 1.90 lineto +closepath stroke + 2.16 1.82 moveto + 2.24 1.73 lineto +closepath stroke + 2.11 2.07 moveto + 2.09 2.22 lineto +closepath stroke + 2.11 2.07 moveto + 2.16 2.14 lineto +closepath stroke + 2.24 1.73 moveto + 2.30 1.62 lineto +closepath stroke + 2.24 1.73 moveto + 2.26 1.90 lineto +closepath stroke + 2.30 1.62 moveto + 2.43 1.71 lineto +closepath stroke + 2.30 1.62 moveto + 2.39 1.52 lineto +closepath stroke + 2.26 1.90 moveto + 2.35 2.00 lineto +closepath stroke + 2.26 1.90 moveto + 2.43 1.91 lineto +closepath stroke + 2.39 1.52 moveto + 2.47 1.39 lineto +closepath stroke + 2.39 1.52 moveto + 2.43 1.71 lineto +closepath stroke + 2.47 1.39 moveto + 2.62 1.51 lineto +closepath stroke + 2.47 1.39 moveto + 2.56 1.28 lineto +closepath stroke + 2.43 1.71 moveto + 2.43 1.91 lineto +closepath stroke + 2.43 1.71 moveto + 2.52 1.81 lineto +closepath stroke + 2.56 1.28 moveto + 2.65 1.15 lineto +closepath stroke + 2.56 1.28 moveto + 2.62 1.51 lineto +closepath stroke + 2.65 1.15 moveto + 2.83 1.28 lineto +closepath stroke + 2.65 1.15 moveto + 2.75 1.03 lineto +closepath stroke + 2.62 1.51 moveto + 2.63 1.73 lineto +closepath stroke + 2.62 1.51 moveto + 2.73 1.62 lineto +closepath stroke + 2.75 1.03 moveto + 2.84 0.87 lineto +closepath stroke + 2.75 1.03 moveto + 2.83 1.28 lineto +closepath stroke + 2.84 0.87 moveto + 3.05 1.03 lineto +closepath stroke + 2.84 0.87 moveto + 2.96 0.74 lineto +closepath stroke + 2.83 1.28 moveto + 2.85 1.54 lineto +closepath stroke + 2.83 1.28 moveto + 2.95 1.42 lineto +closepath stroke + 3.05 1.03 moveto + 2.96 0.74 lineto +closepath stroke + 3.05 1.03 moveto + 3.08 1.32 lineto +closepath stroke + 3.05 1.03 moveto + 3.20 1.19 lineto +closepath stroke + 2.96 0.74 moveto + 3.30 0.75 lineto +closepath stroke + 2.96 0.74 moveto + 3.09 0.60 lineto +closepath stroke + 3.09 0.60 moveto + 3.19 0.30 lineto +closepath stroke + 3.09 0.60 moveto + 3.30 0.75 lineto +closepath stroke + 3.19 0.30 moveto + 3.58 0.30 lineto +closepath stroke + 3.19 0.30 moveto + 3.33 0.00 lineto +closepath stroke + 3.30 0.75 moveto + 3.35 1.09 lineto +closepath stroke + 3.30 0.75 moveto + 3.48 0.94 lineto +closepath stroke + 3.58 0.30 moveto + 3.33 0.00 lineto +closepath stroke + 3.58 0.30 moveto + 3.95 0.40 lineto +closepath stroke + 3.58 0.30 moveto + 3.81 0.70 lineto +closepath stroke + 1.94 2.35 moveto + 2.01 2.28 lineto +closepath stroke + 2.01 2.28 moveto + 2.07 2.34 lineto +closepath stroke + 2.01 2.28 moveto + 2.09 2.22 lineto +closepath stroke + 2.09 2.22 moveto + 2.16 2.14 lineto +closepath stroke + 2.09 2.22 moveto + 2.07 2.34 lineto +closepath stroke + 2.16 2.14 moveto + 2.24 2.22 lineto +closepath stroke + 2.16 2.14 moveto + 2.25 2.07 lineto +closepath stroke + 2.07 2.34 moveto + 2.02 2.45 lineto +closepath stroke + 2.07 2.34 moveto + 2.10 2.39 lineto +closepath stroke + 2.24 2.22 moveto + 2.25 2.07 lineto +closepath stroke + 2.24 2.22 moveto + 2.19 2.35 lineto +closepath stroke + 2.24 2.22 moveto + 2.28 2.29 lineto +closepath stroke + 2.25 2.07 moveto + 2.42 2.08 lineto +closepath stroke + 2.25 2.07 moveto + 2.35 2.00 lineto +closepath stroke + 2.43 1.91 moveto + 2.52 1.81 lineto +closepath stroke + 2.43 1.91 moveto + 2.35 2.00 lineto +closepath stroke + 2.52 1.81 moveto + 2.63 1.93 lineto +closepath stroke + 2.52 1.81 moveto + 2.63 1.73 lineto +closepath stroke + 2.35 2.00 moveto + 2.42 2.08 lineto +closepath stroke + 2.42 2.08 moveto + 2.38 2.24 lineto +closepath stroke + 2.42 2.08 moveto + 2.48 2.17 lineto +closepath stroke + 2.63 1.73 moveto + 2.73 1.62 lineto +closepath stroke + 2.63 1.73 moveto + 2.63 1.93 lineto +closepath stroke + 2.73 1.62 moveto + 2.85 1.77 lineto +closepath stroke + 2.73 1.62 moveto + 2.85 1.54 lineto +closepath stroke + 2.63 1.93 moveto + 2.71 2.07 lineto +closepath stroke + 2.63 1.93 moveto + 2.82 1.99 lineto +closepath stroke + 2.85 1.54 moveto + 2.95 1.42 lineto +closepath stroke + 2.85 1.54 moveto + 2.85 1.77 lineto +closepath stroke + 2.95 1.42 moveto + 3.10 1.58 lineto +closepath stroke + 2.95 1.42 moveto + 3.08 1.32 lineto +closepath stroke + 2.85 1.77 moveto + 2.95 1.93 lineto +closepath stroke + 2.85 1.77 moveto + 3.07 1.84 lineto +closepath stroke + 3.08 1.32 moveto + 3.20 1.19 lineto +closepath stroke + 3.08 1.32 moveto + 3.10 1.58 lineto +closepath stroke + 3.20 1.19 moveto + 3.38 1.39 lineto +closepath stroke + 3.20 1.19 moveto + 3.35 1.09 lineto +closepath stroke + 3.10 1.58 moveto + 3.22 1.78 lineto +closepath stroke + 3.10 1.58 moveto + 3.35 1.68 lineto +closepath stroke + 3.35 1.09 moveto + 3.48 0.94 lineto +closepath stroke + 3.35 1.09 moveto + 3.38 1.39 lineto +closepath stroke + 3.48 0.94 moveto + 3.68 1.17 lineto +closepath stroke + 3.48 0.94 moveto + 3.63 0.83 lineto +closepath stroke + 3.38 1.39 moveto + 3.51 1.61 lineto +closepath stroke + 3.38 1.39 moveto + 3.65 1.51 lineto +closepath stroke + 3.68 1.17 moveto + 3.63 0.83 lineto +closepath stroke + 3.68 1.17 moveto + 3.83 1.43 lineto +closepath stroke + 3.68 1.17 moveto + 3.99 1.31 lineto +closepath stroke + 3.63 0.83 moveto + 4.01 0.93 lineto +closepath stroke + 3.63 0.83 moveto + 3.81 0.70 lineto +closepath stroke + 3.95 0.40 moveto + 3.81 0.70 lineto +closepath stroke + 3.95 0.40 moveto + 4.37 0.66 lineto +closepath stroke + 3.95 0.40 moveto + 4.14 0.26 lineto +closepath stroke + 3.81 0.70 moveto + 4.01 0.93 lineto +closepath stroke + 4.01 0.93 moveto + 4.18 1.23 lineto +closepath stroke + 4.01 0.93 moveto + 4.36 1.10 lineto +closepath stroke + 4.37 0.66 moveto + 4.14 0.26 lineto +closepath stroke + 4.37 0.66 moveto + 4.76 0.87 lineto +closepath stroke + 4.37 0.66 moveto + 4.57 1.01 lineto +closepath stroke + 4.14 0.26 moveto + 4.77 0.26 lineto +closepath stroke + 4.14 0.26 moveto + 4.35 0.00 lineto +closepath stroke + 4.77 0.26 moveto + 4.35 0.00 lineto +closepath stroke + 4.77 0.26 moveto + 5.21 0.50 lineto +closepath stroke + 4.77 0.26 moveto + 5.00 0.76 lineto +closepath stroke + 5.25 2.36 moveto + 5.01 2.36 lineto +closepath stroke + 4.97 2.01 moveto + 4.87 1.68 lineto +closepath stroke + 4.97 2.01 moveto + 4.64 1.73 lineto +closepath stroke + 4.97 2.01 moveto + 4.78 2.41 lineto +closepath stroke + 4.97 2.01 moveto + 5.01 2.36 lineto +closepath stroke + 4.87 1.68 moveto + 4.64 1.73 lineto +closepath stroke + 4.87 1.68 moveto + 4.74 1.31 lineto +closepath stroke + 4.64 1.73 moveto + 4.44 1.82 lineto +closepath stroke + 4.64 1.73 moveto + 4.33 1.49 lineto +closepath stroke + 2.02 2.45 moveto + 2.10 2.39 lineto +closepath stroke + 2.10 2.39 moveto + 2.14 2.47 lineto +closepath stroke + 2.10 2.39 moveto + 2.19 2.35 lineto +closepath stroke + 2.19 2.35 moveto + 2.28 2.29 lineto +closepath stroke + 2.19 2.35 moveto + 2.14 2.47 lineto +closepath stroke + 2.28 2.29 moveto + 2.33 2.38 lineto +closepath stroke + 2.28 2.29 moveto + 2.38 2.24 lineto +closepath stroke + 2.14 2.47 moveto + 2.07 2.57 lineto +closepath stroke + 2.14 2.47 moveto + 2.16 2.52 lineto +closepath stroke + 2.38 2.24 moveto + 2.48 2.17 lineto +closepath stroke + 2.38 2.24 moveto + 2.33 2.38 lineto +closepath stroke + 2.48 2.17 moveto + 2.54 2.29 lineto +closepath stroke + 2.48 2.17 moveto + 2.59 2.12 lineto +closepath stroke + 2.33 2.38 moveto + 2.26 2.50 lineto +closepath stroke + 2.33 2.38 moveto + 2.36 2.46 lineto +closepath stroke + 2.54 2.29 moveto + 2.59 2.12 lineto +closepath stroke + 2.54 2.29 moveto + 2.46 2.44 lineto +closepath stroke + 2.54 2.29 moveto + 2.58 2.39 lineto +closepath stroke + 2.59 2.12 moveto + 2.77 2.18 lineto +closepath stroke + 2.59 2.12 moveto + 2.71 2.07 lineto +closepath stroke + 2.71 2.07 moveto + 2.82 1.99 lineto +closepath stroke + 2.71 2.07 moveto + 2.77 2.18 lineto +closepath stroke + 2.82 1.99 moveto + 3.03 2.07 lineto +closepath stroke + 2.82 1.99 moveto + 2.95 1.93 lineto +closepath stroke + 2.77 2.18 moveto + 2.82 2.33 lineto +closepath stroke + 2.77 2.18 moveto + 2.95 2.28 lineto +closepath stroke + 2.95 1.93 moveto + 3.07 1.84 lineto +closepath stroke + 2.95 1.93 moveto + 3.03 2.07 lineto +closepath stroke + 3.07 1.84 moveto + 3.31 1.94 lineto +closepath stroke + 3.07 1.84 moveto + 3.22 1.78 lineto +closepath stroke + 3.03 2.07 moveto + 2.95 2.28 lineto +closepath stroke + 3.03 2.07 moveto + 3.08 2.22 lineto +closepath stroke + 3.22 1.78 moveto + 3.35 1.68 lineto +closepath stroke + 3.22 1.78 moveto + 3.31 1.94 lineto +closepath stroke + 3.35 1.68 moveto + 3.62 1.81 lineto +closepath stroke + 3.35 1.68 moveto + 3.51 1.61 lineto +closepath stroke + 3.31 1.94 moveto + 3.22 2.19 lineto +closepath stroke + 3.31 1.94 moveto + 3.37 2.12 lineto +closepath stroke + 3.51 1.61 moveto + 3.65 1.51 lineto +closepath stroke + 3.51 1.61 moveto + 3.62 1.81 lineto +closepath stroke + 3.65 1.51 moveto + 3.96 1.65 lineto +closepath stroke + 3.65 1.51 moveto + 3.83 1.43 lineto +closepath stroke + 3.62 1.81 moveto + 3.70 2.05 lineto +closepath stroke + 3.62 1.81 moveto + 3.86 1.98 lineto +closepath stroke + 3.83 1.43 moveto + 3.99 1.31 lineto +closepath stroke + 3.83 1.43 moveto + 3.96 1.65 lineto +closepath stroke + 3.99 1.31 moveto + 4.33 1.49 lineto +closepath stroke + 3.99 1.31 moveto + 4.18 1.23 lineto +closepath stroke + 3.96 1.65 moveto + 4.05 1.94 lineto +closepath stroke + 3.96 1.65 moveto + 4.23 1.86 lineto +closepath stroke + 4.18 1.23 moveto + 4.36 1.10 lineto +closepath stroke + 4.18 1.23 moveto + 4.33 1.49 lineto +closepath stroke + 4.36 1.10 moveto + 4.74 1.31 lineto +closepath stroke + 4.36 1.10 moveto + 4.57 1.01 lineto +closepath stroke + 4.33 1.49 moveto + 4.44 1.82 lineto +closepath stroke + 4.76 0.87 moveto + 4.57 1.01 lineto +closepath stroke + 4.76 0.87 moveto + 5.00 0.76 lineto +closepath stroke + 4.57 1.01 moveto + 4.74 1.31 lineto +closepath stroke + 5.21 0.50 moveto + 5.00 0.76 lineto +closepath stroke + 5.21 0.50 moveto + 5.47 0.38 lineto +closepath stroke + 5.47 0.38 moveto + 5.76 0.26 lineto +closepath stroke + 5.76 0.26 moveto + 6.07 0.00 lineto +closepath stroke + 2.07 2.57 moveto + 2.16 2.52 lineto +closepath stroke + 2.16 2.52 moveto + 2.18 2.60 lineto +closepath stroke + 2.16 2.52 moveto + 2.26 2.50 lineto +closepath stroke + 2.26 2.50 moveto + 2.36 2.46 lineto +closepath stroke + 2.26 2.50 moveto + 2.18 2.60 lineto +closepath stroke + 2.36 2.46 moveto + 2.39 2.56 lineto +closepath stroke + 2.36 2.46 moveto + 2.46 2.44 lineto +closepath stroke + 2.19 2.67 moveto + 2.29 2.67 lineto +closepath stroke + 2.19 2.67 moveto + 2.09 2.69 lineto +closepath stroke + 2.19 2.67 moveto + 2.18 2.60 lineto +closepath stroke + 2.29 2.67 moveto + 2.40 2.64 lineto +closepath stroke + 2.29 2.67 moveto + 2.39 2.56 lineto +closepath stroke + 2.09 2.69 moveto + 2.18 2.60 lineto +closepath stroke + 2.46 2.44 moveto + 2.58 2.39 lineto +closepath stroke + 2.46 2.44 moveto + 2.39 2.56 lineto +closepath stroke + 2.58 2.39 moveto + 2.62 2.51 lineto +closepath stroke + 2.58 2.39 moveto + 2.69 2.36 lineto +closepath stroke + 2.40 2.64 moveto + 2.51 2.64 lineto +closepath stroke + 2.40 2.64 moveto + 2.39 2.56 lineto +closepath stroke + 2.51 2.64 moveto + 2.63 2.62 lineto +closepath stroke + 2.51 2.64 moveto + 2.62 2.51 lineto +closepath stroke + 2.63 2.62 moveto + 2.75 2.62 lineto +closepath stroke + 2.63 2.62 moveto + 2.62 2.51 lineto +closepath stroke + 2.75 2.62 moveto + 2.88 2.59 lineto +closepath stroke + 2.75 2.62 moveto + 2.86 2.46 lineto +closepath stroke + 2.62 2.51 moveto + 2.69 2.36 lineto +closepath stroke + 2.69 2.36 moveto + 2.86 2.46 lineto +closepath stroke + 2.69 2.36 moveto + 2.82 2.33 lineto +closepath stroke + 2.95 2.28 moveto + 3.08 2.22 lineto +closepath stroke + 2.95 2.28 moveto + 2.82 2.33 lineto +closepath stroke + 3.08 2.22 moveto + 3.14 2.40 lineto +closepath stroke + 3.08 2.22 moveto + 3.22 2.19 lineto +closepath stroke + 2.88 2.59 moveto + 3.01 2.59 lineto +closepath stroke + 2.88 2.59 moveto + 2.86 2.46 lineto +closepath stroke + 3.01 2.59 moveto + 3.15 2.56 lineto +closepath stroke + 3.01 2.59 moveto + 3.14 2.40 lineto +closepath stroke + 2.86 2.46 moveto + 2.82 2.33 lineto +closepath stroke + 3.22 2.19 moveto + 3.37 2.12 lineto +closepath stroke + 3.22 2.19 moveto + 3.14 2.40 lineto +closepath stroke + 3.37 2.12 moveto + 3.44 2.34 lineto +closepath stroke + 3.37 2.12 moveto + 3.53 2.09 lineto +closepath stroke + 3.15 2.56 moveto + 3.30 2.56 lineto +closepath stroke + 3.15 2.56 moveto + 3.14 2.40 lineto +closepath stroke + 3.30 2.56 moveto + 3.46 2.53 lineto +closepath stroke + 3.30 2.56 moveto + 3.44 2.34 lineto +closepath stroke + 3.46 2.53 moveto + 3.62 2.53 lineto +closepath stroke + 3.46 2.53 moveto + 3.44 2.34 lineto +closepath stroke + 3.62 2.53 moveto + 3.79 2.49 lineto +closepath stroke + 3.62 2.53 moveto + 3.77 2.27 lineto +closepath stroke + 3.44 2.34 moveto + 3.53 2.09 lineto +closepath stroke + 3.53 2.09 moveto + 3.77 2.27 lineto +closepath stroke + 3.53 2.09 moveto + 3.70 2.05 lineto +closepath stroke + 3.79 2.49 moveto + 3.97 2.49 lineto +closepath stroke + 3.79 2.49 moveto + 3.77 2.27 lineto +closepath stroke + 3.97 2.49 moveto + 4.16 2.45 lineto +closepath stroke + 3.97 2.49 moveto + 4.13 2.19 lineto +closepath stroke + 3.77 2.27 moveto + 3.70 2.05 lineto +closepath stroke + 3.70 2.05 moveto + 3.86 1.98 lineto +closepath stroke + 3.86 1.98 moveto + 4.13 2.19 lineto +closepath stroke + 3.86 1.98 moveto + 4.05 1.94 lineto +closepath stroke + 4.16 2.45 moveto + 4.36 2.45 lineto +closepath stroke + 4.16 2.45 moveto + 4.13 2.19 lineto +closepath stroke + 4.36 2.45 moveto + 4.57 2.41 lineto +closepath stroke + 4.36 2.45 moveto + 4.53 2.11 lineto +closepath stroke + 4.13 2.19 moveto + 4.05 1.94 lineto +closepath stroke + 4.05 1.94 moveto + 4.23 1.86 lineto +closepath stroke + 4.23 1.86 moveto + 4.53 2.11 lineto +closepath stroke + 4.23 1.86 moveto + 4.44 1.82 lineto +closepath stroke + 4.57 2.41 moveto + 4.78 2.41 lineto +closepath stroke + 4.57 2.41 moveto + 4.53 2.11 lineto +closepath stroke + 4.78 2.41 moveto + 5.01 2.36 lineto +closepath stroke + 4.53 2.11 moveto + 4.44 1.82 lineto +closepath stroke +showpage +%%EndDocument + @endspecial 116 x @beginspecial 40 @vscale 40 @hscale 200 +@hoffset -180 @voffset @setspecial +%%BeginDocument: mat.ps.9 +%! +%%Creator: PSPLTM routine +%%BoundingBox: 264.20 133.88 1290.28 1257.16 +%%EndComments +/cm {72 mul 2.54 div} def +/mc {72 div 2.54 mul} def +/pnum { 72 div 2.54 mul 20 string +cvs print ( ) print} def +/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def +gsave + /Helvetica findfont 0.500000 cm scalefont setfont + 10.7950 cm 16.9700 cm moveto +(Assembled Matrix) Cshow + 3.81000 cm 2.00000 cm translate + 13.9700 cm 1081 div dup scale + 0.250000 setlinewidth +newpath + 0 0 moveto + 1081 0 lineto + 1081 1081 lineto + 0 1081 lineto +closepath stroke + 0.2 setlinewidth +1 1 translate +0.8 setlinewidth +/p {moveto 0 -.40 rmoveto + 0 .80 rlineto stroke} def + 0 1079 p + 801 1079 p + 802 1079 p + 825 1079 p + 827 1079 p + 1 1078 p + 501 1078 p + 500 1078 p + 603 1078 p + 2 1077 p + 352 1077 p + 351 1077 p + 398 1077 p + 3 1076 p + 599 1076 p + 600 1076 p + 626 1076 p + 629 1076 p + 4 1075 p + 288 1075 p + 287 1075 p + 290 1075 p + 1037 1075 p + 1039 1075 p + 5 1074 p + 287 1074 p + 286 1074 p + 293 1074 p + 292 1074 p + 1038 1074 p + 1043 1074 p + 6 1073 p + 292 1073 p + 291 1073 p + 297 1073 p + 296 1073 p + 1044 1073 p + 1046 1073 p + 7 1072 p + 296 1072 p + 295 1072 p + 301 1072 p + 300 1072 p + 1047 1072 p + 1052 1072 p + 8 1071 p + 300 1071 p + 299 1071 p + 305 1071 p + 304 1071 p + 1053 1071 p + 1058 1071 p + 9 1070 p + 304 1070 p + 303 1070 p + 309 1070 p + 308 1070 p + 1059 1070 p + 1061 1070 p + 10 1069 p + 308 1069 p + 307 1069 p + 313 1069 p + 312 1069 p + 1062 1069 p + 1065 1069 p + 11 1068 p + 312 1068 p + 311 1068 p + 317 1068 p + 316 1068 p + 1066 1068 p + 1070 1068 p + 12 1067 p + 316 1067 p + 315 1067 p + 321 1067 p + 320 1067 p + 1071 1067 p + 1075 1067 p + 13 1066 p + 320 1066 p + 319 1066 p + 325 1066 p + 324 1066 p + 1076 1066 p + 1079 1066 p + 14 1065 p + 324 1065 p + 323 1065 p + 330 1065 p + 331 1065 p + 933 1065 p + 993 1065 p + 15 1064 p + 327 1064 p + 329 1064 p + 331 1064 p + 932 1064 p + 16 1063 p + 329 1063 p + 328 1063 p + 333 1063 p + 335 1063 p + 901 1063 p + 927 1063 p + 17 1062 p + 335 1062 p + 334 1062 p + 338 1062 p + 339 1062 p + 341 1062 p + 776 1062 p + 777 1062 p + 18 1061 p + 341 1061 p + 340 1061 p + 343 1061 p + 345 1061 p + 650 1061 p + 669 1061 p + 710 1061 p + 19 1060 p + 345 1060 p + 344 1060 p + 347 1060 p + 349 1060 p + 502 1060 p + 552 1060 p + 20 1059 p + 349 1059 p + 348 1059 p + 354 1059 p + 356 1059 p + 404 1059 p + 499 1059 p + 21 1058 p + 356 1058 p + 355 1058 p + 403 1058 p + 22 1057 p + 289 1057 p + 290 1057 p + 358 1057 p + 23 1056 p + 286 1056 p + 288 1056 p + 289 1056 p + 294 1056 p + 357 1056 p + 360 1056 p + 24 1055 p + 291 1055 p + 293 1055 p + 294 1055 p + 298 1055 p + 359 1055 p + 363 1055 p + 25 1054 p + 295 1054 p + 297 1054 p + 298 1054 p + 302 1054 p + 362 1054 p + 366 1054 p + 26 1053 p + 299 1053 p + 301 1053 p + 302 1053 p + 306 1053 p + 365 1053 p + 369 1053 p + 27 1052 p + 303 1052 p + 305 1052 p + 306 1052 p + 310 1052 p + 368 1052 p + 372 1052 p + 28 1051 p + 307 1051 p + 309 1051 p + 310 1051 p + 314 1051 p + 371 1051 p + 375 1051 p + 29 1050 p + 311 1050 p + 313 1050 p + 314 1050 p + 318 1050 p + 374 1050 p + 378 1050 p + 30 1049 p + 315 1049 p + 317 1049 p + 318 1049 p + 322 1049 p + 377 1049 p + 381 1049 p + 31 1048 p + 319 1048 p + 321 1048 p + 322 1048 p + 326 1048 p + 380 1048 p + 384 1048 p + 32 1047 p + 323 1047 p + 325 1047 p + 326 1047 p + 332 1047 p + 383 1047 p + 387 1047 p + 33 1046 p + 328 1046 p + 327 1046 p + 330 1046 p + 332 1046 p + 336 1046 p + 386 1046 p + 390 1046 p + 34 1045 p + 334 1045 p + 333 1045 p + 336 1045 p + 337 1045 p + 389 1045 p + 393 1045 p + 35 1044 p + 338 1044 p + 337 1044 p + 342 1044 p + 392 1044 p + 396 1044 p + 36 1043 p + 340 1043 p + 339 1043 p + 342 1043 p + 346 1043 p + 395 1043 p + 401 1043 p + 37 1042 p + 344 1042 p + 343 1042 p + 346 1042 p + 350 1042 p + 400 1042 p + 38 1041 p + 348 1041 p + 347 1041 p + 350 1041 p + 351 1041 p + 353 1041 p + 399 1041 p + 39 1040 p + 353 1040 p + 352 1040 p + 355 1040 p + 354 1040 p + 40 1039 p + 357 1039 p + 358 1039 p + 361 1039 p + 406 1039 p + 408 1039 p + 41 1038 p + 359 1038 p + 360 1038 p + 361 1038 p + 364 1038 p + 405 1038 p + 410 1038 p + 42 1037 p + 362 1037 p + 363 1037 p + 364 1037 p + 367 1037 p + 409 1037 p + 413 1037 p + 43 1036 p + 365 1036 p + 366 1036 p + 367 1036 p + 370 1036 p + 412 1036 p + 416 1036 p + 44 1035 p + 368 1035 p + 369 1035 p + 370 1035 p + 373 1035 p + 415 1035 p + 419 1035 p + 45 1034 p + 371 1034 p + 372 1034 p + 373 1034 p + 376 1034 p + 418 1034 p + 423 1034 p + 46 1033 p + 374 1033 p + 375 1033 p + 376 1033 p + 379 1033 p + 422 1033 p + 47 1032 p + 377 1032 p + 378 1032 p + 379 1032 p + 382 1032 p + 421 1032 p + 426 1032 p + 428 1032 p + 48 1031 p + 380 1031 p + 381 1031 p + 382 1031 p + 385 1031 p + 427 1031 p + 431 1031 p + 49 1030 p + 383 1030 p + 384 1030 p + 385 1030 p + 388 1030 p + 430 1030 p + 434 1030 p + 50 1029 p + 386 1029 p + 387 1029 p + 388 1029 p + 391 1029 p + 433 1029 p + 51 1028 p + 389 1028 p + 390 1028 p + 391 1028 p + 394 1028 p + 436 1028 p + 440 1028 p + 52 1027 p + 392 1027 p + 393 1027 p + 394 1027 p + 397 1027 p + 438 1027 p + 53 1026 p + 395 1026 p + 396 1026 p + 397 1026 p + 402 1026 p + 437 1026 p + 54 1025 p + 398 1025 p + 399 1025 p + 400 1025 p + 401 1025 p + 402 1025 p + 439 1025 p + 55 1024 p + 407 1024 p + 408 1024 p + 443 1024 p + 445 1024 p + 56 1023 p + 405 1023 p + 406 1023 p + 407 1023 p + 411 1023 p + 442 1023 p + 447 1023 p + 57 1022 p + 409 1022 p + 410 1022 p + 411 1022 p + 414 1022 p + 446 1022 p + 450 1022 p + 58 1021 p + 412 1021 p + 413 1021 p + 414 1021 p + 417 1021 p + 449 1021 p + 453 1021 p + 59 1020 p + 415 1020 p + 416 1020 p + 417 1020 p + 420 1020 p + 452 1020 p + 456 1020 p + 60 1019 p + 418 1019 p + 419 1019 p + 420 1019 p + 424 1019 p + 455 1019 p + 460 1019 p + 61 1018 p + 421 1018 p + 422 1018 p + 423 1018 p + 424 1018 p + 425 1018 p + 459 1018 p + 62 1017 p + 426 1017 p + 425 1017 p + 429 1017 p + 458 1017 p + 463 1017 p + 63 1016 p + 427 1016 p + 428 1016 p + 429 1016 p + 432 1016 p + 462 1016 p + 466 1016 p + 64 1015 p + 430 1015 p + 431 1015 p + 432 1015 p + 435 1015 p + 465 1015 p + 469 1015 p + 65 1014 p + 433 1014 p + 434 1014 p + 435 1014 p + 436 1014 p + 441 1014 p + 468 1014 p + 66 1013 p + 437 1013 p + 438 1013 p + 439 1013 p + 440 1013 p + 441 1013 p + 471 1013 p + 67 1012 p + 444 1012 p + 445 1012 p + 473 1012 p + 475 1012 p + 68 1011 p + 442 1011 p + 443 1011 p + 444 1011 p + 448 1011 p + 472 1011 p + 69 1010 p + 446 1010 p + 447 1010 p + 448 1010 p + 451 1010 p + 476 1010 p + 478 1010 p + 481 1010 p + 70 1009 p + 449 1009 p + 450 1009 p + 451 1009 p + 454 1009 p + 480 1009 p + 71 1008 p + 452 1008 p + 453 1008 p + 454 1008 p + 457 1008 p + 479 1008 p + 484 1008 p + 72 1007 p + 455 1007 p + 456 1007 p + 457 1007 p + 461 1007 p + 483 1007 p + 487 1007 p + 73 1006 p + 458 1006 p + 459 1006 p + 460 1006 p + 461 1006 p + 464 1006 p + 486 1006 p + 490 1006 p + 493 1006 p + 74 1005 p + 462 1005 p + 463 1005 p + 464 1005 p + 467 1005 p + 492 1005 p + 75 1004 p + 465 1004 p + 466 1004 p + 467 1004 p + 470 1004 p + 491 1004 p + 495 1004 p + 76 1003 p + 468 1003 p + 469 1003 p + 470 1003 p + 471 1003 p + 497 1003 p + 77 1002 p + 474 1002 p + 475 1002 p + 504 1002 p + 506 1002 p + 78 1001 p + 472 1001 p + 473 1001 p + 474 1001 p + 476 1001 p + 477 1001 p + 503 1001 p + 79 1000 p + 478 1000 p + 477 1000 p + 482 1000 p + 507 1000 p + 509 1000 p + 80 999 p + 479 999 p + 480 999 p + 481 999 p + 482 999 p + 485 999 p + 508 999 p + 512 999 p + 81 998 p + 483 998 p + 484 998 p + 485 998 p + 488 998 p + 511 998 p + 515 998 p + 517 998 p + 82 997 p + 486 997 p + 487 997 p + 488 997 p + 489 997 p + 516 997 p + 520 997 p + 83 996 p + 490 996 p + 489 996 p + 494 996 p + 519 996 p + 524 996 p + 84 995 p + 491 995 p + 492 995 p + 493 995 p + 494 995 p + 496 995 p + 523 995 p + 85 994 p + 495 994 p + 496 994 p + 497 994 p + 522 994 p + 526 994 p + 86 993 p + 505 993 p + 506 993 p + 529 993 p + 87 992 p + 503 992 p + 504 992 p + 505 992 p + 507 992 p + 510 992 p + 528 992 p + 531 992 p + 88 991 p + 508 991 p + 509 991 p + 510 991 p + 513 991 p + 530 991 p + 534 991 p + 89 990 p + 511 990 p + 512 990 p + 513 990 p + 514 990 p + 533 990 p + 537 990 p + 539 990 p + 90 989 p + 515 989 p + 514 989 p + 518 989 p + 538 989 p + 542 989 p + 91 988 p + 516 988 p + 517 988 p + 518 988 p + 521 988 p + 541 988 p + 546 988 p + 92 987 p + 519 987 p + 520 987 p + 521 987 p + 525 987 p + 545 987 p + 93 986 p + 522 986 p + 523 986 p + 524 986 p + 525 986 p + 527 986 p + 544 986 p + 549 986 p + 94 985 p + 526 985 p + 527 985 p + 548 985 p + 95 984 p + 528 984 p + 529 984 p + 532 984 p + 554 984 p + 556 984 p + 96 983 p + 530 983 p + 531 983 p + 532 983 p + 535 983 p + 553 983 p + 558 983 p + 97 982 p + 533 982 p + 534 982 p + 535 982 p + 536 982 p + 557 982 p + 561 982 p + 98 981 p + 537 981 p + 536 981 p + 540 981 p + 560 981 p + 565 981 p + 99 980 p + 538 980 p + 539 980 p + 540 980 p + 543 980 p + 564 980 p + 100 979 p + 541 979 p + 542 979 p + 543 979 p + 547 979 p + 563 979 p + 568 979 p + 101 978 p + 544 978 p + 545 978 p + 546 978 p + 547 978 p + 550 978 p + 567 978 p + 571 978 p + 102 977 p + 548 977 p + 549 977 p + 550 977 p + 570 977 p + 573 977 p + 103 976 p + 555 976 p + 556 976 p + 576 976 p + 104 975 p + 553 975 p + 554 975 p + 555 975 p + 559 975 p + 575 975 p + 578 975 p + 105 974 p + 557 974 p + 558 974 p + 559 974 p + 562 974 p + 577 974 p + 581 974 p + 106 973 p + 560 973 p + 561 973 p + 562 973 p + 566 973 p + 580 973 p + 584 973 p + 107 972 p + 563 972 p + 564 972 p + 565 972 p + 566 972 p + 569 972 p + 583 972 p + 587 972 p + 108 971 p + 567 971 p + 568 971 p + 569 971 p + 572 971 p + 586 971 p + 590 971 p + 592 971 p + 109 970 p + 570 970 p + 571 970 p + 572 970 p + 574 970 p + 591 970 p + 595 970 p + 110 969 p + 573 969 p + 574 969 p + 594 969 p + 597 969 p + 111 968 p + 575 968 p + 576 968 p + 579 968 p + 605 968 p + 607 968 p + 112 967 p + 577 967 p + 578 967 p + 579 967 p + 582 967 p + 604 967 p + 609 967 p + 113 966 p + 580 966 p + 581 966 p + 582 966 p + 585 966 p + 608 966 p + 612 966 p + 114 965 p + 583 965 p + 584 965 p + 585 965 p + 588 965 p + 611 965 p + 615 965 p + 115 964 p + 586 964 p + 587 964 p + 588 964 p + 589 964 p + 614 964 p + 619 964 p + 116 963 p + 590 963 p + 589 963 p + 593 963 p + 618 963 p + 117 962 p + 591 962 p + 592 962 p + 593 962 p + 596 962 p + 617 962 p + 622 962 p + 118 961 p + 594 961 p + 595 961 p + 596 961 p + 598 961 p + 600 961 p + 621 961 p + 624 961 p + 119 960 p + 597 960 p + 598 960 p + 599 960 p + 120 959 p + 606 959 p + 607 959 p + 631 959 p + 121 958 p + 604 958 p + 605 958 p + 606 958 p + 610 958 p + 630 958 p + 633 958 p + 122 957 p + 608 957 p + 609 957 p + 610 957 p + 613 957 p + 632 957 p + 636 957 p + 638 957 p + 123 956 p + 611 956 p + 612 956 p + 613 956 p + 616 956 p + 637 956 p + 641 956 p + 124 955 p + 614 955 p + 615 955 p + 616 955 p + 620 955 p + 640 955 p + 645 955 p + 125 954 p + 617 954 p + 618 954 p + 619 954 p + 620 954 p + 623 954 p + 644 954 p + 126 953 p + 621 953 p + 622 953 p + 623 953 p + 625 953 p + 628 953 p + 643 953 p + 647 953 p + 127 952 p + 624 952 p + 625 952 p + 626 952 p + 627 952 p + 128 951 p + 627 951 p + 628 951 p + 629 951 p + 649 951 p + 129 950 p + 630 950 p + 631 950 p + 634 950 p + 652 950 p + 654 950 p + 130 949 p + 632 949 p + 633 949 p + 634 949 p + 635 949 p + 651 949 p + 656 949 p + 131 948 p + 636 948 p + 635 948 p + 639 948 p + 655 948 p + 660 948 p + 132 947 p + 637 947 p + 638 947 p + 639 947 p + 642 947 p + 659 947 p + 133 946 p + 640 946 p + 641 946 p + 642 946 p + 646 946 p + 658 946 p + 663 946 p + 134 945 p + 643 945 p + 644 945 p + 645 945 p + 646 945 p + 648 945 p + 662 945 p + 665 945 p + 135 944 p + 647 944 p + 648 944 p + 649 944 p + 667 944 p + 136 943 p + 653 943 p + 654 943 p + 671 943 p + 137 942 p + 651 942 p + 652 942 p + 653 942 p + 657 942 p + 670 942 p + 673 942 p + 138 941 p + 655 941 p + 656 941 p + 657 941 p + 661 941 p + 672 941 p + 676 941 p + 139 940 p + 658 940 p + 659 940 p + 660 940 p + 661 940 p + 664 940 p + 675 940 p + 679 940 p + 140 939 p + 662 939 p + 663 939 p + 664 939 p + 666 939 p + 678 939 p + 681 939 p + 141 938 p + 665 938 p + 666 938 p + 667 938 p + 683 938 p + 142 937 p + 670 937 p + 671 937 p + 674 937 p + 685 937 p + 687 937 p + 143 936 p + 672 936 p + 673 936 p + 674 936 p + 677 936 p + 684 936 p + 144 935 p + 675 935 p + 676 935 p + 677 935 p + 680 935 p + 688 935 p + 690 935 p + 693 935 p + 145 934 p + 678 934 p + 679 934 p + 680 934 p + 682 934 p + 692 934 p + 146 933 p + 681 933 p + 682 933 p + 683 933 p + 691 933 p + 695 933 p + 147 932 p + 686 932 p + 687 932 p + 698 932 p + 148 931 p + 684 931 p + 685 931 p + 686 931 p + 688 931 p + 689 931 p + 697 931 p + 700 931 p + 149 930 p + 690 930 p + 689 930 p + 694 930 p + 699 930 p + 703 930 p + 150 929 p + 691 929 p + 692 929 p + 693 929 p + 694 929 p + 696 929 p + 702 929 p + 705 929 p + 151 928 p + 695 928 p + 696 928 p + 707 928 p + 152 927 p + 697 927 p + 698 927 p + 701 927 p + 714 927 p + 153 926 p + 699 926 p + 700 926 p + 701 926 p + 704 926 p + 713 926 p + 716 926 p + 154 925 p + 702 925 p + 703 925 p + 704 925 p + 706 925 p + 715 925 p + 719 925 p + 721 925 p + 155 924 p + 705 924 p + 706 924 p + 707 924 p + 720 924 p + 723 924 p + 156 923 p + 713 923 p + 714 923 p + 717 923 p + 726 923 p + 157 922 p + 715 922 p + 716 922 p + 717 922 p + 718 922 p + 725 922 p + 728 922 p + 730 922 p + 158 921 p + 719 921 p + 718 921 p + 722 921 p + 729 921 p + 733 921 p + 159 920 p + 720 920 p + 721 920 p + 722 920 p + 724 920 p + 732 920 p + 736 920 p + 160 919 p + 723 919 p + 724 919 p + 735 919 p + 161 918 p + 725 918 p + 726 918 p + 727 918 p + 739 918 p + 162 917 p + 728 917 p + 727 917 p + 731 917 p + 738 917 p + 741 917 p + 163 916 p + 729 916 p + 730 916 p + 731 916 p + 734 916 p + 740 916 p + 744 916 p + 164 915 p + 732 915 p + 733 915 p + 734 915 p + 737 915 p + 743 915 p + 747 915 p + 749 915 p + 165 914 p + 735 914 p + 736 914 p + 737 914 p + 748 914 p + 751 914 p + 166 913 p + 738 913 p + 739 913 p + 742 913 p + 758 913 p + 760 913 p + 167 912 p + 740 912 p + 741 912 p + 742 912 p + 745 912 p + 759 912 p + 763 912 p + 168 911 p + 743 911 p + 744 911 p + 745 911 p + 746 911 p + 762 911 p + 766 911 p + 169 910 p + 747 910 p + 746 910 p + 750 910 p + 765 910 p + 769 910 p + 170 909 p + 748 909 p + 749 909 p + 750 909 p + 752 909 p + 768 909 p + 772 909 p + 171 908 p + 751 908 p + 752 908 p + 771 908 p + 774 908 p + 172 907 p + 761 907 p + 760 907 p + 778 907 p + 173 906 p + 759 906 p + 758 906 p + 761 906 p + 764 906 p + 779 906 p + 780 906 p + 174 905 p + 762 905 p + 763 905 p + 764 905 p + 767 905 p + 781 905 p + 783 905 p + 175 904 p + 765 904 p + 766 904 p + 767 904 p + 770 904 p + 784 904 p + 787 904 p + 176 903 p + 768 903 p + 769 903 p + 770 903 p + 773 903 p + 786 903 p + 790 903 p + 177 902 p + 771 902 p + 772 902 p + 773 902 p + 775 902 p + 789 902 p + 793 902 p + 795 902 p + 178 901 p + 774 901 p + 775 901 p + 794 901 p + 797 901 p + 179 900 p + 779 900 p + 778 900 p + 782 900 p + 803 900 p + 180 899 p + 781 899 p + 780 899 p + 782 899 p + 785 899 p + 804 899 p + 805 899 p + 181 898 p + 784 898 p + 783 898 p + 785 898 p + 788 898 p + 806 898 p + 808 898 p + 182 897 p + 786 897 p + 787 897 p + 788 897 p + 791 897 p + 809 897 p + 811 897 p + 183 896 p + 789 896 p + 790 896 p + 791 896 p + 792 896 p + 812 896 p + 814 896 p + 184 895 p + 793 895 p + 792 895 p + 796 895 p + 815 895 p + 817 895 p + 185 894 p + 794 894 p + 795 894 p + 796 894 p + 798 894 p + 800 894 p + 818 894 p + 820 894 p + 186 893 p + 799 893 p + 800 893 p + 802 893 p + 821 893 p + 823 893 p + 187 892 p + 797 892 p + 798 892 p + 799 892 p + 801 892 p + 188 891 p + 804 891 p + 803 891 p + 807 891 p + 831 891 p + 833 891 p + 189 890 p + 806 890 p + 805 890 p + 807 890 p + 810 890 p + 832 890 p + 835 890 p + 190 889 p + 809 889 p + 808 889 p + 810 889 p + 813 889 p + 836 889 p + 838 889 p + 191 888 p + 812 888 p + 811 888 p + 813 888 p + 816 888 p + 839 888 p + 841 888 p + 192 887 p + 815 887 p + 814 887 p + 816 887 p + 819 887 p + 842 887 p + 844 887 p + 193 886 p + 818 886 p + 817 886 p + 819 886 p + 822 886 p + 845 886 p + 849 886 p + 194 885 p + 821 885 p + 820 885 p + 822 885 p + 824 885 p + 847 885 p + 195 884 p + 823 884 p + 824 884 p + 825 884 p + 826 884 p + 848 884 p + 852 884 p + 196 883 p + 827 883 p + 826 883 p + 851 883 p + 197 882 p + 834 882 p + 833 882 p + 854 882 p + 198 881 p + 832 881 p + 831 881 p + 834 881 p + 837 881 p + 855 881 p + 856 881 p + 199 880 p + 836 880 p + 835 880 p + 837 880 p + 840 880 p + 857 880 p + 859 880 p + 200 879 p + 839 879 p + 838 879 p + 840 879 p + 843 879 p + 860 879 p + 862 879 p + 201 878 p + 842 878 p + 841 878 p + 843 878 p + 846 878 p + 863 878 p + 865 878 p + 202 877 p + 845 877 p + 844 877 p + 846 877 p + 850 877 p + 866 877 p + 869 877 p + 870 877 p + 203 876 p + 848 876 p + 847 876 p + 849 876 p + 850 876 p + 853 876 p + 871 876 p + 204 875 p + 851 875 p + 852 875 p + 853 875 p + 873 875 p + 875 875 p + 205 874 p + 855 874 p + 854 874 p + 858 874 p + 876 874 p + 206 873 p + 857 873 p + 856 873 p + 858 873 p + 861 873 p + 877 873 p + 878 873 p + 207 872 p + 860 872 p + 859 872 p + 861 872 p + 864 872 p + 879 872 p + 881 872 p + 208 871 p + 863 871 p + 862 871 p + 864 871 p + 867 871 p + 882 871 p + 884 871 p + 209 870 p + 866 870 p + 865 870 p + 867 870 p + 868 870 p + 885 870 p + 887 870 p + 210 869 p + 869 869 p + 868 869 p + 872 869 p + 888 869 p + 890 869 p + 211 868 p + 871 868 p + 870 868 p + 872 868 p + 873 868 p + 874 868 p + 891 868 p + 894 868 p + 895 868 p + 212 867 p + 875 867 p + 874 867 p + 896 867 p + 899 867 p + 213 866 p + 877 866 p + 876 866 p + 880 866 p + 902 866 p + 904 866 p + 214 865 p + 879 865 p + 878 865 p + 880 865 p + 883 865 p + 903 865 p + 906 865 p + 215 864 p + 882 864 p + 881 864 p + 883 864 p + 886 864 p + 907 864 p + 909 864 p + 216 863 p + 885 863 p + 884 863 p + 886 863 p + 889 863 p + 910 863 p + 912 863 p + 217 862 p + 888 862 p + 887 862 p + 889 862 p + 892 862 p + 913 862 p + 915 862 p + 218 861 p + 891 861 p + 890 861 p + 892 861 p + 893 861 p + 916 861 p + 918 861 p + 219 860 p + 894 860 p + 893 860 p + 897 860 p + 919 860 p + 921 860 p + 220 859 p + 896 859 p + 895 859 p + 897 859 p + 898 859 p + 922 859 p + 924 859 p + 221 858 p + 899 858 p + 898 858 p + 925 858 p + 222 857 p + 905 857 p + 904 857 p + 934 857 p + 936 857 p + 223 856 p + 903 856 p + 902 856 p + 905 856 p + 908 856 p + 935 856 p + 224 855 p + 907 855 p + 906 855 p + 908 855 p + 911 855 p + 938 855 p + 939 855 p + 225 854 p + 910 854 p + 909 854 p + 911 854 p + 914 854 p + 940 854 p + 942 854 p + 226 853 p + 913 853 p + 912 853 p + 914 853 p + 917 853 p + 943 853 p + 945 853 p + 227 852 p + 916 852 p + 915 852 p + 917 852 p + 920 852 p + 946 852 p + 948 852 p + 228 851 p + 919 851 p + 918 851 p + 920 851 p + 923 851 p + 949 851 p + 951 851 p + 229 850 p + 922 850 p + 921 850 p + 923 850 p + 926 850 p + 952 850 p + 955 850 p + 956 850 p + 230 849 p + 925 849 p + 924 849 p + 926 849 p + 957 849 p + 960 849 p + 231 848 p + 937 848 p + 936 848 p + 961 848 p + 232 847 p + 935 847 p + 934 847 p + 937 847 p + 938 847 p + 941 847 p + 962 847 p + 963 847 p + 233 846 p + 940 846 p + 939 846 p + 941 846 p + 944 846 p + 964 846 p + 967 846 p + 970 846 p + 234 845 p + 943 845 p + 942 845 p + 944 845 p + 947 845 p + 968 845 p + 235 844 p + 946 844 p + 945 844 p + 947 844 p + 950 844 p + 969 844 p + 972 844 p + 236 843 p + 949 843 p + 948 843 p + 950 843 p + 953 843 p + 973 843 p + 975 843 p + 237 842 p + 952 842 p + 951 842 p + 953 842 p + 954 842 p + 976 842 p + 978 842 p + 238 841 p + 955 841 p + 954 841 p + 958 841 p + 979 841 p + 981 841 p + 239 840 p + 957 840 p + 956 840 p + 958 840 p + 959 840 p + 982 840 p + 985 840 p + 987 840 p + 240 839 p + 960 839 p + 959 839 p + 986 839 p + 990 839 p + 992 839 p + 241 838 p + 962 838 p + 961 838 p + 965 838 p + 997 838 p + 242 837 p + 964 837 p + 963 837 p + 965 837 p + 966 837 p + 998 837 p + 999 837 p + 243 836 p + 967 836 p + 966 836 p + 971 836 p + 1000 836 p + 1002 836 p + 244 835 p + 969 835 p + 968 835 p + 970 835 p + 971 835 p + 974 835 p + 1003 835 p + 1006 835 p + 1007 835 p + 245 834 p + 973 834 p + 972 834 p + 974 834 p + 977 834 p + 1008 834 p + 1010 834 p + 246 833 p + 976 833 p + 975 833 p + 977 833 p + 980 833 p + 1011 833 p + 1013 833 p + 247 832 p + 979 832 p + 978 832 p + 980 832 p + 983 832 p + 1014 832 p + 1016 832 p + 248 831 p + 982 831 p + 981 831 p + 983 831 p + 984 831 p + 1017 831 p + 1019 831 p + 249 830 p + 985 830 p + 984 830 p + 988 830 p + 1020 830 p + 1022 830 p + 250 829 p + 986 829 p + 987 829 p + 988 829 p + 989 829 p + 1023 829 p + 1026 829 p + 251 828 p + 990 828 p + 989 828 p + 991 828 p + 1025 828 p + 1029 828 p + 252 827 p + 992 827 p + 991 827 p + 1028 827 p + 1030 827 p + 1031 827 p + 1032 827 p + 253 826 p + 998 826 p + 997 826 p + 1001 826 p + 1033 826 p + 254 825 p + 1000 825 p + 999 825 p + 1001 825 p + 1004 825 p + 1034 825 p + 1035 825 p + 255 824 p + 1003 824 p + 1002 824 p + 1004 824 p + 1005 824 p + 1036 824 p + 1041 824 p + 256 823 p + 1006 823 p + 1005 823 p + 1009 823 p + 1042 823 p + 1049 823 p + 1055 823 p + 257 822 p + 1008 822 p + 1007 822 p + 1009 822 p + 1012 822 p + 1050 822 p + 258 821 p + 1011 821 p + 1010 821 p + 1012 821 p + 1015 821 p + 1051 821 p + 1056 821 p + 259 820 p + 1014 820 p + 1013 820 p + 1015 820 p + 1018 820 p + 1057 820 p + 1064 820 p + 1068 820 p + 260 819 p + 1017 819 p + 1016 819 p + 1018 819 p + 1021 819 p + 1069 819 p + 1073 819 p + 261 818 p + 1020 818 p + 1019 818 p + 1021 818 p + 1024 818 p + 1074 818 p + 1078 818 p + 262 817 p + 996 817 p + 995 817 p + 1023 817 p + 1022 817 p + 1024 817 p + 1027 817 p + 263 816 p + 930 816 p + 929 816 p + 931 816 p + 1025 816 p + 1026 816 p + 1027 816 p + 264 815 p + 830 815 p + 829 815 p + 900 815 p + 931 815 p + 1028 815 p + 1029 815 p + 265 814 p + 756 814 p + 755 814 p + 757 814 p + 900 814 p + 1030 814 p + 266 813 p + 712 813 p + 711 813 p + 753 813 p + 757 813 p + 1031 813 p + 267 812 p + 601 812 p + 602 812 p + 603 812 p + 708 812 p + 753 812 p + 1032 812 p + 268 811 p + 1034 811 p + 1033 811 p + 1039 811 p + 1040 811 p + 269 810 p + 1036 810 p + 1035 810 p + 1037 810 p + 1038 810 p + 1040 810 p + 1045 810 p + 270 809 p + 1042 809 p + 1041 809 p + 1043 809 p + 1044 809 p + 1045 809 p + 1048 809 p + 271 808 p + 1046 808 p + 1047 808 p + 1048 808 p + 1049 808 p + 1054 808 p + 272 807 p + 1051 807 p + 1050 807 p + 1052 807 p + 1053 807 p + 1054 807 p + 1055 807 p + 1060 807 p + 273 806 p + 1057 806 p + 1056 806 p + 1058 806 p + 1059 806 p + 1060 806 p + 1063 806 p + 274 805 p + 1061 805 p + 1062 805 p + 1063 805 p + 1064 805 p + 1067 805 p + 275 804 p + 1065 804 p + 1066 804 p + 1067 804 p + 1069 804 p + 1068 804 p + 1072 804 p + 276 803 p + 1070 803 p + 1071 803 p + 1072 803 p + 1074 803 p + 1073 803 p + 1077 803 p + 277 802 p + 994 802 p + 996 802 p + 1075 802 p + 1076 802 p + 1077 802 p + 1078 802 p + 278 801 p + 928 801 p + 930 801 p + 993 801 p + 995 801 p + 994 801 p + 1079 801 p + 279 800 p + 828 800 p + 830 800 p + 927 800 p + 929 800 p + 928 800 p + 933 800 p + 932 800 p + 280 799 p + 754 799 p + 756 799 p + 777 799 p + 829 799 p + 828 799 p + 901 799 p + 281 798 p + 710 798 p + 709 798 p + 712 798 p + 755 798 p + 754 798 p + 776 798 p + 282 797 p + 669 797 p + 668 797 p + 708 797 p + 709 797 p + 711 797 p + 283 796 p + 552 796 p + 551 796 p + 601 796 p + 650 796 p + 668 796 p + 284 795 p + 499 795 p + 498 795 p + 501 795 p + 502 795 p + 551 795 p + 602 795 p + 285 794 p + 404 794 p + 403 794 p + 498 794 p + 500 794 p + 286 793 p + 287 793 p + 288 793 p + 294 793 p + 293 793 p + 23 793 p + 5 793 p + 286 792 p + 287 792 p + 288 792 p + 1037 792 p + 1038 792 p + 5 792 p + 4 792 p + 286 791 p + 287 791 p + 288 791 p + 289 791 p + 290 791 p + 23 791 p + 4 791 p + 289 790 p + 288 790 p + 290 790 p + 357 790 p + 358 790 p + 22 790 p + 23 790 p + 289 789 p + 288 789 p + 290 789 p + 22 789 p + 4 789 p + 291 788 p + 292 788 p + 293 788 p + 298 788 p + 297 788 p + 24 788 p + 6 788 p + 291 787 p + 292 787 p + 293 787 p + 1043 787 p + 1044 787 p + 6 787 p + 5 787 p + 291 786 p + 292 786 p + 293 786 p + 294 786 p + 286 786 p + 24 786 p + 5 786 p + 294 785 p + 293 785 p + 286 785 p + 359 785 p + 360 785 p + 23 785 p + 24 785 p + 295 784 p + 296 784 p + 297 784 p + 302 784 p + 301 784 p + 25 784 p + 7 784 p + 295 783 p + 296 783 p + 297 783 p + 1046 783 p + 1047 783 p + 7 783 p + 6 783 p + 295 782 p + 296 782 p + 297 782 p + 298 782 p + 291 782 p + 25 782 p + 6 782 p + 298 781 p + 297 781 p + 291 781 p + 362 781 p + 363 781 p + 24 781 p + 25 781 p + 299 780 p + 300 780 p + 301 780 p + 306 780 p + 305 780 p + 26 780 p + 8 780 p + 299 779 p + 300 779 p + 301 779 p + 1052 779 p + 1053 779 p + 8 779 p + 7 779 p + 299 778 p + 300 778 p + 301 778 p + 302 778 p + 295 778 p + 26 778 p + 7 778 p + 302 777 p + 301 777 p + 295 777 p + 365 777 p + 366 777 p + 25 777 p + 26 777 p + 303 776 p + 304 776 p + 305 776 p + 310 776 p + 309 776 p + 27 776 p + 9 776 p + 303 775 p + 304 775 p + 305 775 p + 1058 775 p + 1059 775 p + 9 775 p + 8 775 p + 303 774 p + 304 774 p + 305 774 p + 306 774 p + 299 774 p + 27 774 p + 8 774 p + 306 773 p + 305 773 p + 299 773 p + 368 773 p + 369 773 p + 26 773 p + 27 773 p + 307 772 p + 308 772 p + 309 772 p + 314 772 p + 313 772 p + 28 772 p + 10 772 p + 307 771 p + 308 771 p + 309 771 p + 1061 771 p + 1062 771 p + 10 771 p + 9 771 p + 307 770 p + 308 770 p + 309 770 p + 310 770 p + 303 770 p + 28 770 p + 9 770 p + 310 769 p + 309 769 p + 303 769 p + 371 769 p + 372 769 p + 27 769 p + 28 769 p + 311 768 p + 312 768 p + 313 768 p + 318 768 p + 317 768 p + 29 768 p + 11 768 p + 311 767 p + 312 767 p + 313 767 p + 1065 767 p + 1066 767 p + 11 767 p + 10 767 p + 311 766 p + 312 766 p + 313 766 p + 314 766 p + 307 766 p + 29 766 p + 10 766 p + 314 765 p + 313 765 p + 307 765 p + 374 765 p + 375 765 p + 28 765 p + 29 765 p + 315 764 p + 316 764 p + 317 764 p + 322 764 p + 321 764 p + 30 764 p + 12 764 p + 315 763 p + 316 763 p + 317 763 p + 1070 763 p + 1071 763 p + 12 763 p + 11 763 p + 315 762 p + 316 762 p + 317 762 p + 318 762 p + 311 762 p + 30 762 p + 11 762 p + 318 761 p + 317 761 p + 311 761 p + 377 761 p + 378 761 p + 29 761 p + 30 761 p + 319 760 p + 320 760 p + 321 760 p + 326 760 p + 325 760 p + 31 760 p + 13 760 p + 319 759 p + 320 759 p + 321 759 p + 1075 759 p + 1076 759 p + 13 759 p + 12 759 p + 319 758 p + 320 758 p + 321 758 p + 322 758 p + 315 758 p + 31 758 p + 12 758 p + 322 757 p + 321 757 p + 315 757 p + 380 757 p + 381 757 p + 30 757 p + 31 757 p + 323 756 p + 324 756 p + 325 756 p + 332 756 p + 330 756 p + 32 756 p + 14 756 p + 323 755 p + 324 755 p + 325 755 p + 1079 755 p + 993 755 p + 14 755 p + 13 755 p + 323 754 p + 324 754 p + 325 754 p + 326 754 p + 319 754 p + 32 754 p + 13 754 p + 326 753 p + 325 753 p + 319 753 p + 383 753 p + 384 753 p + 31 753 p + 32 753 p + 327 752 p + 328 752 p + 329 752 p + 330 752 p + 331 752 p + 15 752 p + 33 752 p + 327 751 p + 328 751 p + 329 751 p + 336 751 p + 333 751 p + 33 751 p + 16 751 p + 327 750 p + 328 750 p + 329 750 p + 927 750 p + 932 750 p + 15 750 p + 16 750 p + 330 749 p + 327 749 p + 331 749 p + 323 749 p + 332 749 p + 14 749 p + 33 749 p + 330 748 p + 327 748 p + 331 748 p + 932 748 p + 933 748 p + 14 748 p + 15 748 p + 323 747 p + 332 747 p + 330 747 p + 386 747 p + 387 747 p + 32 747 p + 33 747 p + 333 746 p + 334 746 p + 335 746 p + 328 746 p + 336 746 p + 16 746 p + 34 746 p + 333 745 p + 334 745 p + 335 745 p + 337 745 p + 338 745 p + 34 745 p + 17 745 p + 333 744 p + 334 744 p + 335 744 p + 777 744 p + 901 744 p + 16 744 p + 17 744 p + 328 743 p + 336 743 p + 333 743 p + 389 743 p + 390 743 p + 33 743 p + 34 743 p + 334 742 p + 337 742 p + 338 742 p + 392 742 p + 393 742 p + 34 742 p + 35 742 p + 334 741 p + 337 741 p + 338 741 p + 342 741 p + 339 741 p + 17 741 p + 35 741 p + 339 740 p + 340 740 p + 341 740 p + 338 740 p + 342 740 p + 17 740 p + 36 740 p + 339 739 p + 340 739 p + 341 739 p + 346 739 p + 343 739 p + 36 739 p + 18 739 p + 339 738 p + 340 738 p + 341 738 p + 710 738 p + 776 738 p + 17 738 p + 18 738 p + 338 737 p + 342 737 p + 339 737 p + 395 737 p + 396 737 p + 35 737 p + 36 737 p + 343 736 p + 344 736 p + 345 736 p + 340 736 p + 346 736 p + 18 736 p + 37 736 p + 343 735 p + 344 735 p + 345 735 p + 350 735 p + 347 735 p + 37 735 p + 19 735 p + 343 734 p + 344 734 p + 345 734 p + 552 734 p + 650 734 p + 18 734 p + 19 734 p + 340 733 p + 346 733 p + 343 733 p + 401 733 p + 400 733 p + 36 733 p + 37 733 p + 347 732 p + 348 732 p + 349 732 p + 344 732 p + 350 732 p + 19 732 p + 38 732 p + 347 731 p + 348 731 p + 349 731 p + 353 731 p + 354 731 p + 38 731 p + 20 731 p + 347 730 p + 348 730 p + 349 730 p + 499 730 p + 502 730 p + 19 730 p + 20 730 p + 344 729 p + 350 729 p + 347 729 p + 400 729 p + 399 729 p + 37 729 p + 38 729 p + 351 728 p + 352 728 p + 353 728 p + 398 728 p + 399 728 p + 38 728 p + 2 728 p + 351 727 p + 352 727 p + 353 727 p + 2 727 p + 39 727 p + 351 726 p + 352 726 p + 353 726 p + 348 726 p + 354 726 p + 38 726 p + 39 726 p + 354 725 p + 355 725 p + 356 725 p + 348 725 p + 353 725 p + 20 725 p + 39 725 p + 354 724 p + 355 724 p + 356 724 p + 39 724 p + 21 724 p + 354 723 p + 355 723 p + 356 723 p + 403 723 p + 404 723 p + 20 723 p + 21 723 p + 357 722 p + 289 722 p + 358 722 p + 361 722 p + 360 722 p + 40 722 p + 23 722 p + 357 721 p + 289 721 p + 358 721 p + 40 721 p + 22 721 p + 359 720 p + 294 720 p + 360 720 p + 364 720 p + 363 720 p + 41 720 p + 24 720 p + 359 719 p + 294 719 p + 360 719 p + 361 719 p + 357 719 p + 41 719 p + 23 719 p + 361 718 p + 360 718 p + 357 718 p + 405 718 p + 406 718 p + 40 718 p + 41 718 p + 362 717 p + 298 717 p + 363 717 p + 367 717 p + 366 717 p + 42 717 p + 25 717 p + 362 716 p + 298 716 p + 363 716 p + 364 716 p + 359 716 p + 42 716 p + 24 716 p + 364 715 p + 363 715 p + 359 715 p + 409 715 p + 410 715 p + 41 715 p + 42 715 p + 365 714 p + 302 714 p + 366 714 p + 370 714 p + 369 714 p + 43 714 p + 26 714 p + 365 713 p + 302 713 p + 366 713 p + 367 713 p + 362 713 p + 43 713 p + 25 713 p + 367 712 p + 366 712 p + 362 712 p + 412 712 p + 413 712 p + 42 712 p + 43 712 p + 368 711 p + 306 711 p + 369 711 p + 373 711 p + 372 711 p + 44 711 p + 27 711 p + 368 710 p + 306 710 p + 369 710 p + 370 710 p + 365 710 p + 44 710 p + 26 710 p + 370 709 p + 369 709 p + 365 709 p + 415 709 p + 416 709 p + 43 709 p + 44 709 p + 371 708 p + 310 708 p + 372 708 p + 376 708 p + 375 708 p + 45 708 p + 28 708 p + 371 707 p + 310 707 p + 372 707 p + 373 707 p + 368 707 p + 45 707 p + 27 707 p + 373 706 p + 372 706 p + 368 706 p + 418 706 p + 419 706 p + 44 706 p + 45 706 p + 374 705 p + 314 705 p + 375 705 p + 379 705 p + 378 705 p + 46 705 p + 29 705 p + 374 704 p + 314 704 p + 375 704 p + 376 704 p + 371 704 p + 46 704 p + 28 704 p + 376 703 p + 375 703 p + 371 703 p + 422 703 p + 423 703 p + 45 703 p + 46 703 p + 377 702 p + 318 702 p + 378 702 p + 382 702 p + 381 702 p + 47 702 p + 30 702 p + 377 701 p + 318 701 p + 378 701 p + 379 701 p + 374 701 p + 47 701 p + 29 701 p + 379 700 p + 378 700 p + 374 700 p + 421 700 p + 422 700 p + 46 700 p + 47 700 p + 380 699 p + 322 699 p + 381 699 p + 385 699 p + 384 699 p + 48 699 p + 31 699 p + 380 698 p + 322 698 p + 381 698 p + 382 698 p + 377 698 p + 48 698 p + 30 698 p + 382 697 p + 381 697 p + 377 697 p + 427 697 p + 428 697 p + 47 697 p + 48 697 p + 383 696 p + 326 696 p + 384 696 p + 388 696 p + 387 696 p + 49 696 p + 32 696 p + 383 695 p + 326 695 p + 384 695 p + 385 695 p + 380 695 p + 49 695 p + 31 695 p + 385 694 p + 384 694 p + 380 694 p + 430 694 p + 431 694 p + 48 694 p + 49 694 p + 386 693 p + 332 693 p + 387 693 p + 391 693 p + 390 693 p + 50 693 p + 33 693 p + 386 692 p + 332 692 p + 387 692 p + 388 692 p + 383 692 p + 50 692 p + 32 692 p + 388 691 p + 387 691 p + 383 691 p + 433 691 p + 434 691 p + 49 691 p + 50 691 p + 389 690 p + 336 690 p + 390 690 p + 394 690 p + 393 690 p + 51 690 p + 34 690 p + 389 689 p + 336 689 p + 390 689 p + 391 689 p + 386 689 p + 51 689 p + 33 689 p + 391 688 p + 390 688 p + 386 688 p + 436 688 p + 433 688 p + 50 688 p + 51 688 p + 392 687 p + 337 687 p + 393 687 p + 397 687 p + 396 687 p + 52 687 p + 35 687 p + 392 686 p + 337 686 p + 393 686 p + 394 686 p + 389 686 p + 52 686 p + 34 686 p + 394 685 p + 393 685 p + 389 685 p + 438 685 p + 440 685 p + 51 685 p + 52 685 p + 395 684 p + 342 684 p + 396 684 p + 402 684 p + 401 684 p + 53 684 p + 36 684 p + 395 683 p + 342 683 p + 396 683 p + 397 683 p + 392 683 p + 53 683 p + 35 683 p + 397 682 p + 396 682 p + 392 682 p + 437 682 p + 438 682 p + 52 682 p + 53 682 p + 398 681 p + 351 681 p + 399 681 p + 54 681 p + 2 681 p + 398 680 p + 351 680 p + 399 680 p + 400 680 p + 350 680 p + 54 680 p + 38 680 p + 400 679 p + 399 679 p + 350 679 p + 401 679 p + 346 679 p + 37 679 p + 54 679 p + 401 678 p + 400 678 p + 346 678 p + 395 678 p + 402 678 p + 36 678 p + 54 678 p + 395 677 p + 402 677 p + 401 677 p + 437 677 p + 439 677 p + 53 677 p + 54 677 p + 356 676 p + 403 676 p + 404 676 p + 21 676 p + 285 676 p + 356 675 p + 403 675 p + 404 675 p + 498 675 p + 499 675 p + 20 675 p + 285 675 p + 405 674 p + 361 674 p + 406 674 p + 411 674 p + 410 674 p + 56 674 p + 41 674 p + 405 673 p + 361 673 p + 406 673 p + 407 673 p + 408 673 p + 56 673 p + 40 673 p + 407 672 p + 406 672 p + 408 672 p + 442 672 p + 443 672 p + 55 672 p + 56 672 p + 407 671 p + 406 671 p + 408 671 p + 55 671 p + 40 671 p + 409 670 p + 364 670 p + 410 670 p + 414 670 p + 413 670 p + 57 670 p + 42 670 p + 409 669 p + 364 669 p + 410 669 p + 411 669 p + 405 669 p + 57 669 p + 41 669 p + 411 668 p + 410 668 p + 405 668 p + 446 668 p + 447 668 p + 56 668 p + 57 668 p + 412 667 p + 367 667 p + 413 667 p + 417 667 p + 416 667 p + 58 667 p + 43 667 p + 412 666 p + 367 666 p + 413 666 p + 414 666 p + 409 666 p + 58 666 p + 42 666 p + 414 665 p + 413 665 p + 409 665 p + 449 665 p + 450 665 p + 57 665 p + 58 665 p + 415 664 p + 370 664 p + 416 664 p + 420 664 p + 419 664 p + 59 664 p + 44 664 p + 415 663 p + 370 663 p + 416 663 p + 417 663 p + 412 663 p + 59 663 p + 43 663 p + 417 662 p + 416 662 p + 412 662 p + 452 662 p + 453 662 p + 58 662 p + 59 662 p + 418 661 p + 373 661 p + 419 661 p + 424 661 p + 423 661 p + 60 661 p + 45 661 p + 418 660 p + 373 660 p + 419 660 p + 420 660 p + 415 660 p + 60 660 p + 44 660 p + 420 659 p + 419 659 p + 415 659 p + 455 659 p + 456 659 p + 59 659 p + 60 659 p + 421 658 p + 379 658 p + 422 658 p + 425 658 p + 426 658 p + 61 658 p + 47 658 p + 421 657 p + 379 657 p + 422 657 p + 376 657 p + 423 657 p + 61 657 p + 46 657 p + 422 656 p + 376 656 p + 423 656 p + 424 656 p + 418 656 p + 61 656 p + 45 656 p + 424 655 p + 423 655 p + 418 655 p + 459 655 p + 460 655 p + 60 655 p + 61 655 p + 425 654 p + 426 654 p + 421 654 p + 458 654 p + 459 654 p + 61 654 p + 62 654 p + 425 653 p + 426 653 p + 421 653 p + 429 653 p + 428 653 p + 62 653 p + 47 653 p + 427 652 p + 382 652 p + 428 652 p + 432 652 p + 431 652 p + 63 652 p + 48 652 p + 427 651 p + 382 651 p + 428 651 p + 429 651 p + 426 651 p + 63 651 p + 47 651 p + 429 650 p + 428 650 p + 426 650 p + 462 650 p + 463 650 p + 62 650 p + 63 650 p + 430 649 p + 385 649 p + 431 649 p + 435 649 p + 434 649 p + 64 649 p + 49 649 p + 430 648 p + 385 648 p + 431 648 p + 432 648 p + 427 648 p + 64 648 p + 48 648 p + 432 647 p + 431 647 p + 427 647 p + 465 647 p + 466 647 p + 63 647 p + 64 647 p + 433 646 p + 388 646 p + 434 646 p + 436 646 p + 391 646 p + 65 646 p + 50 646 p + 433 645 p + 388 645 p + 434 645 p + 435 645 p + 430 645 p + 65 645 p + 49 645 p + 435 644 p + 434 644 p + 430 644 p + 468 644 p + 469 644 p + 64 644 p + 65 644 p + 436 643 p + 391 643 p + 433 643 p + 441 643 p + 440 643 p + 65 643 p + 51 643 p + 437 642 p + 397 642 p + 438 642 p + 402 642 p + 439 642 p + 66 642 p + 53 642 p + 437 641 p + 397 641 p + 438 641 p + 394 641 p + 440 641 p + 66 641 p + 52 641 p + 402 640 p + 437 640 p + 439 640 p + 54 640 p + 66 640 p + 438 639 p + 394 639 p + 440 639 p + 441 639 p + 436 639 p + 66 639 p + 51 639 p + 441 638 p + 440 638 p + 436 638 p + 468 638 p + 471 638 p + 65 638 p + 66 638 p + 442 637 p + 407 637 p + 443 637 p + 448 637 p + 447 637 p + 68 637 p + 56 637 p + 442 636 p + 407 636 p + 443 636 p + 444 636 p + 445 636 p + 68 636 p + 55 636 p + 444 635 p + 443 635 p + 445 635 p + 472 635 p + 473 635 p + 67 635 p + 68 635 p + 444 634 p + 443 634 p + 445 634 p + 67 634 p + 55 634 p + 446 633 p + 411 633 p + 447 633 p + 451 633 p + 450 633 p + 69 633 p + 57 633 p + 446 632 p + 411 632 p + 447 632 p + 448 632 p + 442 632 p + 69 632 p + 56 632 p + 448 631 p + 447 631 p + 442 631 p + 476 631 p + 472 631 p + 68 631 p + 69 631 p + 449 630 p + 414 630 p + 450 630 p + 454 630 p + 453 630 p + 70 630 p + 58 630 p + 449 629 p + 414 629 p + 450 629 p + 451 629 p + 446 629 p + 70 629 p + 57 629 p + 451 628 p + 450 628 p + 446 628 p + 480 628 p + 481 628 p + 69 628 p + 70 628 p + 452 627 p + 417 627 p + 453 627 p + 457 627 p + 456 627 p + 71 627 p + 59 627 p + 452 626 p + 417 626 p + 453 626 p + 454 626 p + 449 626 p + 71 626 p + 58 626 p + 454 625 p + 453 625 p + 449 625 p + 479 625 p + 480 625 p + 70 625 p + 71 625 p + 455 624 p + 420 624 p + 456 624 p + 461 624 p + 460 624 p + 72 624 p + 60 624 p + 455 623 p + 420 623 p + 456 623 p + 457 623 p + 452 623 p + 72 623 p + 59 623 p + 457 622 p + 456 622 p + 452 622 p + 483 622 p + 484 622 p + 71 622 p + 72 622 p + 458 621 p + 425 621 p + 459 621 p + 464 621 p + 463 621 p + 73 621 p + 62 621 p + 458 620 p + 425 620 p + 459 620 p + 424 620 p + 460 620 p + 73 620 p + 61 620 p + 459 619 p + 424 619 p + 460 619 p + 461 619 p + 455 619 p + 73 619 p + 60 619 p + 461 618 p + 460 618 p + 455 618 p + 486 618 p + 487 618 p + 72 618 p + 73 618 p + 462 617 p + 429 617 p + 463 617 p + 467 617 p + 466 617 p + 74 617 p + 63 617 p + 462 616 p + 429 616 p + 463 616 p + 464 616 p + 458 616 p + 74 616 p + 62 616 p + 464 615 p + 463 615 p + 458 615 p + 492 615 p + 493 615 p + 73 615 p + 74 615 p + 465 614 p + 432 614 p + 466 614 p + 470 614 p + 469 614 p + 75 614 p + 64 614 p + 465 613 p + 432 613 p + 466 613 p + 467 613 p + 462 613 p + 75 613 p + 63 613 p + 467 612 p + 466 612 p + 462 612 p + 491 612 p + 492 612 p + 74 612 p + 75 612 p + 468 611 p + 435 611 p + 469 611 p + 441 611 p + 471 611 p + 76 611 p + 65 611 p + 468 610 p + 435 610 p + 469 610 p + 470 610 p + 465 610 p + 76 610 p + 64 610 p + 470 609 p + 469 609 p + 465 609 p + 495 609 p + 497 609 p + 75 609 p + 76 609 p + 441 608 p + 468 608 p + 471 608 p + 66 608 p + 76 608 p + 472 607 p + 444 607 p + 473 607 p + 476 607 p + 448 607 p + 78 607 p + 68 607 p + 472 606 p + 444 606 p + 473 606 p + 474 606 p + 475 606 p + 78 606 p + 67 606 p + 474 605 p + 473 605 p + 475 605 p + 503 605 p + 504 605 p + 77 605 p + 78 605 p + 474 604 p + 473 604 p + 475 604 p + 77 604 p + 67 604 p + 476 603 p + 448 603 p + 472 603 p + 477 603 p + 478 603 p + 78 603 p + 69 603 p + 477 602 p + 478 602 p + 476 602 p + 507 602 p + 503 602 p + 78 602 p + 79 602 p + 477 601 p + 478 601 p + 476 601 p + 482 601 p + 481 601 p + 79 601 p + 69 601 p + 479 600 p + 454 600 p + 480 600 p + 485 600 p + 484 600 p + 80 600 p + 71 600 p + 479 599 p + 454 599 p + 480 599 p + 451 599 p + 481 599 p + 80 599 p + 70 599 p + 480 598 p + 451 598 p + 481 598 p + 482 598 p + 478 598 p + 80 598 p + 69 598 p + 482 597 p + 481 597 p + 478 597 p + 508 597 p + 509 597 p + 79 597 p + 80 597 p + 483 596 p + 457 596 p + 484 596 p + 488 596 p + 487 596 p + 81 596 p + 72 596 p + 483 595 p + 457 595 p + 484 595 p + 485 595 p + 479 595 p + 81 595 p + 71 595 p + 485 594 p + 484 594 p + 479 594 p + 511 594 p + 512 594 p + 80 594 p + 81 594 p + 486 593 p + 461 593 p + 487 593 p + 489 593 p + 490 593 p + 82 593 p + 73 593 p + 486 592 p + 461 592 p + 487 592 p + 488 592 p + 483 592 p + 82 592 p + 72 592 p + 488 591 p + 487 591 p + 483 591 p + 516 591 p + 517 591 p + 81 591 p + 82 591 p + 489 590 p + 490 590 p + 486 590 p + 519 590 p + 520 590 p + 82 590 p + 83 590 p + 489 589 p + 490 589 p + 486 589 p + 494 589 p + 493 589 p + 83 589 p + 73 589 p + 491 588 p + 467 588 p + 492 588 p + 495 588 p + 496 588 p + 84 588 p + 75 588 p + 491 587 p + 467 587 p + 492 587 p + 464 587 p + 493 587 p + 84 587 p + 74 587 p + 492 586 p + 464 586 p + 493 586 p + 494 586 p + 490 586 p + 84 586 p + 73 586 p + 494 585 p + 493 585 p + 490 585 p + 523 585 p + 524 585 p + 83 585 p + 84 585 p + 495 584 p + 491 584 p + 496 584 p + 470 584 p + 497 584 p + 85 584 p + 75 584 p + 495 583 p + 491 583 p + 496 583 p + 522 583 p + 523 583 p + 85 583 p + 84 583 p + 470 582 p + 495 582 p + 497 582 p + 76 582 p + 85 582 p + 404 581 p + 498 581 p + 499 581 p + 500 581 p + 501 581 p + 285 581 p + 284 581 p + 404 580 p + 498 580 p + 499 580 p + 349 580 p + 502 580 p + 20 580 p + 284 580 p + 498 579 p + 500 579 p + 501 579 p + 285 579 p + 1 579 p + 498 578 p + 500 578 p + 501 578 p + 602 578 p + 603 578 p + 284 578 p + 1 578 p + 349 577 p + 499 577 p + 502 577 p + 551 577 p + 552 577 p + 19 577 p + 284 577 p + 503 576 p + 474 576 p + 504 576 p + 507 576 p + 477 576 p + 87 576 p + 78 576 p + 503 575 p + 474 575 p + 504 575 p + 505 575 p + 506 575 p + 87 575 p + 77 575 p + 505 574 p + 504 574 p + 506 574 p + 528 574 p + 529 574 p + 86 574 p + 87 574 p + 505 573 p + 504 573 p + 506 573 p + 86 573 p + 77 573 p + 507 572 p + 477 572 p + 503 572 p + 510 572 p + 509 572 p + 87 572 p + 79 572 p + 508 571 p + 482 571 p + 509 571 p + 513 571 p + 512 571 p + 88 571 p + 80 571 p + 508 570 p + 482 570 p + 509 570 p + 510 570 p + 507 570 p + 88 570 p + 79 570 p + 510 569 p + 509 569 p + 507 569 p + 530 569 p + 531 569 p + 87 569 p + 88 569 p + 511 568 p + 485 568 p + 512 568 p + 514 568 p + 515 568 p + 89 568 p + 81 568 p + 511 567 p + 485 567 p + 512 567 p + 513 567 p + 508 567 p + 89 567 p + 80 567 p + 513 566 p + 512 566 p + 508 566 p + 533 566 p + 534 566 p + 88 566 p + 89 566 p + 514 565 p + 515 565 p + 511 565 p + 538 565 p + 539 565 p + 89 565 p + 90 565 p + 514 564 p + 515 564 p + 511 564 p + 518 564 p + 517 564 p + 90 564 p + 81 564 p + 516 563 p + 488 563 p + 517 563 p + 521 563 p + 520 563 p + 91 563 p + 82 563 p + 516 562 p + 488 562 p + 517 562 p + 518 562 p + 515 562 p + 91 562 p + 81 562 p + 518 561 p + 517 561 p + 515 561 p + 541 561 p + 542 561 p + 90 561 p + 91 561 p + 519 560 p + 489 560 p + 520 560 p + 525 560 p + 524 560 p + 92 560 p + 83 560 p + 519 559 p + 489 559 p + 520 559 p + 521 559 p + 516 559 p + 92 559 p + 82 559 p + 521 558 p + 520 558 p + 516 558 p + 545 558 p + 546 558 p + 91 558 p + 92 558 p + 522 557 p + 496 557 p + 523 557 p + 526 557 p + 527 557 p + 93 557 p + 85 557 p + 522 556 p + 496 556 p + 523 556 p + 494 556 p + 524 556 p + 93 556 p + 84 556 p + 523 555 p + 494 555 p + 524 555 p + 525 555 p + 519 555 p + 93 555 p + 83 555 p + 525 554 p + 524 554 p + 519 554 p + 544 554 p + 545 554 p + 92 554 p + 93 554 p + 526 553 p + 522 553 p + 527 553 p + 94 553 p + 85 553 p + 526 552 p + 522 552 p + 527 552 p + 548 552 p + 549 552 p + 94 552 p + 93 552 p + 528 551 p + 505 551 p + 529 551 p + 532 551 p + 531 551 p + 95 551 p + 87 551 p + 528 550 p + 505 550 p + 529 550 p + 95 550 p + 86 550 p + 530 549 p + 510 549 p + 531 549 p + 535 549 p + 534 549 p + 96 549 p + 88 549 p + 530 548 p + 510 548 p + 531 548 p + 532 548 p + 528 548 p + 96 548 p + 87 548 p + 532 547 p + 531 547 p + 528 547 p + 553 547 p + 554 547 p + 95 547 p + 96 547 p + 533 546 p + 513 546 p + 534 546 p + 536 546 p + 537 546 p + 97 546 p + 89 546 p + 533 545 p + 513 545 p + 534 545 p + 535 545 p + 530 545 p + 97 545 p + 88 545 p + 535 544 p + 534 544 p + 530 544 p + 557 544 p + 558 544 p + 96 544 p + 97 544 p + 536 543 p + 537 543 p + 533 543 p + 560 543 p + 561 543 p + 97 543 p + 98 543 p + 536 542 p + 537 542 p + 533 542 p + 540 542 p + 539 542 p + 98 542 p + 89 542 p + 538 541 p + 514 541 p + 539 541 p + 543 541 p + 542 541 p + 99 541 p + 90 541 p + 538 540 p + 514 540 p + 539 540 p + 540 540 p + 537 540 p + 99 540 p + 89 540 p + 540 539 p + 539 539 p + 537 539 p + 564 539 p + 565 539 p + 98 539 p + 99 539 p + 541 538 p + 518 538 p + 542 538 p + 547 538 p + 546 538 p + 100 538 p + 91 538 p + 541 537 p + 518 537 p + 542 537 p + 543 537 p + 538 537 p + 100 537 p + 90 537 p + 543 536 p + 542 536 p + 538 536 p + 563 536 p + 564 536 p + 99 536 p + 100 536 p + 544 535 p + 525 535 p + 545 535 p + 550 535 p + 549 535 p + 101 535 p + 93 535 p + 544 534 p + 525 534 p + 545 534 p + 521 534 p + 546 534 p + 101 534 p + 92 534 p + 545 533 p + 521 533 p + 546 533 p + 547 533 p + 541 533 p + 101 533 p + 91 533 p + 547 532 p + 546 532 p + 541 532 p + 567 532 p + 568 532 p + 100 532 p + 101 532 p + 548 531 p + 527 531 p + 549 531 p + 102 531 p + 94 531 p + 548 530 p + 527 530 p + 549 530 p + 550 530 p + 544 530 p + 102 530 p + 93 530 p + 550 529 p + 549 529 p + 544 529 p + 570 529 p + 571 529 p + 101 529 p + 102 529 p + 502 528 p + 551 528 p + 552 528 p + 601 528 p + 602 528 p + 284 528 p + 283 528 p + 502 527 p + 551 527 p + 552 527 p + 345 527 p + 650 527 p + 19 527 p + 283 527 p + 553 526 p + 532 526 p + 554 526 p + 559 526 p + 558 526 p + 104 526 p + 96 526 p + 553 525 p + 532 525 p + 554 525 p + 555 525 p + 556 525 p + 104 525 p + 95 525 p + 555 524 p + 554 524 p + 556 524 p + 575 524 p + 576 524 p + 103 524 p + 104 524 p + 555 523 p + 554 523 p + 556 523 p + 103 523 p + 95 523 p + 557 522 p + 535 522 p + 558 522 p + 562 522 p + 561 522 p + 105 522 p + 97 522 p + 557 521 p + 535 521 p + 558 521 p + 559 521 p + 553 521 p + 105 521 p + 96 521 p + 559 520 p + 558 520 p + 553 520 p + 577 520 p + 578 520 p + 104 520 p + 105 520 p + 560 519 p + 536 519 p + 561 519 p + 566 519 p + 565 519 p + 106 519 p + 98 519 p + 560 518 p + 536 518 p + 561 518 p + 562 518 p + 557 518 p + 106 518 p + 97 518 p + 562 517 p + 561 517 p + 557 517 p + 580 517 p + 581 517 p + 105 517 p + 106 517 p + 563 516 p + 543 516 p + 564 516 p + 569 516 p + 568 516 p + 107 516 p + 100 516 p + 563 515 p + 543 515 p + 564 515 p + 540 515 p + 565 515 p + 107 515 p + 99 515 p + 564 514 p + 540 514 p + 565 514 p + 566 514 p + 560 514 p + 107 514 p + 98 514 p + 566 513 p + 565 513 p + 560 513 p + 583 513 p + 584 513 p + 106 513 p + 107 513 p + 567 512 p + 547 512 p + 568 512 p + 572 512 p + 571 512 p + 108 512 p + 101 512 p + 567 511 p + 547 511 p + 568 511 p + 569 511 p + 563 511 p + 108 511 p + 100 511 p + 569 510 p + 568 510 p + 563 510 p + 586 510 p + 587 510 p + 107 510 p + 108 510 p + 570 509 p + 550 509 p + 571 509 p + 573 509 p + 574 509 p + 109 509 p + 102 509 p + 570 508 p + 550 508 p + 571 508 p + 572 508 p + 567 508 p + 109 508 p + 101 508 p + 572 507 p + 571 507 p + 567 507 p + 591 507 p + 592 507 p + 108 507 p + 109 507 p + 573 506 p + 570 506 p + 574 506 p + 110 506 p + 102 506 p + 573 505 p + 570 505 p + 574 505 p + 594 505 p + 595 505 p + 110 505 p + 109 505 p + 575 504 p + 555 504 p + 576 504 p + 579 504 p + 578 504 p + 111 504 p + 104 504 p + 575 503 p + 555 503 p + 576 503 p + 111 503 p + 103 503 p + 577 502 p + 559 502 p + 578 502 p + 582 502 p + 581 502 p + 112 502 p + 105 502 p + 577 501 p + 559 501 p + 578 501 p + 579 501 p + 575 501 p + 112 501 p + 104 501 p + 579 500 p + 578 500 p + 575 500 p + 604 500 p + 605 500 p + 111 500 p + 112 500 p + 580 499 p + 562 499 p + 581 499 p + 585 499 p + 584 499 p + 113 499 p + 106 499 p + 580 498 p + 562 498 p + 581 498 p + 582 498 p + 577 498 p + 113 498 p + 105 498 p + 582 497 p + 581 497 p + 577 497 p + 608 497 p + 609 497 p + 112 497 p + 113 497 p + 583 496 p + 566 496 p + 584 496 p + 588 496 p + 587 496 p + 114 496 p + 107 496 p + 583 495 p + 566 495 p + 584 495 p + 585 495 p + 580 495 p + 114 495 p + 106 495 p + 585 494 p + 584 494 p + 580 494 p + 611 494 p + 612 494 p + 113 494 p + 114 494 p + 586 493 p + 569 493 p + 587 493 p + 589 493 p + 590 493 p + 115 493 p + 108 493 p + 586 492 p + 569 492 p + 587 492 p + 588 492 p + 583 492 p + 115 492 p + 107 492 p + 588 491 p + 587 491 p + 583 491 p + 614 491 p + 615 491 p + 114 491 p + 115 491 p + 589 490 p + 590 490 p + 586 490 p + 618 490 p + 619 490 p + 115 490 p + 116 490 p + 589 489 p + 590 489 p + 586 489 p + 593 489 p + 592 489 p + 116 489 p + 108 489 p + 591 488 p + 572 488 p + 592 488 p + 596 488 p + 595 488 p + 117 488 p + 109 488 p + 591 487 p + 572 487 p + 592 487 p + 593 487 p + 590 487 p + 117 487 p + 108 487 p + 593 486 p + 592 486 p + 590 486 p + 617 486 p + 618 486 p + 116 486 p + 117 486 p + 594 485 p + 574 485 p + 595 485 p + 597 485 p + 598 485 p + 118 485 p + 110 485 p + 594 484 p + 574 484 p + 595 484 p + 596 484 p + 591 484 p + 118 484 p + 109 484 p + 596 483 p + 595 483 p + 591 483 p + 621 483 p + 622 483 p + 117 483 p + 118 483 p + 597 482 p + 594 482 p + 598 482 p + 119 482 p + 110 482 p + 597 481 p + 594 481 p + 598 481 p + 599 481 p + 600 481 p + 119 481 p + 118 481 p + 599 480 p + 598 480 p + 600 480 p + 3 480 p + 119 480 p + 599 479 p + 598 479 p + 600 479 p + 624 479 p + 626 479 p + 3 479 p + 118 479 p + 601 478 p + 551 478 p + 602 478 p + 708 478 p + 668 478 p + 267 478 p + 283 478 p + 601 477 p + 551 477 p + 602 477 p + 501 477 p + 603 477 p + 267 477 p + 284 477 p + 602 476 p + 501 476 p + 603 476 p + 267 476 p + 1 476 p + 604 475 p + 579 475 p + 605 475 p + 610 475 p + 609 475 p + 121 475 p + 112 475 p + 604 474 p + 579 474 p + 605 474 p + 606 474 p + 607 474 p + 121 474 p + 111 474 p + 606 473 p + 605 473 p + 607 473 p + 630 473 p + 631 473 p + 120 473 p + 121 473 p + 606 472 p + 605 472 p + 607 472 p + 120 472 p + 111 472 p + 608 471 p + 582 471 p + 609 471 p + 613 471 p + 612 471 p + 122 471 p + 113 471 p + 608 470 p + 582 470 p + 609 470 p + 610 470 p + 604 470 p + 122 470 p + 112 470 p + 610 469 p + 609 469 p + 604 469 p + 632 469 p + 633 469 p + 121 469 p + 122 469 p + 611 468 p + 585 468 p + 612 468 p + 616 468 p + 615 468 p + 123 468 p + 114 468 p + 611 467 p + 585 467 p + 612 467 p + 613 467 p + 608 467 p + 123 467 p + 113 467 p + 613 466 p + 612 466 p + 608 466 p + 637 466 p + 638 466 p + 122 466 p + 123 466 p + 614 465 p + 588 465 p + 615 465 p + 620 465 p + 619 465 p + 124 465 p + 115 465 p + 614 464 p + 588 464 p + 615 464 p + 616 464 p + 611 464 p + 124 464 p + 114 464 p + 616 463 p + 615 463 p + 611 463 p + 640 463 p + 641 463 p + 123 463 p + 124 463 p + 617 462 p + 593 462 p + 618 462 p + 623 462 p + 622 462 p + 125 462 p + 117 462 p + 617 461 p + 593 461 p + 618 461 p + 589 461 p + 619 461 p + 125 461 p + 116 461 p + 618 460 p + 589 460 p + 619 460 p + 620 460 p + 614 460 p + 125 460 p + 115 460 p + 620 459 p + 619 459 p + 614 459 p + 644 459 p + 645 459 p + 124 459 p + 125 459 p + 621 458 p + 596 458 p + 622 458 p + 624 458 p + 625 458 p + 126 458 p + 118 458 p + 621 457 p + 596 457 p + 622 457 p + 623 457 p + 617 457 p + 126 457 p + 117 457 p + 623 456 p + 622 456 p + 617 456 p + 643 456 p + 644 456 p + 125 456 p + 126 456 p + 624 455 p + 621 455 p + 625 455 p + 600 455 p + 626 455 p + 127 455 p + 118 455 p + 624 454 p + 621 454 p + 625 454 p + 627 454 p + 628 454 p + 127 454 p + 126 454 p + 600 453 p + 624 453 p + 626 453 p + 629 453 p + 627 453 p + 3 453 p + 127 453 p + 627 452 p + 625 452 p + 628 452 p + 629 452 p + 626 452 p + 128 452 p + 127 452 p + 627 451 p + 625 451 p + 628 451 p + 647 451 p + 649 451 p + 128 451 p + 126 451 p + 629 450 p + 626 450 p + 627 450 p + 128 450 p + 3 450 p + 630 449 p + 606 449 p + 631 449 p + 634 449 p + 633 449 p + 129 449 p + 121 449 p + 630 448 p + 606 448 p + 631 448 p + 129 448 p + 120 448 p + 632 447 p + 610 447 p + 633 447 p + 635 447 p + 636 447 p + 130 447 p + 122 447 p + 632 446 p + 610 446 p + 633 446 p + 634 446 p + 630 446 p + 130 446 p + 121 446 p + 634 445 p + 633 445 p + 630 445 p + 651 445 p + 652 445 p + 129 445 p + 130 445 p + 635 444 p + 636 444 p + 632 444 p + 655 444 p + 656 444 p + 130 444 p + 131 444 p + 635 443 p + 636 443 p + 632 443 p + 639 443 p + 638 443 p + 131 443 p + 122 443 p + 637 442 p + 613 442 p + 638 442 p + 642 442 p + 641 442 p + 132 442 p + 123 442 p + 637 441 p + 613 441 p + 638 441 p + 639 441 p + 636 441 p + 132 441 p + 122 441 p + 639 440 p + 638 440 p + 636 440 p + 659 440 p + 660 440 p + 131 440 p + 132 440 p + 640 439 p + 616 439 p + 641 439 p + 646 439 p + 645 439 p + 133 439 p + 124 439 p + 640 438 p + 616 438 p + 641 438 p + 642 438 p + 637 438 p + 133 438 p + 123 438 p + 642 437 p + 641 437 p + 637 437 p + 658 437 p + 659 437 p + 132 437 p + 133 437 p + 643 436 p + 623 436 p + 644 436 p + 647 436 p + 648 436 p + 134 436 p + 126 436 p + 643 435 p + 623 435 p + 644 435 p + 620 435 p + 645 435 p + 134 435 p + 125 435 p + 644 434 p + 620 434 p + 645 434 p + 646 434 p + 640 434 p + 134 434 p + 124 434 p + 646 433 p + 645 433 p + 640 433 p + 662 433 p + 663 433 p + 133 433 p + 134 433 p + 647 432 p + 643 432 p + 648 432 p + 628 432 p + 649 432 p + 135 432 p + 126 432 p + 647 431 p + 643 431 p + 648 431 p + 665 431 p + 667 431 p + 135 431 p + 134 431 p + 628 430 p + 647 430 p + 649 430 p + 128 430 p + 135 430 p + 345 429 p + 552 429 p + 650 429 p + 668 429 p + 669 429 p + 18 429 p + 283 429 p + 651 428 p + 634 428 p + 652 428 p + 657 428 p + 656 428 p + 137 428 p + 130 428 p + 651 427 p + 634 427 p + 652 427 p + 653 427 p + 654 427 p + 137 427 p + 129 427 p + 653 426 p + 652 426 p + 654 426 p + 670 426 p + 671 426 p + 136 426 p + 137 426 p + 653 425 p + 652 425 p + 654 425 p + 136 425 p + 129 425 p + 655 424 p + 635 424 p + 656 424 p + 661 424 p + 660 424 p + 138 424 p + 131 424 p + 655 423 p + 635 423 p + 656 423 p + 657 423 p + 651 423 p + 138 423 p + 130 423 p + 657 422 p + 656 422 p + 651 422 p + 672 422 p + 673 422 p + 137 422 p + 138 422 p + 658 421 p + 642 421 p + 659 421 p + 664 421 p + 663 421 p + 139 421 p + 133 421 p + 658 420 p + 642 420 p + 659 420 p + 639 420 p + 660 420 p + 139 420 p + 132 420 p + 659 419 p + 639 419 p + 660 419 p + 661 419 p + 655 419 p + 139 419 p + 131 419 p + 661 418 p + 660 418 p + 655 418 p + 675 418 p + 676 418 p + 138 418 p + 139 418 p + 662 417 p + 646 417 p + 663 417 p + 665 417 p + 666 417 p + 140 417 p + 134 417 p + 662 416 p + 646 416 p + 663 416 p + 664 416 p + 658 416 p + 140 416 p + 133 416 p + 664 415 p + 663 415 p + 658 415 p + 678 415 p + 679 415 p + 139 415 p + 140 415 p + 665 414 p + 662 414 p + 666 414 p + 648 414 p + 667 414 p + 141 414 p + 134 414 p + 665 413 p + 662 413 p + 666 413 p + 681 413 p + 683 413 p + 141 413 p + 140 413 p + 648 412 p + 665 412 p + 667 412 p + 135 412 p + 141 412 p + 650 411 p + 668 411 p + 669 411 p + 708 411 p + 601 411 p + 283 411 p + 282 411 p + 650 410 p + 668 410 p + 669 410 p + 709 410 p + 710 410 p + 18 410 p + 282 410 p + 670 409 p + 653 409 p + 671 409 p + 674 409 p + 673 409 p + 142 409 p + 137 409 p + 670 408 p + 653 408 p + 671 408 p + 142 408 p + 136 408 p + 672 407 p + 657 407 p + 673 407 p + 677 407 p + 676 407 p + 143 407 p + 138 407 p + 672 406 p + 657 406 p + 673 406 p + 674 406 p + 670 406 p + 143 406 p + 137 406 p + 674 405 p + 673 405 p + 670 405 p + 684 405 p + 685 405 p + 142 405 p + 143 405 p + 675 404 p + 661 404 p + 676 404 p + 679 404 p + 680 404 p + 144 404 p + 139 404 p + 675 403 p + 661 403 p + 676 403 p + 677 403 p + 672 403 p + 144 403 p + 138 403 p + 677 402 p + 676 402 p + 672 402 p + 688 402 p + 684 402 p + 143 402 p + 144 402 p + 678 401 p + 664 401 p + 679 401 p + 681 401 p + 682 401 p + 145 401 p + 140 401 p + 678 400 p + 664 400 p + 679 400 p + 675 400 p + 680 400 p + 145 400 p + 139 400 p + 679 399 p + 675 399 p + 680 399 p + 692 399 p + 693 399 p + 145 399 p + 144 399 p + 681 398 p + 678 398 p + 682 398 p + 666 398 p + 683 398 p + 146 398 p + 140 398 p + 681 397 p + 678 397 p + 682 397 p + 691 397 p + 692 397 p + 146 397 p + 145 397 p + 666 396 p + 681 396 p + 683 396 p + 141 396 p + 146 396 p + 684 395 p + 674 395 p + 685 395 p + 688 395 p + 677 395 p + 148 395 p + 143 395 p + 684 394 p + 674 394 p + 685 394 p + 686 394 p + 687 394 p + 148 394 p + 142 394 p + 686 393 p + 685 393 p + 687 393 p + 697 393 p + 698 393 p + 147 393 p + 148 393 p + 686 392 p + 685 392 p + 687 392 p + 147 392 p + 142 392 p + 688 391 p + 677 391 p + 684 391 p + 689 391 p + 690 391 p + 148 391 p + 144 391 p + 689 390 p + 690 390 p + 688 390 p + 699 390 p + 700 390 p + 148 390 p + 149 390 p + 689 389 p + 690 389 p + 688 389 p + 694 389 p + 693 389 p + 149 389 p + 144 389 p + 691 388 p + 682 388 p + 692 388 p + 695 388 p + 696 388 p + 150 388 p + 146 388 p + 691 387 p + 682 387 p + 692 387 p + 680 387 p + 693 387 p + 150 387 p + 145 387 p + 692 386 p + 680 386 p + 693 386 p + 694 386 p + 690 386 p + 150 386 p + 144 386 p + 694 385 p + 693 385 p + 690 385 p + 702 385 p + 703 385 p + 149 385 p + 150 385 p + 695 384 p + 691 384 p + 696 384 p + 151 384 p + 146 384 p + 695 383 p + 691 383 p + 696 383 p + 705 383 p + 707 383 p + 151 383 p + 150 383 p + 697 382 p + 686 382 p + 698 382 p + 701 382 p + 700 382 p + 152 382 p + 148 382 p + 697 381 p + 686 381 p + 698 381 p + 152 381 p + 147 381 p + 699 380 p + 689 380 p + 700 380 p + 704 380 p + 703 380 p + 153 380 p + 149 380 p + 699 379 p + 689 379 p + 700 379 p + 701 379 p + 697 379 p + 153 379 p + 148 379 p + 701 378 p + 700 378 p + 697 378 p + 713 378 p + 714 378 p + 152 378 p + 153 378 p + 702 377 p + 694 377 p + 703 377 p + 705 377 p + 706 377 p + 154 377 p + 150 377 p + 702 376 p + 694 376 p + 703 376 p + 704 376 p + 699 376 p + 154 376 p + 149 376 p + 704 375 p + 703 375 p + 699 375 p + 715 375 p + 716 375 p + 153 375 p + 154 375 p + 705 374 p + 702 374 p + 706 374 p + 696 374 p + 707 374 p + 155 374 p + 150 374 p + 705 373 p + 702 373 p + 706 373 p + 720 373 p + 721 373 p + 155 373 p + 154 373 p + 696 372 p + 705 372 p + 707 372 p + 151 372 p + 155 372 p + 708 371 p + 668 371 p + 601 371 p + 753 371 p + 711 371 p + 267 371 p + 282 371 p + 669 370 p + 709 370 p + 710 370 p + 711 370 p + 712 370 p + 282 370 p + 281 370 p + 669 369 p + 709 369 p + 710 369 p + 341 369 p + 776 369 p + 18 369 p + 281 369 p + 709 368 p + 711 368 p + 712 368 p + 708 368 p + 753 368 p + 282 368 p + 266 368 p + 709 367 p + 711 367 p + 712 367 p + 757 367 p + 755 367 p + 281 367 p + 266 367 p + 713 366 p + 701 366 p + 714 366 p + 717 366 p + 716 366 p + 156 366 p + 153 366 p + 713 365 p + 701 365 p + 714 365 p + 156 365 p + 152 365 p + 715 364 p + 704 364 p + 716 364 p + 718 364 p + 719 364 p + 157 364 p + 154 364 p + 715 363 p + 704 363 p + 716 363 p + 717 363 p + 713 363 p + 157 363 p + 153 363 p + 717 362 p + 716 362 p + 713 362 p + 725 362 p + 726 362 p + 156 362 p + 157 362 p + 718 361 p + 719 361 p + 715 361 p + 729 361 p + 730 361 p + 157 361 p + 158 361 p + 718 360 p + 719 360 p + 715 360 p + 722 360 p + 721 360 p + 158 360 p + 154 360 p + 720 359 p + 706 359 p + 721 359 p + 723 359 p + 724 359 p + 159 359 p + 155 359 p + 720 358 p + 706 358 p + 721 358 p + 722 358 p + 719 358 p + 159 358 p + 154 358 p + 722 357 p + 721 357 p + 719 357 p + 732 357 p + 733 357 p + 158 357 p + 159 357 p + 723 356 p + 720 356 p + 724 356 p + 160 356 p + 155 356 p + 723 355 p + 720 355 p + 724 355 p + 735 355 p + 736 355 p + 160 355 p + 159 355 p + 725 354 p + 717 354 p + 726 354 p + 727 354 p + 728 354 p + 161 354 p + 157 354 p + 725 353 p + 717 353 p + 726 353 p + 161 353 p + 156 353 p + 727 352 p + 728 352 p + 725 352 p + 738 352 p + 739 352 p + 161 352 p + 162 352 p + 727 351 p + 728 351 p + 725 351 p + 731 351 p + 730 351 p + 162 351 p + 157 351 p + 729 350 p + 718 350 p + 730 350 p + 734 350 p + 733 350 p + 163 350 p + 158 350 p + 729 349 p + 718 349 p + 730 349 p + 731 349 p + 728 349 p + 163 349 p + 157 349 p + 731 348 p + 730 348 p + 728 348 p + 740 348 p + 741 348 p + 162 348 p + 163 348 p + 732 347 p + 722 347 p + 733 347 p + 737 347 p + 736 347 p + 164 347 p + 159 347 p + 732 346 p + 722 346 p + 733 346 p + 734 346 p + 729 346 p + 164 346 p + 158 346 p + 734 345 p + 733 345 p + 729 345 p + 743 345 p + 744 345 p + 163 345 p + 164 345 p + 735 344 p + 724 344 p + 736 344 p + 165 344 p + 160 344 p + 735 343 p + 724 343 p + 736 343 p + 737 343 p + 732 343 p + 165 343 p + 159 343 p + 737 342 p + 736 342 p + 732 342 p + 748 342 p + 749 342 p + 164 342 p + 165 342 p + 738 341 p + 727 341 p + 739 341 p + 742 341 p + 741 341 p + 166 341 p + 162 341 p + 738 340 p + 727 340 p + 739 340 p + 166 340 p + 161 340 p + 740 339 p + 731 339 p + 741 339 p + 745 339 p + 744 339 p + 167 339 p + 163 339 p + 740 338 p + 731 338 p + 741 338 p + 742 338 p + 738 338 p + 167 338 p + 162 338 p + 742 337 p + 741 337 p + 738 337 p + 758 337 p + 759 337 p + 166 337 p + 167 337 p + 743 336 p + 734 336 p + 744 336 p + 746 336 p + 747 336 p + 168 336 p + 164 336 p + 743 335 p + 734 335 p + 744 335 p + 745 335 p + 740 335 p + 168 335 p + 163 335 p + 745 334 p + 744 334 p + 740 334 p + 762 334 p + 763 334 p + 167 334 p + 168 334 p + 746 333 p + 747 333 p + 743 333 p + 765 333 p + 766 333 p + 168 333 p + 169 333 p + 746 332 p + 747 332 p + 743 332 p + 750 332 p + 749 332 p + 169 332 p + 164 332 p + 748 331 p + 737 331 p + 749 331 p + 751 331 p + 752 331 p + 170 331 p + 165 331 p + 748 330 p + 737 330 p + 749 330 p + 750 330 p + 747 330 p + 170 330 p + 164 330 p + 750 329 p + 749 329 p + 747 329 p + 768 329 p + 769 329 p + 169 329 p + 170 329 p + 751 328 p + 748 328 p + 752 328 p + 171 328 p + 165 328 p + 751 327 p + 748 327 p + 752 327 p + 771 327 p + 772 327 p + 171 327 p + 170 327 p + 708 326 p + 753 326 p + 711 326 p + 1031 326 p + 1032 326 p + 267 326 p + 266 326 p + 754 325 p + 755 325 p + 756 325 p + 776 325 p + 777 325 p + 280 325 p + 281 325 p + 754 324 p + 755 324 p + 756 324 p + 712 324 p + 757 324 p + 281 324 p + 265 324 p + 754 323 p + 755 323 p + 756 323 p + 900 323 p + 829 323 p + 280 323 p + 265 323 p + 712 322 p + 757 322 p + 755 322 p + 1030 322 p + 1031 322 p + 266 322 p + 265 322 p + 758 321 p + 759 321 p + 742 321 p + 760 321 p + 761 321 p + 166 321 p + 173 321 p + 758 320 p + 759 320 p + 742 320 p + 764 320 p + 763 320 p + 173 320 p + 167 320 p + 760 319 p + 761 319 p + 758 319 p + 166 319 p + 172 319 p + 760 318 p + 761 318 p + 758 318 p + 778 318 p + 779 318 p + 172 318 p + 173 318 p + 762 317 p + 745 317 p + 763 317 p + 767 317 p + 766 317 p + 174 317 p + 168 317 p + 762 316 p + 745 316 p + 763 316 p + 764 316 p + 759 316 p + 174 316 p + 167 316 p + 764 315 p + 763 315 p + 759 315 p + 780 315 p + 781 315 p + 173 315 p + 174 315 p + 765 314 p + 746 314 p + 766 314 p + 770 314 p + 769 314 p + 175 314 p + 169 314 p + 765 313 p + 746 313 p + 766 313 p + 767 313 p + 762 313 p + 175 313 p + 168 313 p + 767 312 p + 766 312 p + 762 312 p + 783 312 p + 784 312 p + 174 312 p + 175 312 p + 768 311 p + 750 311 p + 769 311 p + 773 311 p + 772 311 p + 176 311 p + 170 311 p + 768 310 p + 750 310 p + 769 310 p + 770 310 p + 765 310 p + 176 310 p + 169 310 p + 770 309 p + 769 309 p + 765 309 p + 786 309 p + 787 309 p + 175 309 p + 176 309 p + 771 308 p + 752 308 p + 772 308 p + 774 308 p + 775 308 p + 177 308 p + 171 308 p + 771 307 p + 752 307 p + 772 307 p + 773 307 p + 768 307 p + 177 307 p + 170 307 p + 773 306 p + 772 306 p + 768 306 p + 789 306 p + 790 306 p + 176 306 p + 177 306 p + 774 305 p + 771 305 p + 775 305 p + 178 305 p + 171 305 p + 774 304 p + 771 304 p + 775 304 p + 794 304 p + 795 304 p + 178 304 p + 177 304 p + 341 303 p + 710 303 p + 776 303 p + 754 303 p + 777 303 p + 17 303 p + 281 303 p + 776 302 p + 754 302 p + 777 302 p + 335 302 p + 901 302 p + 17 302 p + 280 302 p + 778 301 p + 779 301 p + 761 301 p + 172 301 p + 179 301 p + 778 300 p + 779 300 p + 761 300 p + 782 300 p + 780 300 p + 179 300 p + 173 300 p + 780 299 p + 781 299 p + 764 299 p + 779 299 p + 782 299 p + 173 299 p + 180 299 p + 780 298 p + 781 298 p + 764 298 p + 785 298 p + 783 298 p + 180 298 p + 174 298 p + 779 297 p + 782 297 p + 780 297 p + 803 297 p + 804 297 p + 179 297 p + 180 297 p + 783 296 p + 784 296 p + 767 296 p + 781 296 p + 785 296 p + 174 296 p + 181 296 p + 783 295 p + 784 295 p + 767 295 p + 788 295 p + 787 295 p + 181 295 p + 175 295 p + 781 294 p + 785 294 p + 783 294 p + 805 294 p + 806 294 p + 180 294 p + 181 294 p + 786 293 p + 770 293 p + 787 293 p + 791 293 p + 790 293 p + 182 293 p + 176 293 p + 786 292 p + 770 292 p + 787 292 p + 788 292 p + 784 292 p + 182 292 p + 175 292 p + 788 291 p + 787 291 p + 784 291 p + 808 291 p + 809 291 p + 181 291 p + 182 291 p + 789 290 p + 773 290 p + 790 290 p + 792 290 p + 793 290 p + 183 290 p + 177 290 p + 789 289 p + 773 289 p + 790 289 p + 791 289 p + 786 289 p + 183 289 p + 176 289 p + 791 288 p + 790 288 p + 786 288 p + 811 288 p + 812 288 p + 182 288 p + 183 288 p + 792 287 p + 793 287 p + 789 287 p + 814 287 p + 815 287 p + 183 287 p + 184 287 p + 792 286 p + 793 286 p + 789 286 p + 796 286 p + 795 286 p + 184 286 p + 177 286 p + 794 285 p + 775 285 p + 795 285 p + 797 285 p + 798 285 p + 185 285 p + 178 285 p + 794 284 p + 775 284 p + 795 284 p + 796 284 p + 793 284 p + 185 284 p + 177 284 p + 796 283 p + 795 283 p + 793 283 p + 817 283 p + 818 283 p + 184 283 p + 185 283 p + 797 282 p + 794 282 p + 798 282 p + 187 282 p + 178 282 p + 797 281 p + 794 281 p + 798 281 p + 799 281 p + 800 281 p + 187 281 p + 185 281 p + 799 280 p + 798 280 p + 800 280 p + 801 280 p + 802 280 p + 186 280 p + 187 280 p + 799 279 p + 798 279 p + 800 279 p + 820 279 p + 821 279 p + 186 279 p + 185 279 p + 801 278 p + 799 278 p + 802 278 p + 0 278 p + 187 278 p + 801 277 p + 799 277 p + 802 277 p + 823 277 p + 825 277 p + 0 277 p + 186 277 p + 803 276 p + 804 276 p + 782 276 p + 179 276 p + 188 276 p + 803 275 p + 804 275 p + 782 275 p + 807 275 p + 805 275 p + 188 275 p + 180 275 p + 805 274 p + 806 274 p + 785 274 p + 804 274 p + 807 274 p + 180 274 p + 189 274 p + 805 273 p + 806 273 p + 785 273 p + 810 273 p + 808 273 p + 189 273 p + 181 273 p + 804 272 p + 807 272 p + 805 272 p + 831 272 p + 832 272 p + 188 272 p + 189 272 p + 808 271 p + 809 271 p + 788 271 p + 806 271 p + 810 271 p + 181 271 p + 190 271 p + 808 270 p + 809 270 p + 788 270 p + 813 270 p + 811 270 p + 190 270 p + 182 270 p + 806 269 p + 810 269 p + 808 269 p + 835 269 p + 836 269 p + 189 269 p + 190 269 p + 811 268 p + 812 268 p + 791 268 p + 809 268 p + 813 268 p + 182 268 p + 191 268 p + 811 267 p + 812 267 p + 791 267 p + 816 267 p + 814 267 p + 191 267 p + 183 267 p + 809 266 p + 813 266 p + 811 266 p + 838 266 p + 839 266 p + 190 266 p + 191 266 p + 814 265 p + 815 265 p + 792 265 p + 812 265 p + 816 265 p + 183 265 p + 192 265 p + 814 264 p + 815 264 p + 792 264 p + 819 264 p + 817 264 p + 192 264 p + 184 264 p + 812 263 p + 816 263 p + 814 263 p + 841 263 p + 842 263 p + 191 263 p + 192 263 p + 817 262 p + 818 262 p + 796 262 p + 815 262 p + 819 262 p + 184 262 p + 193 262 p + 817 261 p + 818 261 p + 796 261 p + 822 261 p + 820 261 p + 193 261 p + 185 261 p + 815 260 p + 819 260 p + 817 260 p + 844 260 p + 845 260 p + 192 260 p + 193 260 p + 820 259 p + 821 259 p + 800 259 p + 818 259 p + 822 259 p + 185 259 p + 194 259 p + 820 258 p + 821 258 p + 800 258 p + 823 258 p + 824 258 p + 194 258 p + 186 258 p + 818 257 p + 822 257 p + 820 257 p + 849 257 p + 847 257 p + 193 257 p + 194 257 p + 823 256 p + 821 256 p + 824 256 p + 802 256 p + 825 256 p + 195 256 p + 186 256 p + 823 255 p + 821 255 p + 824 255 p + 847 255 p + 848 255 p + 195 255 p + 194 255 p + 802 254 p + 823 254 p + 825 254 p + 826 254 p + 827 254 p + 0 254 p + 195 254 p + 825 253 p + 826 253 p + 827 253 p + 851 253 p + 852 253 p + 195 253 p + 196 253 p + 825 252 p + 826 252 p + 827 252 p + 0 252 p + 196 252 p + 828 251 p + 829 251 p + 830 251 p + 901 251 p + 927 251 p + 279 251 p + 280 251 p + 828 250 p + 829 250 p + 830 250 p + 756 250 p + 900 250 p + 280 250 p + 264 250 p + 828 249 p + 829 249 p + 830 249 p + 931 249 p + 929 249 p + 279 249 p + 264 249 p + 831 248 p + 832 248 p + 807 248 p + 833 248 p + 834 248 p + 188 248 p + 198 248 p + 831 247 p + 832 247 p + 807 247 p + 837 247 p + 835 247 p + 198 247 p + 189 247 p + 833 246 p + 834 246 p + 831 246 p + 188 246 p + 197 246 p + 833 245 p + 834 245 p + 831 245 p + 854 245 p + 855 245 p + 197 245 p + 198 245 p + 835 244 p + 836 244 p + 810 244 p + 832 244 p + 837 244 p + 189 244 p + 199 244 p + 835 243 p + 836 243 p + 810 243 p + 840 243 p + 838 243 p + 199 243 p + 190 243 p + 832 242 p + 837 242 p + 835 242 p + 856 242 p + 857 242 p + 198 242 p + 199 242 p + 838 241 p + 839 241 p + 813 241 p + 836 241 p + 840 241 p + 190 241 p + 200 241 p + 838 240 p + 839 240 p + 813 240 p + 843 240 p + 841 240 p + 200 240 p + 191 240 p + 836 239 p + 840 239 p + 838 239 p + 859 239 p + 860 239 p + 199 239 p + 200 239 p + 841 238 p + 842 238 p + 816 238 p + 839 238 p + 843 238 p + 191 238 p + 201 238 p + 841 237 p + 842 237 p + 816 237 p + 846 237 p + 844 237 p + 201 237 p + 192 237 p + 839 236 p + 843 236 p + 841 236 p + 862 236 p + 863 236 p + 200 236 p + 201 236 p + 844 235 p + 845 235 p + 819 235 p + 842 235 p + 846 235 p + 192 235 p + 202 235 p + 844 234 p + 845 234 p + 819 234 p + 850 234 p + 849 234 p + 202 234 p + 193 234 p + 842 233 p + 846 233 p + 844 233 p + 865 233 p + 866 233 p + 201 233 p + 202 233 p + 847 232 p + 848 232 p + 824 232 p + 849 232 p + 822 232 p + 194 232 p + 203 232 p + 847 231 p + 848 231 p + 824 231 p + 853 231 p + 852 231 p + 203 231 p + 195 231 p + 849 230 p + 847 230 p + 822 230 p + 845 230 p + 850 230 p + 193 230 p + 203 230 p + 845 229 p + 850 229 p + 849 229 p + 870 229 p + 871 229 p + 202 229 p + 203 229 p + 851 228 p + 826 228 p + 852 228 p + 204 228 p + 196 228 p + 851 227 p + 826 227 p + 852 227 p + 853 227 p + 848 227 p + 204 227 p + 195 227 p + 853 226 p + 852 226 p + 848 226 p + 871 226 p + 873 226 p + 203 226 p + 204 226 p + 854 225 p + 855 225 p + 834 225 p + 197 225 p + 205 225 p + 854 224 p + 855 224 p + 834 224 p + 858 224 p + 856 224 p + 205 224 p + 198 224 p + 856 223 p + 857 223 p + 837 223 p + 855 223 p + 858 223 p + 198 223 p + 206 223 p + 856 222 p + 857 222 p + 837 222 p + 861 222 p + 859 222 p + 206 222 p + 199 222 p + 855 221 p + 858 221 p + 856 221 p + 876 221 p + 877 221 p + 205 221 p + 206 221 p + 859 220 p + 860 220 p + 840 220 p + 857 220 p + 861 220 p + 199 220 p + 207 220 p + 859 219 p + 860 219 p + 840 219 p + 864 219 p + 862 219 p + 207 219 p + 200 219 p + 857 218 p + 861 218 p + 859 218 p + 878 218 p + 879 218 p + 206 218 p + 207 218 p + 862 217 p + 863 217 p + 843 217 p + 860 217 p + 864 217 p + 200 217 p + 208 217 p + 862 216 p + 863 216 p + 843 216 p + 867 216 p + 865 216 p + 208 216 p + 201 216 p + 860 215 p + 864 215 p + 862 215 p + 881 215 p + 882 215 p + 207 215 p + 208 215 p + 865 214 p + 866 214 p + 846 214 p + 863 214 p + 867 214 p + 201 214 p + 209 214 p + 865 213 p + 866 213 p + 846 213 p + 868 213 p + 869 213 p + 209 213 p + 202 213 p + 863 212 p + 867 212 p + 865 212 p + 884 212 p + 885 212 p + 208 212 p + 209 212 p + 866 211 p + 868 211 p + 869 211 p + 887 211 p + 888 211 p + 209 211 p + 210 211 p + 866 210 p + 868 210 p + 869 210 p + 872 210 p + 870 210 p + 202 210 p + 210 210 p + 870 209 p + 871 209 p + 850 209 p + 869 209 p + 872 209 p + 202 209 p + 211 209 p + 870 208 p + 871 208 p + 850 208 p + 873 208 p + 853 208 p + 211 208 p + 203 208 p + 869 207 p + 872 207 p + 870 207 p + 890 207 p + 891 207 p + 210 207 p + 211 207 p + 871 206 p + 873 206 p + 853 206 p + 874 206 p + 875 206 p + 211 206 p + 204 206 p + 873 205 p + 874 205 p + 875 205 p + 895 205 p + 896 205 p + 211 205 p + 212 205 p + 873 204 p + 874 204 p + 875 204 p + 204 204 p + 212 204 p + 876 203 p + 877 203 p + 858 203 p + 205 203 p + 213 203 p + 876 202 p + 877 202 p + 858 202 p + 880 202 p + 878 202 p + 213 202 p + 206 202 p + 878 201 p + 879 201 p + 861 201 p + 877 201 p + 880 201 p + 206 201 p + 214 201 p + 878 200 p + 879 200 p + 861 200 p + 883 200 p + 881 200 p + 214 200 p + 207 200 p + 877 199 p + 880 199 p + 878 199 p + 902 199 p + 903 199 p + 213 199 p + 214 199 p + 881 198 p + 882 198 p + 864 198 p + 879 198 p + 883 198 p + 207 198 p + 215 198 p + 881 197 p + 882 197 p + 864 197 p + 886 197 p + 884 197 p + 215 197 p + 208 197 p + 879 196 p + 883 196 p + 881 196 p + 906 196 p + 907 196 p + 214 196 p + 215 196 p + 884 195 p + 885 195 p + 867 195 p + 882 195 p + 886 195 p + 208 195 p + 216 195 p + 884 194 p + 885 194 p + 867 194 p + 889 194 p + 887 194 p + 216 194 p + 209 194 p + 882 193 p + 886 193 p + 884 193 p + 909 193 p + 910 193 p + 215 193 p + 216 193 p + 887 192 p + 888 192 p + 868 192 p + 885 192 p + 889 192 p + 209 192 p + 217 192 p + 887 191 p + 888 191 p + 868 191 p + 892 191 p + 890 191 p + 217 191 p + 210 191 p + 885 190 p + 889 190 p + 887 190 p + 912 190 p + 913 190 p + 216 190 p + 217 190 p + 890 189 p + 891 189 p + 872 189 p + 888 189 p + 892 189 p + 210 189 p + 218 189 p + 890 188 p + 891 188 p + 872 188 p + 893 188 p + 894 188 p + 218 188 p + 211 188 p + 888 187 p + 892 187 p + 890 187 p + 915 187 p + 916 187 p + 217 187 p + 218 187 p + 891 186 p + 893 186 p + 894 186 p + 918 186 p + 919 186 p + 218 186 p + 219 186 p + 891 185 p + 893 185 p + 894 185 p + 897 185 p + 895 185 p + 211 185 p + 219 185 p + 895 184 p + 896 184 p + 874 184 p + 894 184 p + 897 184 p + 211 184 p + 220 184 p + 895 183 p + 896 183 p + 874 183 p + 898 183 p + 899 183 p + 220 183 p + 212 183 p + 894 182 p + 897 182 p + 895 182 p + 921 182 p + 922 182 p + 219 182 p + 220 182 p + 896 181 p + 898 181 p + 899 181 p + 924 181 p + 925 181 p + 220 181 p + 221 181 p + 896 180 p + 898 180 p + 899 180 p + 212 180 p + 221 180 p + 756 179 p + 900 179 p + 829 179 p + 1028 179 p + 1030 179 p + 265 179 p + 264 179 p + 335 178 p + 777 178 p + 901 178 p + 828 178 p + 927 178 p + 16 178 p + 280 178 p + 902 177 p + 903 177 p + 880 177 p + 904 177 p + 905 177 p + 213 177 p + 223 177 p + 902 176 p + 903 176 p + 880 176 p + 908 176 p + 906 176 p + 223 176 p + 214 176 p + 904 175 p + 905 175 p + 902 175 p + 213 175 p + 222 175 p + 904 174 p + 905 174 p + 902 174 p + 934 174 p + 935 174 p + 222 174 p + 223 174 p + 906 173 p + 907 173 p + 883 173 p + 903 173 p + 908 173 p + 214 173 p + 224 173 p + 906 172 p + 907 172 p + 883 172 p + 911 172 p + 909 172 p + 224 172 p + 215 172 p + 903 171 p + 908 171 p + 906 171 p + 935 171 p + 938 171 p + 223 171 p + 224 171 p + 909 170 p + 910 170 p + 886 170 p + 907 170 p + 911 170 p + 215 170 p + 225 170 p + 909 169 p + 910 169 p + 886 169 p + 914 169 p + 912 169 p + 225 169 p + 216 169 p + 907 168 p + 911 168 p + 909 168 p + 939 168 p + 940 168 p + 224 168 p + 225 168 p + 912 167 p + 913 167 p + 889 167 p + 910 167 p + 914 167 p + 216 167 p + 226 167 p + 912 166 p + 913 166 p + 889 166 p + 917 166 p + 915 166 p + 226 166 p + 217 166 p + 910 165 p + 914 165 p + 912 165 p + 942 165 p + 943 165 p + 225 165 p + 226 165 p + 915 164 p + 916 164 p + 892 164 p + 913 164 p + 917 164 p + 217 164 p + 227 164 p + 915 163 p + 916 163 p + 892 163 p + 920 163 p + 918 163 p + 227 163 p + 218 163 p + 913 162 p + 917 162 p + 915 162 p + 945 162 p + 946 162 p + 226 162 p + 227 162 p + 918 161 p + 919 161 p + 893 161 p + 916 161 p + 920 161 p + 218 161 p + 228 161 p + 918 160 p + 919 160 p + 893 160 p + 923 160 p + 921 160 p + 228 160 p + 219 160 p + 916 159 p + 920 159 p + 918 159 p + 948 159 p + 949 159 p + 227 159 p + 228 159 p + 921 158 p + 922 158 p + 897 158 p + 919 158 p + 923 158 p + 219 158 p + 229 158 p + 921 157 p + 922 157 p + 897 157 p + 926 157 p + 924 157 p + 229 157 p + 220 157 p + 919 156 p + 923 156 p + 921 156 p + 951 156 p + 952 156 p + 228 156 p + 229 156 p + 924 155 p + 925 155 p + 898 155 p + 922 155 p + 926 155 p + 220 155 p + 230 155 p + 924 154 p + 925 154 p + 898 154 p + 230 154 p + 221 154 p + 922 153 p + 926 153 p + 924 153 p + 956 153 p + 957 153 p + 229 153 p + 230 153 p + 901 152 p + 828 152 p + 927 152 p + 329 152 p + 932 152 p + 16 152 p + 279 152 p + 928 151 p + 929 151 p + 930 151 p + 933 151 p + 993 151 p + 278 151 p + 279 151 p + 928 150 p + 929 150 p + 930 150 p + 830 150 p + 931 150 p + 279 150 p + 263 150 p + 928 149 p + 929 149 p + 930 149 p + 1027 149 p + 995 149 p + 278 149 p + 263 149 p + 830 148 p + 931 148 p + 929 148 p + 1029 148 p + 1025 148 p + 264 148 p + 263 148 p + 331 147 p + 932 147 p + 933 147 p + 329 147 p + 927 147 p + 15 147 p + 279 147 p + 331 146 p + 932 146 p + 933 146 p + 928 146 p + 993 146 p + 14 146 p + 279 146 p + 934 145 p + 935 145 p + 905 145 p + 936 145 p + 937 145 p + 222 145 p + 232 145 p + 934 144 p + 935 144 p + 905 144 p + 938 144 p + 908 144 p + 232 144 p + 223 144 p + 936 143 p + 937 143 p + 934 143 p + 222 143 p + 231 143 p + 936 142 p + 937 142 p + 934 142 p + 961 142 p + 962 142 p + 231 142 p + 232 142 p + 935 141 p + 938 141 p + 908 141 p + 941 141 p + 939 141 p + 232 141 p + 224 141 p + 939 140 p + 940 140 p + 911 140 p + 938 140 p + 941 140 p + 224 140 p + 233 140 p + 939 139 p + 940 139 p + 911 139 p + 944 139 p + 942 139 p + 233 139 p + 225 139 p + 938 138 p + 941 138 p + 939 138 p + 963 138 p + 964 138 p + 232 138 p + 233 138 p + 942 137 p + 943 137 p + 914 137 p + 940 137 p + 944 137 p + 225 137 p + 234 137 p + 942 136 p + 943 136 p + 914 136 p + 947 136 p + 945 136 p + 234 136 p + 226 136 p + 940 135 p + 944 135 p + 942 135 p + 970 135 p + 968 135 p + 233 135 p + 234 135 p + 945 134 p + 946 134 p + 917 134 p + 943 134 p + 947 134 p + 226 134 p + 235 134 p + 945 133 p + 946 133 p + 917 133 p + 950 133 p + 948 133 p + 235 133 p + 227 133 p + 943 132 p + 947 132 p + 945 132 p + 968 132 p + 969 132 p + 234 132 p + 235 132 p + 948 131 p + 949 131 p + 920 131 p + 946 131 p + 950 131 p + 227 131 p + 236 131 p + 948 130 p + 949 130 p + 920 130 p + 953 130 p + 951 130 p + 236 130 p + 228 130 p + 946 129 p + 950 129 p + 948 129 p + 972 129 p + 973 129 p + 235 129 p + 236 129 p + 951 128 p + 952 128 p + 923 128 p + 949 128 p + 953 128 p + 228 128 p + 237 128 p + 951 127 p + 952 127 p + 923 127 p + 954 127 p + 955 127 p + 237 127 p + 229 127 p + 949 126 p + 953 126 p + 951 126 p + 975 126 p + 976 126 p + 236 126 p + 237 126 p + 952 125 p + 954 125 p + 955 125 p + 978 125 p + 979 125 p + 237 125 p + 238 125 p + 952 124 p + 954 124 p + 955 124 p + 958 124 p + 956 124 p + 229 124 p + 238 124 p + 956 123 p + 957 123 p + 926 123 p + 955 123 p + 958 123 p + 229 123 p + 239 123 p + 956 122 p + 957 122 p + 926 122 p + 959 122 p + 960 122 p + 239 122 p + 230 122 p + 955 121 p + 958 121 p + 956 121 p + 981 121 p + 982 121 p + 238 121 p + 239 121 p + 957 120 p + 959 120 p + 960 120 p + 986 120 p + 987 120 p + 239 120 p + 240 120 p + 957 119 p + 959 119 p + 960 119 p + 230 119 p + 240 119 p + 961 118 p + 962 118 p + 937 118 p + 231 118 p + 241 118 p + 961 117 p + 962 117 p + 937 117 p + 965 117 p + 963 117 p + 241 117 p + 232 117 p + 963 116 p + 964 116 p + 941 116 p + 962 116 p + 965 116 p + 232 116 p + 242 116 p + 963 115 p + 964 115 p + 941 115 p + 966 115 p + 967 115 p + 242 115 p + 233 115 p + 962 114 p + 965 114 p + 963 114 p + 997 114 p + 998 114 p + 241 114 p + 242 114 p + 964 113 p + 966 113 p + 967 113 p + 999 113 p + 1000 113 p + 242 113 p + 243 113 p + 964 112 p + 966 112 p + 967 112 p + 971 112 p + 970 112 p + 233 112 p + 243 112 p + 968 111 p + 969 111 p + 947 111 p + 970 111 p + 944 111 p + 234 111 p + 244 111 p + 968 110 p + 969 110 p + 947 110 p + 974 110 p + 972 110 p + 244 110 p + 235 110 p + 970 109 p + 968 109 p + 944 109 p + 967 109 p + 971 109 p + 233 109 p + 244 109 p + 967 108 p + 971 108 p + 970 108 p + 1002 108 p + 1003 108 p + 243 108 p + 244 108 p + 972 107 p + 973 107 p + 950 107 p + 969 107 p + 974 107 p + 235 107 p + 245 107 p + 972 106 p + 973 106 p + 950 106 p + 977 106 p + 975 106 p + 245 106 p + 236 106 p + 969 105 p + 974 105 p + 972 105 p + 1007 105 p + 1008 105 p + 244 105 p + 245 105 p + 975 104 p + 976 104 p + 953 104 p + 973 104 p + 977 104 p + 236 104 p + 246 104 p + 975 103 p + 976 103 p + 953 103 p + 980 103 p + 978 103 p + 246 103 p + 237 103 p + 973 102 p + 977 102 p + 975 102 p + 1010 102 p + 1011 102 p + 245 102 p + 246 102 p + 978 101 p + 979 101 p + 954 101 p + 976 101 p + 980 101 p + 237 101 p + 247 101 p + 978 100 p + 979 100 p + 954 100 p + 983 100 p + 981 100 p + 247 100 p + 238 100 p + 976 99 p + 980 99 p + 978 99 p + 1013 99 p + 1014 99 p + 246 99 p + 247 99 p + 981 98 p + 982 98 p + 958 98 p + 979 98 p + 983 98 p + 238 98 p + 248 98 p + 981 97 p + 982 97 p + 958 97 p + 984 97 p + 985 97 p + 248 97 p + 239 97 p + 979 96 p + 983 96 p + 981 96 p + 1016 96 p + 1017 96 p + 247 96 p + 248 96 p + 984 95 p + 985 95 p + 982 95 p + 1019 95 p + 1020 95 p + 248 95 p + 249 95 p + 984 94 p + 985 94 p + 982 94 p + 988 94 p + 987 94 p + 249 94 p + 239 94 p + 986 93 p + 959 93 p + 987 93 p + 989 93 p + 990 93 p + 250 93 p + 240 93 p + 986 92 p + 959 92 p + 987 92 p + 988 92 p + 985 92 p + 250 92 p + 239 92 p + 988 91 p + 987 91 p + 985 91 p + 1022 91 p + 1023 91 p + 249 91 p + 250 91 p + 986 90 p + 989 90 p + 990 90 p + 1025 90 p + 1026 90 p + 250 90 p + 251 90 p + 986 89 p + 989 89 p + 990 89 p + 991 89 p + 992 89 p + 240 89 p + 251 89 p + 990 88 p + 991 88 p + 992 88 p + 1028 88 p + 1029 88 p + 251 88 p + 252 88 p + 990 87 p + 991 87 p + 992 87 p + 240 87 p + 252 87 p + 933 86 p + 928 86 p + 993 86 p + 1079 86 p + 324 86 p + 14 86 p + 278 86 p + 994 85 p + 995 85 p + 996 85 p + 1076 85 p + 1079 85 p + 277 85 p + 278 85 p + 994 84 p + 995 84 p + 996 84 p + 930 84 p + 1027 84 p + 278 84 p + 262 84 p + 994 83 p + 995 83 p + 996 83 p + 1078 83 p + 1024 83 p + 277 83 p + 262 83 p + 997 82 p + 998 82 p + 965 82 p + 241 82 p + 253 82 p + 997 81 p + 998 81 p + 965 81 p + 1001 81 p + 999 81 p + 253 81 p + 242 81 p + 999 80 p + 1000 80 p + 966 80 p + 998 80 p + 1001 80 p + 242 80 p + 254 80 p + 999 79 p + 1000 79 p + 966 79 p + 1004 79 p + 1002 79 p + 254 79 p + 243 79 p + 998 78 p + 1001 78 p + 999 78 p + 1033 78 p + 1034 78 p + 253 78 p + 254 78 p + 1002 77 p + 1003 77 p + 971 77 p + 1000 77 p + 1004 77 p + 243 77 p + 255 77 p + 1002 76 p + 1003 76 p + 971 76 p + 1005 76 p + 1006 76 p + 255 76 p + 244 76 p + 1000 75 p + 1004 75 p + 1002 75 p + 1035 75 p + 1036 75 p + 254 75 p + 255 75 p + 1003 74 p + 1005 74 p + 1006 74 p + 1041 74 p + 1042 74 p + 255 74 p + 256 74 p + 1003 73 p + 1005 73 p + 1006 73 p + 1009 73 p + 1007 73 p + 244 73 p + 256 73 p + 1007 72 p + 1008 72 p + 974 72 p + 1006 72 p + 1009 72 p + 244 72 p + 257 72 p + 1007 71 p + 1008 71 p + 974 71 p + 1012 71 p + 1010 71 p + 257 71 p + 245 71 p + 1006 70 p + 1009 70 p + 1007 70 p + 1055 70 p + 1050 70 p + 256 70 p + 257 70 p + 1010 69 p + 1011 69 p + 977 69 p + 1008 69 p + 1012 69 p + 245 69 p + 258 69 p + 1010 68 p + 1011 68 p + 977 68 p + 1015 68 p + 1013 68 p + 258 68 p + 246 68 p + 1008 67 p + 1012 67 p + 1010 67 p + 1050 67 p + 1051 67 p + 257 67 p + 258 67 p + 1013 66 p + 1014 66 p + 980 66 p + 1011 66 p + 1015 66 p + 246 66 p + 259 66 p + 1013 65 p + 1014 65 p + 980 65 p + 1018 65 p + 1016 65 p + 259 65 p + 247 65 p + 1011 64 p + 1015 64 p + 1013 64 p + 1056 64 p + 1057 64 p + 258 64 p + 259 64 p + 1016 63 p + 1017 63 p + 983 63 p + 1014 63 p + 1018 63 p + 247 63 p + 260 63 p + 1016 62 p + 1017 62 p + 983 62 p + 1021 62 p + 1019 62 p + 260 62 p + 248 62 p + 1014 61 p + 1018 61 p + 1016 61 p + 1068 61 p + 1069 61 p + 259 61 p + 260 61 p + 1019 60 p + 1020 60 p + 984 60 p + 1017 60 p + 1021 60 p + 248 60 p + 261 60 p + 1019 59 p + 1020 59 p + 984 59 p + 1024 59 p + 1022 59 p + 261 59 p + 249 59 p + 1017 58 p + 1021 58 p + 1019 58 p + 1073 58 p + 1074 58 p + 260 58 p + 261 58 p + 1022 57 p + 1023 57 p + 988 57 p + 1020 57 p + 1024 57 p + 249 57 p + 262 57 p + 1022 56 p + 1023 56 p + 988 56 p + 1027 56 p + 1026 56 p + 262 56 p + 250 56 p + 1020 55 p + 1024 55 p + 1022 55 p + 1078 55 p + 996 55 p + 261 55 p + 262 55 p + 1025 54 p + 989 54 p + 1026 54 p + 931 54 p + 1029 54 p + 263 54 p + 251 54 p + 1025 53 p + 989 53 p + 1026 53 p + 1027 53 p + 1023 53 p + 263 53 p + 250 53 p + 1027 52 p + 1026 52 p + 1023 52 p + 930 52 p + 995 52 p + 262 52 p + 263 52 p + 1028 51 p + 991 51 p + 1029 51 p + 900 51 p + 1030 51 p + 264 51 p + 252 51 p + 1028 50 p + 991 50 p + 1029 50 p + 931 50 p + 1025 50 p + 264 50 p + 251 50 p + 1028 49 p + 900 49 p + 1030 49 p + 757 49 p + 1031 49 p + 252 49 p + 265 49 p + 1030 48 p + 757 48 p + 1031 48 p + 753 48 p + 1032 48 p + 252 48 p + 266 48 p + 1031 47 p + 753 47 p + 1032 47 p + 252 47 p + 267 47 p + 1033 46 p + 1034 46 p + 1001 46 p + 253 46 p + 268 46 p + 1033 45 p + 1034 45 p + 1001 45 p + 1040 45 p + 1035 45 p + 268 45 p + 254 45 p + 1035 44 p + 1036 44 p + 1004 44 p + 1034 44 p + 1040 44 p + 254 44 p + 269 44 p + 1035 43 p + 1036 43 p + 1004 43 p + 1045 43 p + 1041 43 p + 269 43 p + 255 43 p + 1037 42 p + 287 42 p + 1038 42 p + 1039 42 p + 1040 42 p + 269 42 p + 4 42 p + 1037 41 p + 287 41 p + 1038 41 p + 1043 41 p + 1045 41 p + 269 41 p + 5 41 p + 1039 40 p + 1037 40 p + 1040 40 p + 268 40 p + 4 40 p + 1039 39 p + 1037 39 p + 1040 39 p + 1034 39 p + 1035 39 p + 268 39 p + 269 39 p + 1041 38 p + 1042 38 p + 1005 38 p + 1036 38 p + 1045 38 p + 255 38 p + 270 38 p + 1041 37 p + 1042 37 p + 1005 37 p + 1048 37 p + 1049 37 p + 270 37 p + 256 37 p + 1043 36 p + 292 36 p + 1044 36 p + 1038 36 p + 1045 36 p + 270 36 p + 5 36 p + 1043 35 p + 292 35 p + 1044 35 p + 1046 35 p + 1048 35 p + 270 35 p + 6 35 p + 1038 34 p + 1043 34 p + 1045 34 p + 1036 34 p + 1041 34 p + 269 34 p + 270 34 p + 1046 33 p + 296 33 p + 1047 33 p + 1044 33 p + 1048 33 p + 271 33 p + 6 33 p + 1046 32 p + 296 32 p + 1047 32 p + 1052 32 p + 1054 32 p + 271 32 p + 7 32 p + 1044 31 p + 1046 31 p + 1048 31 p + 1042 31 p + 1049 31 p + 270 31 p + 271 31 p + 1042 30 p + 1048 30 p + 1049 30 p + 1054 30 p + 1055 30 p + 256 30 p + 271 30 p + 1050 29 p + 1051 29 p + 1012 29 p + 1055 29 p + 1009 29 p + 257 29 p + 272 29 p + 1050 28 p + 1051 28 p + 1012 28 p + 1060 28 p + 1056 28 p + 272 28 p + 258 28 p + 1052 27 p + 300 27 p + 1053 27 p + 1047 27 p + 1054 27 p + 272 27 p + 7 27 p + 1052 26 p + 300 26 p + 1053 26 p + 1058 26 p + 1060 26 p + 272 26 p + 8 26 p + 1047 25 p + 1052 25 p + 1054 25 p + 1049 25 p + 1055 25 p + 271 25 p + 272 25 p + 1055 24 p + 1050 24 p + 1009 24 p + 1049 24 p + 1054 24 p + 256 24 p + 272 24 p + 1056 23 p + 1057 23 p + 1015 23 p + 1051 23 p + 1060 23 p + 258 23 p + 273 23 p + 1056 22 p + 1057 22 p + 1015 22 p + 1063 22 p + 1064 22 p + 273 22 p + 259 22 p + 1058 21 p + 304 21 p + 1059 21 p + 1053 21 p + 1060 21 p + 273 21 p + 8 21 p + 1058 20 p + 304 20 p + 1059 20 p + 1061 20 p + 1063 20 p + 273 20 p + 9 20 p + 1053 19 p + 1058 19 p + 1060 19 p + 1051 19 p + 1056 19 p + 272 19 p + 273 19 p + 1061 18 p + 308 18 p + 1062 18 p + 1059 18 p + 1063 18 p + 274 18 p + 9 18 p + 1061 17 p + 308 17 p + 1062 17 p + 1065 17 p + 1067 17 p + 274 17 p + 10 17 p + 1059 16 p + 1061 16 p + 1063 16 p + 1057 16 p + 1064 16 p + 273 16 p + 274 16 p + 1057 15 p + 1063 15 p + 1064 15 p + 1067 15 p + 1068 15 p + 259 15 p + 274 15 p + 1065 14 p + 312 14 p + 1066 14 p + 1062 14 p + 1067 14 p + 275 14 p + 10 14 p + 1065 13 p + 312 13 p + 1066 13 p + 1070 13 p + 1072 13 p + 275 13 p + 11 13 p + 1062 12 p + 1065 12 p + 1067 12 p + 1064 12 p + 1068 12 p + 274 12 p + 275 12 p + 1068 11 p + 1069 11 p + 1018 11 p + 1064 11 p + 1067 11 p + 259 11 p + 275 11 p + 1068 10 p + 1069 10 p + 1018 10 p + 1072 10 p + 1073 10 p + 275 10 p + 260 10 p + 1070 9 p + 316 9 p + 1071 9 p + 1066 9 p + 1072 9 p + 276 9 p + 11 9 p + 1070 8 p + 316 8 p + 1071 8 p + 1075 8 p + 1077 8 p + 276 8 p + 12 8 p + 1066 7 p + 1070 7 p + 1072 7 p + 1069 7 p + 1073 7 p + 275 7 p + 276 7 p + 1073 6 p + 1074 6 p + 1021 6 p + 1069 6 p + 1072 6 p + 260 6 p + 276 6 p + 1073 5 p + 1074 5 p + 1021 5 p + 1077 5 p + 1078 5 p + 276 5 p + 261 5 p + 1075 4 p + 320 4 p + 1076 4 p + 1071 4 p + 1077 4 p + 277 4 p + 12 4 p + 1075 3 p + 320 3 p + 1076 3 p + 1079 3 p + 994 3 p + 277 3 p + 13 3 p + 1071 2 p + 1075 2 p + 1077 2 p + 1074 2 p + 1078 2 p + 276 2 p + 277 2 p + 1078 1 p + 996 1 p + 1024 1 p + 1074 1 p + 1077 1 p + 261 1 p + 277 1 p + 1079 0 p + 324 0 p + 993 0 p + 1076 0 p + 994 0 p + 278 0 p + 13 0 p +showpage +%%EndDocument + @endspecial 883 x Fi(7.3)70 b(Mark)n(o)n(v)25 b(Chains)60 +1223 y Fl(Mark)o(o)o(v)15 b(c)o(hain)g(matrices)f(arising)i(from)e(a)i +(random)f(w)o(alk)h(on)g(a)g(triangular)g(grid.)21 b(This)16 +b(is)f(mainly)60 1283 y(useful)c(for)h(testing)g(nonsymmetric)c(eigen)o(v)m +(alue)i(co)q(des.)20 b(It)12 b(has)g(b)q(een)f(suggested)i(b)o(y)e(G.W.)g +(Stew)o(art)60 1343 y(in)16 b(one)h(of)g(his)g(pap)q(ers)h([10])e(and)i(w)o +(as)f(used)g(b)o(y)f(Y.)g(Saad)i(in)e(a)h(few)g(subsequen)o(t)f(pap)q(ers)i +(as)f(a)g(test)60 1404 y(problem)e(for)h(nonsymmetric)d(eigen)o(v)m(alue)i +(metho)q(ds,)g(see,)h(e.g.,)f([8].)60 1548 y Fi(7.4)70 b(Other)22 +b(Matrices)60 1640 y Fl(Curren)o(tly)d(w)o(e)h(ha)o(v)o(e)f(only)i(one)f +(additional)g(set)g(of)h(matrices.)31 b(These)20 b(are)h(the)f(test)g +(matrices)1900 1622 y Fd(2)60 1700 y Fl(from)f(Zlatev)g(et.)31 +b(al.)h([12])20 b(and)g(Osterb)o(y)f(and)h(Zlatev)f([7].)32 +b(The)19 b(\014rst)i(t)o(w)o(o)e(matrix)f(generators)60 1761 +y(describ)q(ed)f(in)g(the)g(ab)q(o)o(v)o(e)g(references)f(are)h(referred)f +(to)i(as)g Fj(D)q Fl(\()p Fj(n;)8 b(c)p Fl(\))18 b(and)g Fj(E)s +Fl(\()p Fj(n;)8 b(c)p Fl(\))17 b(resp)q(ectiv)o(ely)l(.)k(A)60 +1821 y(more)d(elab)q(orate)i(class)f(where)g(more)f(than)i(t)o(w)o(o)f +(parameters)f(can)i(b)q(e)f(v)m(aried,)g(is)h(referred)e(to)h(as)60 +1881 y(the)c(class)h Fj(F)7 b Fl(\()p Fj(m;)h(n;)g(c;)g(r)o(;)g(\013)p +Fl(\))13 b(in)i([7,)g(12)q(].)21 b(The)15 b(three)g(subroutines)g(to)h +(generate)f(these)g(matrices)f(are)60 1941 y(called)k(MA)l(TRF2)g(\(for)h +(the)f(class)h Fj(F)7 b Fl(\()p Fj(m;)h(n;)g(c;)g(r)o(;)g(\013)p +Fl(\))17 b(\),)i(DCN)f(\(for)h(the)g(class)f Fj(D)q Fl(\()p +Fj(c;)8 b(n)p Fl(\)\))20 b(and)f(ECN)60 2001 y(\(for)d(the)g(class)h +Fj(E)s Fl(\()p Fj(c;)8 b(n)p Fl(\)\).)21 b(These)16 b(co)q(des)g(can)h +(generate)f(rectangular)g(as)h(w)o(ell)e(as)i(square)f(matrices)60 +2062 y(and)h(allo)o(w)f(a)h(go)q(o)q(d)h(\015exibilit)o(y)13 +b(in)j(making)f(the)i(matrices)d(more)h(or)i(less)f(dense)g(and)h(more)e(or)h +(less)60 2122 y(w)o(ell)f(conditioned.)60 2288 y Fk(8)83 b(The)27 +b(ORDERING)h(Routines)60 2398 y Fl(The)16 b(follo)o(wing)g(subroutines)h(are) +f(a)o(v)m(ailable)g(in)g(the)g(directory)f(ORDERINGS.)120 2548 +y Fh(levset.f)215 b Fl(Reordering)21 b(based)i(on)f(lev)o(el)d(sets,)k +(including)e(Cuthill-McKee)e(imple-)510 2608 y(men)o(ted)14 +b(with)i(breadth)h(\014rst)f(searc)o(h.)p 60 2642 744 2 v 116 +2673 a Fc(2)135 2688 y Fo(These)f(subroutines)g(ha)o(v)o(e)f(b)q(een)h(con)o +(tributed)f(to)g(the)g(author)g(b)o(y)g(E.)g(Rothman)d(from)h(Cornell)i(Univ) +o(ersit)o(y)m(.)p eop +%%Page: 27 27 +27 26 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(27)120 +132 y Fh(color.f)237 b Fl(Reordering)22 b(based)g(on)g(coloring,)h(including) +e(a)h(greedy)g(algorithm)f(for)510 192 y(m)o(ulticolor)14 b(ordering.)120 +300 y Fh(ccn.f)276 b Fl(Reordering)27 b(routines)f(based)i(on)f(strongly)g +(connected)f(comp)q(onen)o(ts.)510 360 y(Con)o(tributed)16 +b(b)o(y)f(Laura)j(C.)e(Dutto)g(from)f(the)h(Univ)o(ersit)o(y)e(of)i(Mon)o +(treal.)60 499 y Fk(9)83 b(The)27 b(ITSOL)h(directory)60 609 +y Fl(In)16 b(ITSOL,)g(the)g(follo)o(wing)g(is)g(a)o(v)m(ailable.)120 +669 y Fh(ILUT)253 b Fl(Preconditioned)16 b(GMRES)g(algorithm)f(with)h(four)h +(preconditioners:)120 789 y Fh(pgmres)212 b Fl(Preconditioned)16 +b(GMRES)g(solv)o(er.)21 b(This)16 b(solv)o(er)g(ma)o(y)e(b)q(e)j(used)f(with) +h(all)510 849 y(four)i(of)g(the)g(precondioners)f(b)q(elo)o(w.)29 +b(Supp)q(orts)20 b(righ)o(t)e(preconditioning)510 909 y(only)l(.)120 +1018 y Fh(ilut)305 b Fl(A)13 b(robust)i(preconditioner)e(called)g(ILUT)g +(whic)o(h)g(uses)i(a)f(dual)g(threshold-)510 1078 y(ing)h(strategy)g(for)g +(dropping)h(elemen)o(ts.)i(Arbitrary)c(accuracy)g(is)h(allo)o(w)o(ed)510 +1138 y(in)h(ILUT.)120 1237 y Fh(ilutp)274 b Fl(ILUT)16 b(with)g(partial)g +(piv)o(oting)120 1357 y Fh(ilu0)299 b Fl(simple)14 b(ILU\(0\))i +(preconditioning)120 1477 y Fh(milu0)251 b Fl(MILU\(0\))16 +b(preconditioning)120 1597 y Fh(ITERS)220 b Fl(This)15 b(\014le)f(curren)o +(tly)f(has)j(sev)o(eral)d(basic)i(iterativ)o(e)e(linear)h(system)g(solv)o +(ers)510 1658 y(whic)o(h)i(use)g(rev)o(erse)f(comm)o(uni)o(cation.)k(They)d +(are:)120 1766 y Fh(cg)337 b Fl(Conjugate)17 b(Gradien)o(t)f(Metho)q(d)120 +1886 y Fh(cgnr)283 b Fl(Conjugate)17 b(Gradien)o(t)f(Metho)q(d-)h(for)g +(Normal)d(Residual)i(equation)120 2006 y Fh(b)r(cg)304 b Fl(BiConjugate)16 +b(Gradien)o(t)g(Metho)q(d)120 2127 y Fh(b)r(cgstab)202 b Fl(BCG)16 +b(stablized)120 2247 y Fh(tfqmr)250 b Fl(T)l(ransp)q(oseF)l(ree)17 +b(QuasiMinim)o(um)12 b(Residual)k(metho)q(d)120 2367 y Fh(gmres)243 +b Fl(Generalized)15 b(Minim)o(um)d(Residual)k(metho)q(d)120 +2487 y Fh(fgmres)226 b Fl(Flexible)14 b(v)o(ersion)h(of)i(Generalized)e +(Minim)o(um)d(Residual)k(metho)q(d)120 2607 y Fh(dqgmres)182 +b Fl(Direct)15 b(v)o(ersions)h(of)h(Quasi)f(Generalized)f(Minim)o(um)d +(Residual)k(metho)q(d)p eop +%%Page: 28 28 +28 27 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(28)120 +132 y Fh(db)r(cg)273 b Fl(BCG)16 b(with)g(partial)h(piv)o(oting)60 +296 y Fk(10)83 b(The)27 b(UNSUPP)i(directory)60 406 y Fl(In)16 +b(addition)h(to)f(the)h(basic)f(to)q(ols)h(describ)q(ed)f(in)g(the)g +(previous)g(sections,)g(SP)l(ARSKIT)g(includes)g(a)60 466 y(directory)e +(called)f(UNSUPP)h(includes)f(soft)o(w)o(are)i(that)g(is)f(not)h(necessarily) +e(p)q(ortable)i(or)g(that)g(do)q(es)60 526 y(not)21 b(\014t)f(in)f(all)h +(previous)g(mo)q(dules.)32 b(F)l(or)20 b(example)e(soft)o(w)o(are)i(for)g +(viewing)g(matrix)e(patterns)j(on)60 586 y(some)e(particular)h(w)o +(orkstation)g(ma)o(y)f(b)q(e)h(found)g(here.)32 b(Another)20 +b(example)e(is)i(routines)g(related)60 647 y(to)f(matrix)d(exp)q(onen)o +(tials.)28 b(Man)o(y)18 b(of)g(these)g(are)h(a)o(v)m(ailable)e(from)h(NETLIB) +g(but)g(others)h(ma)o(y)e(b)q(e)60 707 y(con)o(tributed)e(b)o(y)h(researc)o +(hers)g(for)g(comparison)g(purp)q(oses.)60 850 y Fi(10.1)70 +b(Plots)60 942 y Fl(The)16 b(follo)o(wing)g(items)f(are)h(a)o(v)m(ailable)f +(in)h(PLOTS.)120 1092 y Fh(PSGRD)192 b Fl(con)o(tains)16 b(subroutine)h +("psgrid")g(whic)o(h)f(plots)g(a)h(symmetri)o(c)c(graph.)120 +1212 y Fh(TEXPL)-5 b(T1)138 b Fl(con)o(tains)18 b(subroutine)g("texplt")g +(allo)o(ws)g(sev)o(eral)f(matrices)f(in)i(the)g(same)510 1273 +y(picture)d(b)o(y)g(calling)g(texplt)g(sev)o(eral)g(times)e(and)k(exploiting) +e(job)h(and)g(dif-)510 1333 y(feren)o(t)f(shifts.)120 1432 +y Fh(TEX)n(GRID1)96 b Fl(con)o(tains)18 b(subroutine)h("texgrd")g(whic)o(h)f +(generates)g(tex)g(commands)f(for)510 1492 y(plotting)h(a)g(symmetri)o(c)d +(graph)k(asso)q(ciated)g(with)e(a)h(mesh.)25 b(Allo)o(ws)17 +b(sev-)510 1552 y(eral)f(grids)g(in)g(the)g(same)f(picture)g(b)o(y)h(calling) +f(texgrd)h(sev)o(eral)f(times)f(and)510 1612 y(exploiting)h(job)i(and)g +(di\013eren)o(t)e(shifts.)60 1736 y Fi(10.2)70 b(Matrix)23 +b(Exp)r(onen)n(tials)60 1828 y Fl(Tw)o(o)17 b(subroutines)f(are)h(a)o(v)m +(ailable)e(in)h(this)g(directory)l(.)120 1978 y Fh(EXPPR)n(O)153 +b Fl(A)17 b(subroutine)g(for)h(computing)e(the)h(pro)q(duct)h(of)g(a)f +(matrix)f(exp)q(onen)o(tial)510 2038 y(times)e(a)j(v)o(ector,)e(i.e.)20 +b Fj(w)15 b Fl(=)f Fj(exp)p Fl(\()p Fj(t)h(A)p Fl(\))h Fj(v)r +Fl(.)120 2152 y Fh(PHIPR)n(O)167 b Fl(computes)12 b Fj(w)k +Fl(=)d Fj(\036)p Fl(\()p Fj(A)g(t)p Fl(\))h Fj(v)r Fl(,)f(where)g +Fj(\036)p Fl(\()p Fj(x)p Fl(\))g(=)h(\(1)6 b Fg(\000)g Fj(exp)p +Fl(\()p Fj(x)p Fl(\)\))p Fj(=x)p Fl(;)14 b(Also)f(allo)o(ws)510 +2213 y(to)k(solv)o(e)e(the)h(system)f(of)h(ODE's)h Fj(y)1174 +2194 y Fb(0)1199 2213 y Fl(=)d Fj(Ay)e Fl(+)f Fj(b)p Fl(.)60 +2350 y Fk(11)83 b(Distribution)60 2459 y Fl(The)18 b(SP)l(ARSKIT)g(pac)o(k)m +(age)h(follo)o(ws)f(the)g(Linpac)o(k-Eispac)o(k)g(approac)o(h)h(in)f(that)h +(it)e(aims)h(at)g(pro-)60 2519 y(viding)d(e\016cien)o(t)e(and)i(w)o(ell)f +(tested)h(subroutines)g(written)g(in)g(p)q(ortable)g(F)o(OR)l(TRAN.)e +(Similarly)g(to)60 2580 y(the)g(Linpac)o(k)g(and)h(Eispac)o(k)e(pac)o(k)m +(ages,)i(the)f(goal)h(is)f(to)h(mak)o(e)d(a)o(v)m(ailable)i(a)g(common)e +(base)j(of)f(useful)60 2640 y(co)q(des)j(for)g(a)g(sp)q(eci\014c)f(area)h(of) +g(computation,)e(in)i(this)f(case)h(sparse)g(linear)f(algebra.)21 +b(The)16 b(pac)o(k)m(age)60 2700 y(is)g(in)g(the)g(public)f(domain)h(and)h +(will)e(b)q(e)h(made)f(accessible)g(through)i(the)f(in)o(ternet.)p +eop +%%Page: 29 29 +29 28 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(29)120 +132 y(See)12 b(Figure)f(1)i(for)f(an)h(illustration)e(of)i(the)f +(organization)h(of)f(SP)l(ARSKIT.)f(Read)h(the)g(README)60 +192 y(\014le)k(in)f(the)h(main)f(directory)h(for)g(more)f(information.)120 +252 y(F)l(or)h(information)g(concerning)f(distribution)h(con)o(tact)g(the)g +(author)i(at)e(saad@cs.umn.edu.)60 418 y Fk(12)83 b(Conclusion)26 +b(and)h(F)-7 b(uture)27 b(Plans)60 528 y Fl(It)11 b(is)f(hop)q(ed)i(that)g +(SP)l(ARSKIT)e(will)g(b)q(e)h(useful)g(in)g(man)o(y)e(w)o(a)o(ys)i(to)h +(researc)o(hers)e(in)h(di\013eren)o(t)f(areas)i(of)60 588 y(scien)o(ti\014c)f +(computing.)19 b(In)13 b(this)f(v)o(ersion)g(of)i(SP)l(ARSKIT,)d(there)i(are) +g(few)f(sparse)i(problem)d(solv)o(ers,)60 648 y(suc)o(h)16 +b(as)g(direct)f(solution)h(metho)q(ds,)g(or)g(eigen)o(v)m(alue)f(solv)o(ers.) +20 b(Some)15 b(of)h(these)g(are)g(a)o(v)m(ailable)f(from)60 +708 y(di\013eren)o(t)e(sources)i(and)g(w)o(e)f(felt)f(that)i(it)f(w)o(as)h +(not)g(appropriate)f(to)h(pro)o(vide)f(additional)g(ones.)21 +b(The)60 769 y(original)16 b(motiv)m(ation)e(for)i(SP)l(ARSKIT)g(is)f(that)h +(there)g(is)f(a)h(gap)h(to)f(\014ll)f(in)g(the)h(manipulation)e(and)60 +829 y(basic)i(computations)f(with)h(sparse)g(matrices.)j(Once)c(this)h(gap)h +(is)e(\014lled)g(with)g(some)g(satisfaction,)60 889 y(then)h(additional)g +(functionalit)o(y)f(ma)o(y)g(b)q(e)h(added.)120 949 y(W)l(e)i(brie\015y)f +(men)o(tioned)f(in)i(the)f(in)o(tro)q(duction)h(the)g(p)q(ossibilit)o(y)f(of) +i(using)f(SP)l(ARSKIT)g(to)g(de-)60 1009 y(v)o(elop)12 b(an)h(in)o(teractiv)o +(e)d(pac)o(k)m(age.)20 b(Large)13 b(matrices)e(of)i(dimension)e(tens)h(of)h +(of)g(thousands)h(can)f(easily)60 1070 y(b)q(e)19 b(manipulated)f(with)h(the) +g(curren)o(t)f(sup)q(ercomputers,)h(in)f(real)h(time.)28 b(One)19 +b(of)g(the)g(di\016culties)60 1130 y(with)g(suc)o(h)f(an)i(in)o(teractiv)o(e) +c(pac)o(k)m(age)j(is)g(that)g(w)o(e)g(do)g(not)h(y)o(et)e(ha)o(v)o(e)g +(reliable)f(routines)i(for)g(com-)60 1190 y(puting)d(eigen)o(v)m(alues/eigen) +o(v)o(ectors)d(of)j(large)g(sparse)g(matrices.)k(The)15 b(state)h(of)g(the)g +(art)g(in)f(solving)60 1250 y(linear)j(systems)f(is)h(in)g(a)h(m)o(uc)o(h)d +(b)q(etter)i(situation.)28 b(Ho)o(w)o(ev)o(er,)16 b(one)j(m)o(ust)e(not)i +(con)o(template)d(p)q(er-)60 1310 y(forming)h(the)h(same)f(t)o(yp)q(e)h(of)h +(computations)f(as)h(with)f(small)e(dense)i(matrices.)26 b(As)18 +b(an)h(example,)60 1370 y(getting)i(all)g(the)g(eigen)o(v)m(alues)f(of)h(a)h +(sparse)g(matrix)d(is)i(not)h(lik)o(ely)c(to)k(b)q(e)f(to)q(o)h(useful)f +(when)g(the)60 1431 y(matrix)15 b(is)h(v)o(ery)f(large.)120 +1491 y(Bey)o(ond)e(in)o(teractiv)o(e)e(soft)o(w)o(are)i(for)h(sparse)g +(linear)f(algebra,)h(one)g(can)g(en)o(vision)e(the)h(in)o(tegration)60 +1551 y(of)h(SP)l(ARSKIT)g(in)g(a)g(larger)g(pac)o(k)m(age)h(dev)o(oted)e(to)i +(solving)f(certain)f(t)o(yp)q(es)h(of)g(P)o(artial)g(Di\013eren)o(tial)60 +1611 y(Equations,)i(p)q(ossibly)h(in)o(teractiv)o(ely)l(.)60 +2061 y Fh(Ac)n(kno)n(wledgemen)n(ts.)29 b Fl(The)19 b(idea)g(of)h(creating)f +(a)g(to)q(ol)h(pac)o(k)m(age)g(for)f(sparse)h(matrices)e(germi-)60 +2122 y(nated)12 b(while)e(the)i(author)g(w)o(as)g(at)g(the)g(Cen)o(ter)e(for) +i(Sup)q(ercomputing)f(Researc)o(h)g(and)h(Dev)o(elopmen)o(t)60 +2182 y(of)k(the)f(Univ)o(ersit)o(y)e(of)j(Illinois)e(\(1986-1987\))19 +b(and)d(part)g(of)g(this)f(w)o(ork)h(w)o(as)g(p)q(erformed)e(there.)20 +b(Ini-)60 2242 y(tially)i(the)g(author)i(has)g(b)q(ene\014ted)f(from)f +(helpful)g(commen)o(ts)e(from)i(Iain)g(Du\013)i(\(then)f(visiting)60 +2302 y(CSRD\))17 b(and)h(a)f(n)o(um)o(b)q(er)f(of)h(colleagues)g(at)g(CSRD.)g +(Billy)e(Stew)o(art)i(and)g(his)g(studen)o(ts)g(at)h(NCSU)60 +2362 y(used)j(a)h(preliminary)c(v)o(ersion)i(of)i(SP)l(ARSKIT)e(in)h(a)g +(class)g(pro)s(ject)g(and)g(made)f(some)g(v)m(aluable)60 2423 +y(commen)o(ts.)36 b(Ernie)21 b(Rothman)h(\(Cornell\))f(and)i(Laura)h(Dutto)e +(\(Mon)o(treal\))g(con)o(tributed)f(some)60 2483 y(soft)o(w)o(are.)g(The)14 +b(author)h(has)g(also)f(b)q(ene\014ted)g(from)f(helpful)g(discussions)i(from) +e(a)h(n)o(um)o(b)q(er)e(of)j(other)60 2543 y(colleagues,)20 +b(including)g(Mik)o(e)e(Heroux,)j(Giusepp)q(e)f(Radicatti,)g(Ahmed)f(Sameh,)g +(Horst)i(Simon,)60 2603 y(Ph)o(uong)d(V)l(u,)e(and)i(Harry)e(Wijsho\013.)24 +b(Studen)o(ts)17 b(who)g(con)o(tributed)g(to)g(v)o(ersion)f(2)h(of)g(SP)l +(ARSKIT)60 2663 y(include)e(Kesheng)h(W)l(u,)g(Edmond)g(Cho)o(w,)g(and)h +(Dongli)g(Su.)p eop +%%Page: 30 30 +30 29 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(30)60 +140 y Fk(References)84 249 y Fl([1])24 b(E.)19 b(C.)g(Anderson)h(and)g(Y.)e +(Saad.)31 b(Solving)19 b(sparse)h(triangular)g(systems)e(on)i(parallel)e +(com-)160 310 y(puters.)j(T)l(ec)o(hnical)15 b(Rep)q(ort)i(794,)g(Univ)o +(ersit)o(y)c(of)k(Illinois,)d(CSRD,)j(Urbana,)f(IL,)g(1988.)84 +411 y([2])24 b(I.)c(S.)h(Du\013.)35 b(A)20 b(surv)o(ey)g(of)h(sparse)h +(matrix)d(researc)o(h.)34 b(In)20 b Fq(Pr)n(o)n(c)n(e)n(e)n(dings)h(of)g(the) +h(IEEE,)g(65)p Fl(,)160 471 y(pages)17 b(500{535,)i(New)d(Y)l(ork,)f(1977.)i +(Pren)o(tice)e(Hall.)84 573 y([3])24 b(I.)c(S.)g(Du\013,)i(A.)d(M.)h +(Erisman,)g(and)h(J.)f(K.)g(Reid.)33 b Fq(Dir)n(e)n(ct)21 b(Metho)n(ds)f(for) +h(Sp)n(arse)g(Matric)n(es)p Fl(.)160 633 y(Clarendon)c(Press,)f(Oxford,)g +(1986.)84 735 y([4])24 b(I.)13 b(S.)g(Du\013,)h(R.)f(G.)g(Grimes,)f(and)i(J.) +f(G.)g(Lewis.)k(Sparse)d(matrix)e(test)h(problems.)i Fq(A)o(CM)g(tr)n(ans.) +160 795 y(Math.)i(Soft.)p Fl(,)g(15:1{14,)g(1989.)84 897 y([5])24 +b(T.)18 b(C.)f(Opp)q(e)h(W)l(a)o(yne)f(Joub)q(ert)i(and)f(D.)f(R.)g(Kincaid.) +25 b(Nsp)q(cg)18 b(user's)g(guide.)f(a)h(pac)o(k)m(age)g(for)160 +957 y(solving)j(large)g(linear)f(systems)f(b)o(y)h(v)m(arious)i(iterativ)o(e) +d(metho)q(ds.)34 b(T)l(ec)o(hnical)19 b(rep)q(ort,)j(The)160 +1017 y(Univ)o(ersit)o(y)14 b(of)i(T)l(exas)h(at)g(Austin,)e(1988.)84 +1119 y([6])24 b(T.)16 b(C.)g(Opp)q(e)g(and)g(D.)g(R.)f(Kincaid.)20 +b(The)c(p)q(erformance)f(of)h(ITP)l(A)o(CK)f(on)h(v)o(ector)f(computers)160 +1179 y(for)24 b(solving)e(large)h(sparse)h(linear)e(systems)g(arising)h(in)g +(sample)f(oil)g(reserv)o(oir)g(sim)o(ulation)160 1239 y(problems.)e +Fq(Communic)n(ations)e(in)f(applie)n(d)h(numeric)n(al)g(metho)n(ds)p +Fl(,)d(2:1{7,)i(1986.)84 1341 y([7])24 b(O.)d(Osterb)o(y)f(and)h(Z.)f +(Zlatev.)34 b Fq(Dir)n(e)n(ct)21 b(metho)n(ds)g(for)g(sp)n(arse)g(matric)n +(es)p Fl(.)34 b(Springer)21 b(V)l(erlag,)160 1401 y(New)16 +b(Y)l(ork,)f(1983.)84 1503 y([8])24 b(Y.)19 b(Saad.)31 b(Cheb)o(yshev)19 +b(acceleration)f(tec)o(hniques)g(for)i(solving)f(nonsymmetric)d(eigen)o(v)m +(alue)160 1563 y(problems.)k Fq(Mathematics)e(of)f(Computation)p +Fl(,)f(42:567{588,)j(1984.)84 1665 y([9])24 b(Y.)e(Saad.)42 +b(Krylo)o(v)22 b(subspace)i(metho)q(ds)e(on)h(sup)q(ercomputers.)40 +b Fq(SIAM)24 b(J.)f(Scient.)i(Stat.)160 1725 y(Comput.)p Fl(,)16 +b(10:1200{1232)q(,)j(1989.)60 1827 y([10])24 b(G.W.)15 b(Stew)o(art.)k(SRRIT) +14 b(-)i(a)f(F)o(OR)l(TRAN)e(subroutine)j(to)f(calculate)f(the)h(dominan)o(t) +f(in)o(v)m(ari-)160 1887 y(an)o(t)j(subspaces)g(of)g(a)f(real)g(matrix.)k(T)l +(ec)o(hnical)15 b(Rep)q(ort)i(TR-514,)g(Univ)o(ersit)o(y)d(of)j(Maryland,)160 +1947 y(College)f(P)o(ark,)g(MD,)f(1978.)60 2049 y([11])24 b(D.)13 +b(M.)f(Y)l(oung,)i(T.C.)e(Opp)q(e,)h(D.)g(R.)f(Kincaid,)g(and)i(L.)f(J.)f(Ha) +o(y)o(es.)j(On)e(the)f(use)h(of)g(v)o(ector)f(com-)160 2109 +y(puters)18 b(for)g(solving)g(large)g(sparse)g(linear)f(systems.)25 +b(T)l(ec)o(hnical)16 b(Rep)q(ort)i(CNA-199,)h(Cen)o(ter)160 +2169 y(for)e(Numerical)c(Analysis,)i(Univ)o(ersit)o(y)f(of)j(T)l(exas)f(at)h +(Austin,)e(Austin,)g(T)l(exas,)h(1985.)60 2271 y([12])24 b(Z.)19 +b(Zlatev,)h(K.)f(Sc)o(haum)o(burg,)g(and)h(J.)f(W)l(asniewski.)31 +b(A)20 b(testing)f(sc)o(heme)f(for)i(subroutines)160 2331 y(solving)c(large)h +(linear)e(problems.)20 b Fq(Computers)d(and)h(Chemistry)p Fl(,)d(5:91{100,)j +(1981.)p eop +%%Page: 31 31 +31 30 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(31)540 +132 y Fh(APPENDIX:)19 b(QUICK)g(REFERENCE)120 282 y Fl(F)l(or)12 +b(con)o(v)o(enience)e(w)o(e)h(list)g(in)h(this)f(app)q(endix)h(the)g(most)f +(imp)q(ortan)o(t)g(subroutines)h(in)g(the)f(v)m(arious)60 342 +y(mo)q(dules)17 b(of)i(SP)l(ARSKIT.)f(More)g(detailed)f(information)h(can)g +(b)q(e)h(found)g(either)e(in)h(the)g(b)q(o)q(dy)i(of)60 402 +y(the)c(pap)q(er)h(or)f(in)g(the)g(do)q(cumen)o(tation)g(of)g(the)g(pac)o(k)m +(age.)748 552 y Fh(F)n(ORMA)-5 b(TS)21 b(Mo)r(dule)133 660 +y Fg(\017)j Fl(CSRDNS)16 b(:)g(con)o(v)o(erts)f(a)i(ro)o(w-stored)g(sparse)g +(matrix)e(in)o(to)g(the)h(dense)h(format.)133 760 y Fg(\017)24 +b Fl(DNSCSR)16 b(:)g(con)o(v)o(erts)f(a)i(dense)f(matrix)f(to)h(a)h(sparse)g +(storage)g(format.)133 860 y Fg(\017)24 b Fl(COOCSR)17 b(:)e(con)o(v)o(erts)h +(co)q(ordinate)g(to)h(to)g(csr)f(format)133 960 y Fg(\017)24 +b Fl(COICSR)16 b(:)g(in-place)g(con)o(v)o(ersion)f(of)h(co)q(ordinate)h(to)g +(csr)f(format)133 1059 y Fg(\017)24 b Fl(CSR)o(COO)16 b(:)g(con)o(v)o(erts)f +(compressed)g(sparse)i(ro)o(w)g(to)f(co)q(ordinate)h(format.)133 +1159 y Fg(\017)24 b Fl(CSRSSR)17 b(:)e(con)o(v)o(erts)h(compressed)f(sparse)h +(ro)o(w)h(to)g(symme)o(tric)c(sparse)k(ro)o(w)f(format.)133 +1259 y Fg(\017)24 b Fl(SSR)o(CSR)16 b(:)g(con)o(v)o(erts)f(symmetric)e +(sparse)j(ro)o(w)h(to)g(compressed)e(sparse)h(ro)o(w)h(format.)133 +1359 y Fg(\017)24 b Fl(CSRELL)18 b(:)d(con)o(v)o(erts)h(compressed)f(sparse)h +(ro)o(w)h(to)g(Ellpac)o(k)e(format)133 1459 y Fg(\017)24 b +Fl(ELLCSR)18 b(:)d(con)o(v)o(erts)h(Ellpac)o(k)f(format)g(to)i(compressed)e +(sparse)i(ro)o(w)f(format.)133 1559 y Fg(\017)24 b Fl(CSRMSR)15 +b(:)f(con)o(v)o(erts)g(compressed)f(sparse)i(ro)o(w)g(format)f(to)h(mo)q +(di\014ed)f(sparse)h(ro)o(w)g(format.)133 1659 y Fg(\017)24 +b Fl(MSR)o(CSR)14 b(:)h(con)o(v)o(erts)f(mo)q(di\014ed)f(sparse)j(ro)o(w)f +(format)f(to)h(compressed)f(sparse)h(ro)o(w)g(format.)133 1759 +y Fg(\017)24 b Fl(CSR)o(CSC)c(:)f(con)o(v)o(erts)f(compressed)g(sparse)i(ro)o +(w)f(format)g(to)h(compressed)e(sparse)i(column)182 1820 y(format)15 +b(\(transp)q(osition\).)133 1920 y Fg(\017)24 b Fl(CSRLNK)16 +b(:)g(con)o(v)o(erts)f(compressed)g(sparse)i(ro)o(w)g(to)f(link)o(ed)f(list)h +(format.)133 2020 y Fg(\017)24 b Fl(LNK)o(CSR)16 b(:)g(con)o(v)o(erts)f(link) +o(ed)g(list)g(format)h(to)g(compressed)f(sparse)i(ro)o(w)g(fm)o(t.)133 +2119 y Fg(\017)24 b Fl(CSRDIA)16 b(:)g(con)o(v)o(erts)f(the)h(compressed)f +(sparse)i(ro)o(w)f(format)g(in)o(to)g(the)g(diagonal)h(format.)133 +2219 y Fg(\017)24 b Fl(DIA)o(CSR)15 b(:)h(con)o(v)o(erts)g(the)g(diagonal)h +(format)e(in)o(to)h(the)g(compressed)f(sparse)i(ro)o(w)f(format.)133 +2319 y Fg(\017)24 b Fl(BSR)o(CSR)18 b(:)h(con)o(v)o(erts)f(the)h(blo)q(c)o +(k-ro)o(w)f(sparse)i(format)e(in)o(to)h(the)g(compressed)e(sparse)j(ro)o(w) +182 2380 y(format.)133 2480 y Fg(\017)k Fl(CSRBSR)19 b(:)f(con)o(v)o(erts)g +(the)g(compressed)g(sparse)h(ro)o(w)g(format)g(in)o(to)f(the)h(blo)q(c)o +(k-ro)o(w)f(sparse)182 2540 y(format.)133 2640 y Fg(\017)24 +b Fl(CSRBND)d(:)g(con)o(v)o(erts)g(the)g(compressed)f(sparse)i(ro)o(w)g +(format)e(in)o(to)i(the)f(banded)h(format)182 2700 y(\(Linpac)o(k)16 +b(st)o(yle\).)p eop +%%Page: 32 32 +32 31 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(32)133 +132 y Fg(\017)24 b Fl(BNDCSR)13 b(:)h(con)o(v)o(erts)e(the)i(banded)g(format) +f(\(Linpac)o(k)g(st)o(yle\))g(in)o(to)g(the)h(compressed)e(sparse)182 +192 y(ro)o(w)k(storage.)133 293 y Fg(\017)24 b Fl(CSRSSK)c(:)g(con)o(v)o +(erts)f(the)h(compressed)f(sparse)h(ro)o(w)h(format)e(to)h(the)g(symmetric)c +(skyline)182 354 y(format)133 455 y Fg(\017)24 b Fl(SSKSSR)16 +b(:)g(con)o(v)o(erts)g(symme)o(tric)d(skyline)i(format)g(to)i(symmetri)o(c)c +(sparse)k(ro)o(w)g(format.)133 557 y Fg(\017)24 b Fl(CSRJAD)16 +b(:)g(con)o(v)o(erts)f(the)h(csr)h(format)e(in)o(to)h(the)g(jagged)h +(diagonal)g(format.)133 659 y Fg(\017)24 b Fl(JADCSR)16 b(:)g(con)o(v)o(erts) +f(the)h(jagged-diagonal)j(format)c(in)o(to)h(the)g(csr)g(format.)133 +760 y Fg(\017)24 b Fl(CSR)o(USS)16 b(:)g(con)o(v)o(erts)f(the)h(csr)g(format) +g(to)g(unsymmetric)d(sparse)k(skyline)d(format.)133 862 y Fg(\017)24 +b Fl(USSCSR)16 b(:)g(con)o(v)o(erts)f(unsymmetric)e(sparse)k(skyline)e +(format)g(to)i(the)f(csr)g(format.)133 964 y Fg(\017)24 b Fl(CSRSSS)17 +b(:)f(con)o(v)o(erts)f(the)h(csr)g(format)f(to)i(symmetric)12 +b(sparse)17 b(skyline)e(format.)133 1066 y Fg(\017)24 b Fl(SSSCSR)17 +b(:)f(con)o(v)o(erts)f(symmetri)o(c)e(sparse)k(skyline)e(format)g(to)i(the)f +(csr)g(format.)133 1167 y Fg(\017)24 b Fl(CSR)-5 b(VBR)15 b(:)h(con)o(v)o +(erts)f(compressed)g(sparse)i(ro)o(w)f(in)o(to)g(v)m(ariable)g(blo)q(c)o(k)g +(ro)o(w)g(format.)133 1269 y Fg(\017)24 b Fl(VBR)o(CSR)15 b(:)h(con)o(v)o +(erts)f(the)h(v)m(ariable)g(blo)q(c)o(k)g(ro)o(w)g(format)g(in)o(to)g(the)133 +1371 y Fg(\017)24 b Fl(COOELL)19 b(:)e(con)o(v)o(erts)g(the)g(co)q(ordinate)i +(format)d(in)o(to)i(the)f(Ellpac)o(k/Itpac)o(k)f(format.)25 +b(com-)182 1431 y(pressed)16 b(sparse)h(ro)o(w)g(format.)783 +1635 y Fh(UNAR)-5 b(Y)20 b(Mo)r(dule)133 1749 y Fg(\017)k Fl(SUBMA)l(T)15 +b(:)h(extracts)g(a)g(submatrix)f(from)g(a)i(sparse)g(matrix.)133 +1851 y Fg(\017)24 b Fl(FIL)l(TER)16 b(:)g(\014lters)g(elemen)o(ts)d(from)j(a) +g(matrix)f(according)h(to)h(their)e(magnitude.)133 1953 y Fg(\017)24 +b Fl(FIL)l(TERM:)16 b(Same)f(as)i(ab)q(o)o(v)o(e,)e(but)i(for)f(the)g(MSR)g +(format.)133 2054 y Fg(\017)24 b Fl(TRANSP)16 b(:)g(in-place)f(transp)q +(osition)j(routine)e(\(see)f(also)i(CSR)o(CSC)g(in)f(formats\))133 +2156 y Fg(\017)24 b Fl(GETELM)17 b(:)f(returns)g Fj(a)p Fl(\()p +Fj(i;)8 b(j)s Fl(\))16 b(for)g(an)o(y)g(\()p Fj(i;)8 b(j)s +Fl(\))16 b(from)f(a)i(CSR-stored)g(matrix.)133 2258 y Fg(\017)24 +b Fl(COPMA)l(T)16 b(:)g(copies)g(a)g(matrix)f(in)o(to)h(another)h(matrix)d +(\(b)q(oth)j(stored)g(csr\).)133 2359 y Fg(\017)24 b Fl(MSR)o(COP)16 +b(:)g(copies)g(a)g(matrix)f(in)h(MSR)g(format)f(in)o(to)h(a)h(matrix)d(in)i +(MSR)g(format.)133 2461 y Fg(\017)24 b Fl(GETELM)17 b(:)f(returns)g(a\(i,j\)) +g(for)g(an)o(y)h(\(i,j\))e(from)g(a)i(CSR-stored)g(matrix.)133 +2563 y Fg(\017)24 b Fl(GETDIA)16 b(:)g(extracts)g(a)h(sp)q(eci\014ed)e +(diagonal)i(from)f(a)g(matrix.)133 2664 y Fg(\017)24 b Fl(GETL)17 +b(:)f(extracts)g(lo)o(w)o(er)f(triangular)i(part.)p eop +%%Page: 33 33 +33 32 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(33)133 +132 y Fg(\017)24 b Fl(GETU)16 b(:)g(extracts)g(upp)q(er)h(triangular)f(part.) +133 232 y Fg(\017)24 b Fl(LEVELS)17 b(:)f(gets)h(the)f(lev)o(el)e(sc)o +(heduling)h(structure)h(for)g(lo)o(w)o(er)g(triangular)g(matrices.)133 +332 y Fg(\017)24 b Fl(AMASK)15 b(:)h(extracts)g Fj(C)h Fl(=)d +Fj(A)c Fg(\014)h Fj(M)133 433 y Fg(\017)24 b Fl(RPERM)16 b(:)g(p)q(erm)o +(utes)e(the)i(ro)o(ws)h(of)g(a)f(matrix)f(\()p Fj(B)h Fl(=)e +Fj(P)7 b(A)p Fl(\))133 533 y Fg(\017)24 b Fl(CPERM)16 b(:)g(p)q(erm)o(utes)f +(the)h(columns)f(of)h(a)h(matrix)d(\()p Fj(B)j Fl(=)d Fj(AQ)p +Fl(\))133 633 y Fg(\017)24 b Fl(DPERM)16 b(:)g(p)q(erm)o(utes)f(a)h(matrix)f +(\()p Fj(B)h Fl(=)e Fj(P)7 b(AQ)p Fl(\))16 b(giv)o(en)f(t)o(w)o(o)h(p)q(erm)o +(utations)g(P)l(,)g(Q)133 734 y Fg(\017)24 b Fl(DPERM2)17 b(:)k(general)16 +b(submatrix)f(p)q(erm)o(utation/extraction)g(routine.)133 834 +y Fg(\017)24 b Fl(DMPERM)16 b(:)g(symmetri)o(c)d(p)q(erm)o(utation)i(of)i(ro) +o(w)f(and)h(column)e(\(B=P)l(AP'\))g(in)h(MSR)g(fm)o(t.)133 +934 y Fg(\017)24 b Fl(D)o(VPERM)16 b(:)f(p)q(erm)o(utes)g(a)i(v)o(ector)e +(\(in-place\).)133 1034 y Fg(\017)24 b Fl(IVPERM)15 b(:)h(p)q(erm)o(utes)f +(an)h(in)o(teger)g(v)o(ector)f(\(in-place\).)133 1135 y Fg(\017)24 +b Fl(RETMX)16 b(:)g(returns)g(the)g(max)f(absolute)i(v)m(alue)f(in)f(eac)o(h) +h(ro)o(w)h(of)f(the)g(matrix.)133 1235 y Fg(\017)24 b Fl(DIAPOS)16 +b(:)g(returns)g(the)g(p)q(ositions)h(of)g(the)f(diagonal)h(elemen)o(ts)c(in)j +(A.)133 1335 y Fg(\017)24 b Fl(EXTBDG)16 b(:)g(extracts)g(the)g(main)f +(diagonal)i(blo)q(c)o(ks)f(of)g(a)h(matrix.)133 1436 y Fg(\017)24 +b Fl(GETBWD)17 b(:)f(returns)g(the)g(bandwidth)h(information)e(on)i(a)f +(matrix.)133 1536 y Fg(\017)24 b Fl(BLKFND)16 b(:)g(\014nds)g(the)g(blo)q(c)o +(k-size)f(of)i(a)g(matrix.)133 1636 y Fg(\017)24 b Fl(BLK)o(CHK)15 +b(:)h(c)o(hec)o(ks)f(whether)h(a)h(giv)o(en)e(in)o(teger)g(is)h(the)g(blo)q +(c)o(k)g(size)f(of)i Fj(A)p Fl(.)133 1737 y Fg(\017)24 b Fl(INFDIA)15 +b(:)g(obtains)i(information)f(on)g(the)g(diagonals)i(of)e Fj(A)p +Fl(.)133 1837 y Fg(\017)24 b Fl(AMUBDG)15 b(:)h(computes)f(the)h(n)o(um)o(b)q +(er)e(of)j(nonzero)g(elemen)n(ts)d(in)i(eac)o(h)g(ro)o(w)g(of)h +Fj(A)10 b Fg(\003)h Fj(B)s Fl(.)133 1937 y Fg(\017)24 b Fl(APLBDG)16 +b(:)g(computes)f(the)h(n)o(um)o(b)q(er)f(of)h(nonzero)h(elemen)o(ts)c(in)j +(eac)o(h)g(ro)o(w)g(of)h Fj(A)11 b Fl(+)g Fj(B)s Fl(.)133 2038 +y Fg(\017)24 b Fl(RNRMS)15 b(:)h(computes)f(the)h(norms)g(of)g(the)g(ro)o(ws) +h(of)g Fj(A)p Fl(.)133 2138 y Fg(\017)24 b Fl(CNRMS)16 b(:)f(computes)h(the)g +(norms)f(of)i(the)f(columns)f(of)h Fj(A)p Fl(.)133 2238 y Fg(\017)24 +b Fl(R)o(OSCAL)16 b(:)g(scales)g(the)g(ro)o(ws)h(of)f(a)h(matrix)d(b)o(y)i +(their)g(norms.)133 2339 y Fg(\017)24 b Fl(COSCAL)17 b(:)f(scales)g(the)g +(columns)f(of)h(a)h(matrix)d(b)o(y)i(their)f(norms.)133 2439 +y Fg(\017)24 b Fl(ADDBLK)16 b(:)g(adds)h(a)g(matrix)d(B)i(in)o(to)g(a)h(blo)q +(c)o(k)e(of)i(A.)133 2539 y Fg(\017)24 b Fl(GET1UP)18 b(:)f(collects)f(the)h +(\014rst)h(elemen)o(ts)d(of)i(eac)o(h)g(ro)o(w)h(of)g(the)f(upp)q(er)g +(triangular)h(p)q(ortion)182 2600 y(of)e(the)g(matrix.)133 +2700 y Fg(\017)24 b Fl(XTR)o(O)o(WS)15 b(:)h(extracts)g(giv)o(en)f(ro)o(ws)i +(from)e(a)i(matrix)d(in)i(CSR)h(format.)p eop +%%Page: 34 34 +34 33 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(34)793 +132 y Fh(INOUT)19 b(Mo)r(dule)133 244 y Fg(\017)24 b Fl(READMT)16 +b(:)g(reads)g(matrices)f(in)h(the)g(b)q(o)q(eing/Harw)o(ell)g(format.)133 +346 y Fg(\017)24 b Fl(PR)l(TMT)16 b(:)g(prin)o(ts)g(matrices)e(in)i(the)g(b)q +(o)q(eing/Harw)o(ell)g(format.)133 447 y Fg(\017)24 b Fl(DUMP)16 +b(:)g(prin)o(ts)g(ro)o(ws)g(of)h(a)f(matrix,)f(in)g(a)i(readable)f(format.) +133 548 y Fg(\017)24 b Fl(PL)l(TMT)17 b(:)f(pro)q(duces)h(a)f('pic')f(\014le) +h(for)g(plotting)g(a)h(sparse)g(matrix.)133 650 y Fg(\017)24 +b Fl(PSPL)l(TM)17 b(:)f(Generates)g(a)h(p)q(ost-script)g(plot)f(of)h(the)f +(non-zero)g(pattern)h(of)f(A.)133 751 y Fg(\017)24 b Fl(SMMS)16 +b(:)g(W)l(rite)f(the)h(matrix)f(in)g(a)i(format)f(used)g(in)g(SMMS)g(pac)o(k) +m(age.)133 852 y Fg(\017)24 b Fl(READSM)16 b(:)g(Reads)g(matrices)f(in)h(co)q +(ordinate)g(format)g(\(as)h(in)f(SMMS)f(pac)o(k)m(age\).)133 +954 y Fg(\017)24 b Fl(READSK)16 b(:)g(Reads)g(matrices)f(in)h(CSR)g(format)g +(\(simpli\014ed)d(H/B)j(formate\).)133 1055 y Fg(\017)24 b +Fl(SKIT)16 b(:)g(W)l(rites)g(matrices)e(to)j(a)f(\014le,)f(format)h(same)f +(as)i(ab)q(o)o(v)o(e.)133 1157 y Fg(\017)24 b Fl(PR)l(TUNF)15 +b(:)h(W)l(rites)g(matrices)e(\(in)i(CSR)h(format\))e(unformatted.)133 +1258 y Fg(\017)24 b Fl(READUNF)15 b(:)h(Reads)g(unformatted)g(data)h(of)g +(matrices)d(\(in)i(CSR)g(format\).)817 1461 y Fh(INF)n(O)j(Mo)r(dule)133 +1574 y Fg(\017)24 b Fl(INF)o(OFUN)14 b(:)i(routines)g(for)g(statistics)g(on)h +(a)g(sparse)g(matrix.)760 1776 y Fh(MA)-5 b(TGEN)19 b(Mo)r(dule)133 +1889 y Fg(\017)24 b Fl(GEN57PT)17 b(:)f(generates)h(5-p)q(oin)o(t)g(and)f +(7-p)q(oin)o(t)h(matrices.)133 1990 y Fg(\017)24 b Fl(GEN57BL)17 +b(:)f(generates)g(blo)q(c)o(k)g(5-p)q(oin)o(t)h(and)g(7-p)q(oin)o(t)g +(matrices.)133 2092 y Fg(\017)24 b Fl(GENFEA)16 b(:)g(generates)g(\014nite)g +(elemen)o(t)d(matrices)h(in)i(assem)o(bled)f(form.)133 2193 +y Fg(\017)24 b Fl(GENFEU)16 b(:)g(generates)g(\014nite)g(elemen)o(t)d +(matrices)h(in)i(unassem)o(bled)f(form.)133 2295 y Fg(\017)24 +b Fl(ASSMB1)16 b(:)21 b(assem)o(bles)14 b(an)j(unassem)o(bled)e(matrix)f +(\(as)j(pro)q(duced)g(b)o(y)f(genfeu\).)133 2396 y Fg(\017)24 +b Fl(MA)l(TRF2)16 b(:)21 b(Routines)16 b(for)h(generating)f(sparse)h +(matrices)d(b)o(y)i(Zlatev)f(et)h(al.)133 2497 y Fg(\017)24 +b Fl(DCN:)16 b(Routines)g(for)g(generating)h(sparse)g(matrices)d(b)o(y)i +(Zlatev)f(et)h(al.)133 2599 y Fg(\017)24 b Fl(ECN:)16 b(Routines)g(for)g +(generating)h(sparse)g(matrices)d(b)o(y)i(Zlatev)f(et)h(al.)133 +2700 y Fg(\017)24 b Fl(MARK)o(GEN:)14 b(subroutine)j(to)g(pro)q(duce)f(a)h +(Mark)o(o)o(v)e(c)o(hain)h(matrix)e(for)j(a)g(random)e(w)o(alk.)p +eop +%%Page: 35 35 +35 34 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(35)772 +132 y Fh(BLASSM)19 b(Mo)r(dule)133 241 y Fg(\017)24 b Fl(AMUB)15 +b(:)g(computes)g Fj(C)j Fl(=)13 b Fj(A)e Fg(\003)g Fj(B)19 +b Fl(.)133 341 y Fg(\017)24 b Fl(APLB)16 b(:)g(computes)f Fj(C)i +Fl(=)d Fj(A)d Fl(+)g Fj(B)18 b Fl(.)133 442 y Fg(\017)24 b +Fl(APLSB)16 b(:)g(computes)f Fj(C)i Fl(=)d Fj(A)d Fl(+)g Fj(sB)s +Fl(.)133 542 y Fg(\017)24 b Fl(APMBT)15 b(:)h(Computes)g Fj(C)h +Fl(=)d Fj(A)d Fg(\006)f Fj(B)884 524 y Ff(T)911 542 y Fl(.)133 +643 y Fg(\017)24 b Fl(APLSBT)16 b(:)g(Computes)g Fj(C)h Fl(=)d +Fj(A)c Fl(+)h Fj(s)g Fg(\003)g Fj(B)966 625 y Ff(T)1010 643 +y Fl(.)133 743 y Fg(\017)24 b Fl(DIAMUA)14 b(:)i(Computes)g +Fj(C)h Fl(=)d Fj(D)q(iag)f Fg(\003)e Fj(A)16 b Fl(.)133 844 +y Fg(\017)24 b Fl(AMUDIA)14 b(:)i(Computes)g Fj(C)h Fl(=)d +Fj(A)d Fg(\003)g Fj(D)q(iag)18 b Fl(.)133 944 y Fg(\017)24 +b Fl(APLDIA)16 b(:)g(Computes)f Fj(C)j Fl(=)13 b Fj(A)e Fl(+)g +Fj(D)q(iag)18 b Fl(.)133 1045 y Fg(\017)24 b Fl(APLSCA)16 b(:)g(Computes)g +Fj(A)d Fl(:=)g Fj(A)e Fl(+)g Fj(sI)20 b Fl(\()p Fj(s)c Fl(=)g(scalar\).)763 +1244 y Fh(MA)-5 b(TVEC)20 b(Mo)r(dule)133 1354 y Fg(\017)k +Fl(AMUX)15 b(:)g Fj(A)h Fl(times)f(a)h(v)o(ector.)k(Compressed)c(Sparse)h(Ro) +o(w)f(\(CSR\))h(format.)133 1454 y Fg(\017)24 b Fl(A)l(TMUX)15 +b(:)h Fj(A)451 1436 y Ff(T)494 1454 y Fl(times)e(a)j(v)o(ector.)j(CSR)d +(format.)133 1555 y Fg(\017)24 b Fl(AMUXE)15 b(:)h Fj(A)f Fl(times)g(a)h(v)o +(ector.)21 b(Ellpac)o(k/Itpac)o(k)14 b(\(ELL\))k(format.)133 +1655 y Fg(\017)24 b Fl(AMUXD)15 b(:)h Fj(A)f Fl(times)g(a)h(v)o(ector.)21 +b(Diagonal)c(\(DIA\))f(format.)133 1756 y Fg(\017)24 b Fl(AMUXJ)15 +b(:)g Fj(A)h Fl(times)f(a)h(v)o(ector.)21 b(Jagged)c(Diagonal)g(\(JAD\))f +(format.)133 1856 y Fg(\017)24 b Fl(VBRMV)14 b(:)i Fj(A)g Fl(times)e(a)j(v)o +(ector.)j(V)l(ariable)c(Blo)q(c)o(k)f(Ro)o(w)h(\(VBR\))f(format.)133 +1957 y Fg(\017)24 b Fl(LSOL)e(:)f(Unit)g(lo)o(w)o(er)f(triangular)i(system)d +(solution.)37 b(Compressed)21 b(Sparse)g(Ro)o(w)h(\(CSR\))182 +2017 y(format.)133 2117 y Fg(\017)i Fl(LDSOL)17 b(:)f(Lo)o(w)o(er)h +(triangular)f(system)f(solution.)21 b(Mo)q(di\014ed)c(Sparse)f(Ro)o(w)h +(\(MSR\))f(format.)133 2218 y Fg(\017)24 b Fl(LSOL)16 b(:)e(Unit)g(lo)o(w)o +(er)g(triangular)i(system)d(solution.)21 b(Compressed)14 b(Sparse)i(Column)e +(\(CSC\))182 2278 y(format.)133 2379 y Fg(\017)24 b Fl(LDSOLC:)17 +b(Lo)o(w)o(er)e(triangular)h(system)e(solution.)22 b(Mo)q(di\014ed)15 +b(Sparse)h(Column)f(\(MSC\))g(for-)182 2439 y(mat.)133 2539 +y Fg(\017)24 b Fl(LDSOLL:)17 b(Lo)o(w)o(er)g(triangular)f(system)f(solution)i +(with)f(lev)o(el)e(sc)o(heduling.)20 b(MSR)c(format.)133 2640 +y Fg(\017)24 b Fl(USOL)c(:)f(Unit)g(upp)q(er)h(triangular)g(system)f +(solution.)32 b(Compressed)19 b(Sparse)h(Ro)o(w)g(\(CSR\))182 +2700 y(format.)p eop +%%Page: 36 36 +36 35 bop 60 0 a Fm(SP)l(ARSKIT)p 60 7 1853 2 v 1564 w Fl(36)133 +132 y Fg(\017)24 b Fl(UDSOL)16 b(:)f(Upp)q(er)h(triangular)g(system)e +(solution.)21 b(Mo)q(di\014ed)16 b(Sparse)g(Ro)o(w)g(\(MSR\))f(format.)133 +233 y Fg(\017)24 b Fl(USOLC)g(:)g(Unit)f(upp)q(er)h(triangular)h(system)d +(solution.)45 b(Compressed)23 b(Sparse)i(Column)182 293 y(\(CSC\))17 +b(format.)133 395 y Fg(\017)24 b Fl(UDSOLC:)g(Upp)q(er)f(triangular)h(system) +f(solution.)43 b(Mo)q(di\014ed)24 b(Sparse)g(Column)f(\(MSC\))182 +455 y(format.)715 638 y Fh(ORDERINGS)18 b(Mo)r(dule)133 752 +y Fg(\017)24 b Fl(levset.f)15 b(:)21 b(lev)o(el)14 b(set)i(based)h +(reordering,)e(including)h(R)o(CM)133 854 y Fg(\017)24 b Fl(color.f)16 +b(:)21 b(coloring)16 b(based)h(reordering)133 956 y Fg(\017)24 +b Fl(ccn.f)15 b(:)21 b(reordering)16 b(based)h(on)g(strongly)f(connected)g +(comp)q(onen)o(ts)804 1148 y Fh(ITSOL)j(Mo)r(dule)133 1262 +y Fg(\017)24 b Fl(ILUT:)16 b(ILUT\(k\))f(preconditioned)h(GMRES)g(mini)e(pac) +o(k)m(age.)133 1364 y Fg(\017)24 b Fl(ITERS:)16 b(nine)f(basic)i(iterativ)o +(e)d(linear)i(system)e(solv)o(ers.)796 1556 y Fh(PLOTS)k(Mo)r(dule)133 +1670 y Fg(\017)24 b Fl(PSGRD:)16 b(plots)h(a)g(symmetr)o(ic)c(graph.)133 +1772 y Fg(\017)24 b Fl(TEXPL)l(T1:)e(allo)o(ws)17 b(sev)o(eral)e(matrices)f +(in)i(the)g(same)f(picture.)133 1874 y Fg(\017)24 b Fl(TEX)o(GRID1:)d(allo)o +(ws)16 b(sev)o(eral)g(grids)g(in)g(the)g(same)f(picture.)764 +2066 y Fh(MA)-5 b(TEXP)20 b(Mo)r(dule)133 2180 y Fg(\017)k +Fl(EXPPR)o(O:)15 b(computes)g Fj(w)g Fl(=)f Fj(exp)p Fl(\()p +Fj(t)i(A)p Fl(\))g Fj(v)r Fl(.)133 2282 y Fg(\017)24 b Fl(PHIPR)o(O:)16 +b(computes)g Fj(w)h Fl(=)e Fj(\036)p Fl(\()p Fj(A)i(t)p Fl(\))f +Fj(v)r Fl(,)h(where)g Fj(\036)p Fl(\()p Fj(x)p Fl(\))e(=)g(\(1)d +Fg(\000)g Fj(exp)p Fl(\()p Fj(x)p Fl(\)\))p Fj(=x)p Fl(.)24 +b(Also)17 b(solv)o(es)f(the)182 2342 y(P)l(.D.E.)f(system)g +Fj(y)526 2324 y Fb(0)551 2342 y Fl(=)f Fj(Ay)e Fl(+)f Fj(b)p +Fl(.)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/DOC/paper.tex b/DOC/paper.tex new file mode 100644 index 0000000..9bb7a5f --- /dev/null +++ b/DOC/paper.tex @@ -0,0 +1,1998 @@ +%\documentstyle[12pt]{article} +\documentclass[12pt]{article} +\usepackage{graphicx} + +%% page lay-out / RUNNING HEAD +\pagestyle{myheadings} +\markright{\underline{SPARSKIT \hskip 5.3in} \hskip -1.0in} +\setlength{\headheight}{0.3in} +\setlength{\headsep}{0.3in} +%% +\setlength{\textheight}{8.7in} +\setlength{\textwidth}{6.2in} +\setlength{\oddsidemargin}{0.2in} % +\setlength{\evensidemargin}{0.2in} % +\setlength{\parindent}{0.2in} % +\setlength{\topmargin}{-0.3in} %% +%% abstract redefinition. +\def\@abssec#1{\vspace{.5in}\footnotesize \parindent 0.2in +{\bf #1. }\ignorespaces} +\def\abstract{\@abssec{Abstract}} +%% +\setcounter{secnumdepth}{5} +\setcounter{tocdepth}{5} +%% a few macros +\def\half{{1\over2}}% +\def\del{\partial} % +\def\nref#1{(\ref{#1})} +%% more macros: for indented boxes. +\def\marg#1{\parbox[b]{1.3in}{\bf #1}} +\def\disp#1{\parbox[t]{4.62in}{#1} \vskip 0.2in } +%% +%\input{psfig} + +\title{ +\parbox{4in}{SPARSKIT: a basic tool kit for sparse +matrix computations } } +\author{\parbox{4in}{VERSION 2\\Youcef Saad\thanks{ +Work done partly at CSRD, university of Illinois and partly at RIACS +(NASA Ames Research Center). Current address: Computer Science Dept., +University of Minnesota, Minneapolis, MN 55455. +This work was supported in part by the NAS Systems +Division, via Cooperative Agreement NCC 2-387 between NASA and +the University Space Research Association (USRA) +and in part by the Department of Energy under grant +DE-FG02-85ER25001.}}} + +\date{ } + +\begin{document} +\bibliographystyle{plain} +%\bibliographystyle{SIAM} + +\maketitle + +\vskip 1.5in + +\centerline{{\it June 6, 1994} } +%\centerline{{\it May 21, 1990} } +%\centerline{{\it Updated June 5, 1993 --- Version 2} } + +\thispagestyle{empty} + +\begin{abstract} +This paper presents the main features of a tool package for +manipulating and working with sparse matrices. +One of the goals of the package is to provide +basic tools to facilitate exchange of software and data +between researchers in sparse matrix computations. +Our starting point is the Harwell/Boeing collection of matrices +for which we provide a number of tools. +Among other things the package provides programs for converting +data structures, printing simple statistics on a matrix, +plotting a matrix profile, performing basic linear algebra +operations with sparse matrices and so on. +\end{abstract} + +\newpage + +\section{Introduction} Research on sparse matrix techniques has become +increasingly complex, and this trend is likely to accentuate if only +because of the growing need +to design efficient sparse matrix algorithms for modern supercomputers. +While there are a number of packages and `user +friendly' tools, for performing computations with small dense +matrices there is a lack of any similar tool or in fact of any +general-purpose libraries for +working with sparse matrices. Yet a collection of a few basic programs to +perform some elementary and common tasks may be very useful in reducing the +typical time to implement and test sparse matrix algorithms. That a common +set +of routines shared among researchers does not yet exist for sparse matrix +computation is rather surprising. Consider the contrasting situation in dense +matrix computations. The Linpack and Eispack packages developed in the 70's +have been of tremendous help in various areas of scientific computing. +One might speculate on the number of hours of programming efforts +saved worldwide thanks to the widespread availability of these packages. +In contrast, it is often the case that researchers in sparse matrix +computation +code their own subroutine for such things as converting the storage mode +of a matrix or for reordering a matrix +according to a certain permutation. One of the reasons for this situation +might be the absence of any standard for sparse +matrix computations. For instance, the number of different data +structures used to store sparse matrices in various applications is +staggering. For the same basic data structure there often exist a +large number of variations in use. As sparse matrix computation +technology is maturing there is a desperate need for some standard for +the basic storage schemes and possibly, although this is more +controversial, for the basic linear algebra operations. + +An important example where a package such as SPARSKIT can be helpful is for +exchanging matrices for research or other purposes. In this +situation, one must often translate the matrix from some initial data +structure in which it is generated, into a different desired data +structure. One way around this difficulty is to restrict +the number of schemes that can be used and set some standards. + However, this is not +enough because often the data structures are chosen for their +efficiency and convenience, and it is not reasonable to ask +practitioners to abandon their favorite storage schemes. What is +needed is a large set of programs to translate one data structure into +another. In the same vein, subroutines that generate test matrices +would be extremely valuable since they would allow users to have +access to a large number of matrices without the burden of actually +passing large sets of data. + +A useful collection of sparse matrices known as the Harwell/Boeing +collection, which is publically available \cite{Duff-HB}, has been +widely used in recent years for testing and comparison purposes. +Because of the importance of this collection many of the tools in +SPARSKIT can be considered as companion tools to it. For +example, SPARSKIT supplies simple routines to create a Harwell/Boeing (H/B) +file from a matrix in any format, tools for creating pic files in +order to plot a H/B matrix, a few routines that will deliver +statistics for any H/B matrix, etc.. However, SPARSKIT is not limited +to being a set of tools to +work with H/B matrices. Since one of our main motivations is +research on iterative methods, we provide numerous subroutines that may help +researchers in this specific area. +SPARSKIT will hopefully be an evolving package +that will benefit from contributions from other researchers. This +report is a succinct description of the package in this release. + +\begin{figure}[h] +%\special{psfile=dir.eps vscale = 75 hscale = 75 hoffset =0 voffset= -30} +\includegraphics[width=15cm]{dir} +\caption {General organization of SPARSKIT.} +\label{organization} +%\vskip 0.1cm +\end{figure} + +\section{Data structures for sparse matrices and the conversion routines} + +One of the difficulties in sparse matrix computations is the variety +of types of matrices that are encountered in practical applications. +The purpose of each of these schemes is to gain efficiency both in +terms of memory utilization and arithmetic operations. As a result +many different ways of storing sparse matrices have been devised to +take advantage of the structure of the matrices or the specificity of +the problem from which they arise. For example if it is known that a +matrix consists of a few diagonals one may simply store these +diagonals as vectors and the offsets of each diagonal with respect to +the main diagonal. If the matrix is not regularly structured, then +one of the most common storage schemes in use today is what we refer +to in SPARSKIT as the Compressed Sparse Row (CSR) scheme. In this +scheme all the nonzero entries are stored row by row in a +one-dimensional real array $A$ together with an array $JA$ containing +their column indices and a pointer array which contains the addresses +in $A$ and $JA$ of the beginning of each row. The order of the elements +within each row does not matter. Also of importance +because of its simplicity is the coordinate storage scheme in which +the nonzero entries of $A$ are stored in any order together with their +row and column indices. Many of the other existing schemes are +specialized to some extent. The reader is +referred to the book by Duff et al. \cite{Duff-book} for more details. + +\subsection{Storage Formats} +Currently, +the conversion routines of SPARSKIT can handle thirteen different storage +formats. These include some of the most commonly used schemes but they +are by no means exhaustive. We found it particularly useful to have +all these storage modes when trying to extract a matrix from someone +else's application code in order, for example, to analyze it with the +tools described in the next sections or, more commonly, to try a given +solution method which requires a different data structure than the +one originally used in the application. Often the matrix is stored in +one of these modes or a variant that is very close to it. We hope to +add many more conversion routines as SPARSKIT evolves. + +In this section we describe in detail the storage schemes that are +handled in the FORMATS module. For convenience we have decided to +label by a three character name each format used. We start by listing +the formats and then describe them in detail in separate subsections +(except for the dense format which needs no detailed description). + +\begin{description} +\item{{\bf DNS}} Dense format +\item{{\bf BND}} Linpack Banded format +\item{{\bf CSR}} Compressed Sparse Row format +\item{{\bf CSC}} Compressed Sparse Column format +\item{{\bf COO}} Coordinate format +\item{{\bf ELL}} Ellpack-Itpack generalized diagonal format +\item{{\bf DIA}} Diagonal format +\item{{\bf BSR}} Block Sparse Row format +\item{{\bf MSR}} Modified Compressed Sparse Row format +\item{{\bf SSK}} Symmetric Skyline format +\item{{\bf NSK}} Nonsymmetric Skyline format +\item{{\bf LNK}} Linked list storage format +\item{{\bf JAD}} The Jagged Diagonal format +\item{{\bf SSS}} The Symmetric Sparse Skyline format +\item{{\bf USS}} The Unsymmetric Sparse Skyline format +\item{{\bf VBR}} Variable Block Row format +\end{description} + +In the following sections we denote by $A$ the matrix under +consideration and by $N$ its row dimension and $NNZ$ the number of its +nonzero elements. + +\subsubsection{Compressed Sparse Row and related formats + (CSR, CSC and MSR)} The Compressed Sparse Row format is the basic +format used in SPARSKIT. Its data structure consists of three arrays. + +\begin{itemize} + +\item A real array $A$ containing the real values $a_{ij}$ stored row by row, +from row 1 to $N$. The length of $A$ is NNZ. + +\item An integer array $JA$ containing the column indices +of the elements $a_{ij}$ as stored in the array $A$. The length of +$JA$ is NNZ. + +\item An integer array $IA$ containing the pointers to the +beginning of each row in the arrays $A$ and $JA$. Thus the content of +$IA(i)$ is the position in arrays $A$ and $JA$ where the $i$-th row +starts. The length of $IA$ is $N+1$ with $IA(N+1)$ containing the +number $IA(1)+NNZ$, i.e., the address in $A$ and $JA$ of the beginning +of a fictitious row $N+1$. + +\end{itemize} +The order of the nonzero elements within the same row are not important. +A variation to this scheme is to sort the elements in each row +in such a way that their column positions are in increasing order. +When this sorting in enforced, it is often possible to +make substantial savings in the number of operations of +some well-known algorithms. +The Compressed Sparse Column format is identical with the Compressed +Sparse Row format except that the columns of $A$ are stored instead of +the rows. In other words the Compressed Sparse Column format is simply +the Compressed Sparse Row format for the matrix $A^T$. + +The Modified Sparse Row (MSR) format is a rather common variation of +the Compressed Sparse Row format which consists of keeping the main +diagonal of $A$ separately. The corresponding data structure consists +of a real array $A$ and an integer array $JA$. The first $N$ positions +in $A$ contain the diagonal elements of the matrix, in order. The position +$N+1$ of the array $A$ is not used. Starting from position $N+2$, the +nonzero elements of $A$, excluding its diagonal elements, are stored +row-wise. Corresponding to each element $A(k)$ the integer $JA(k)$ is +the column index of the element $A(k)$ in the matrix $A$. The $N+1$ +first positions of $JA$ contain the pointer to the beginning of each +row in $A$ and $JA$. The advantage of this storage mode is that many +matrices have a full main diagonal, i.e., $a_{ii} \ne 0, i=1,\ldots, +N$, and this diagonal is best represented by an array of length $N$. +This storage mode is particularly useful for triangular matrices with +non-unit diagonals. Often the diagonal is then stored in inverted form +(i.e. $1/a_{ii} $ is stored in place of $a_{ii} $) because triangular +systems are often solved repeatedly with the same matrix many times, +as is the case for example in preconditioned Conjugate Gradient +methods. The column oriented analogue of the MSR format, called MSC +format, is also used in some of the other modules, but no +transformation to/from it to the CSC format is necessary: for example +to pass from CSC to MSC one can use the routine to pass from the CSR +to the MSR formats, since the data structures are identical. The + above three storage modes are used in many well-known packages. + +\subsubsection{The banded Linpack format (BND)} +Banded matrices represent the simplest form of sparse matrices and +they often convey the easiest way of exploiting sparsity. There are +many ways of storing a banded matrix. The one we adopted here follows +the data structure used in the Linpack banded solution routines. Our +motivation is that one can easily take advantage of this widely available +package if the matrices are banded. For fairly small matrices (say, +$N < 2000$ on supercomputers, $ N < 200 $ on fast workstations, and +with a bandwidth of $O(N^{\half} )$), this may represent a viable and +simple way of solving linear systems. One must first transform the +initial data structure into the banded Linpack format and then call the +appropriate band solver. For large problems it is clear that a better +alternative would be to use a sparse solver such as MA28, which +requires the input matrix to be in the coordinate format. + +%%It is +%%expected that these types of utilization of the conversion routines +%% will in fact be among the most common ones. + +In the BND format the nonzero elements of $A$ are stored in a +rectangular array $ABD$ with the nonzero elements of the $j$-th column +being stored in the $j-th$ column of $ABD$. We also need to know the +number $ML$ of diagonals below the main diagonals and the number $MU$ +of diagonals above the main diagonals. Thus the bandwidth of $A$ is +$ML+MU+1$ which is the minimum number of rows required in the array +$ABD$. An additional integer parameter is needed to indicate which row +of $ABD$ contains the lowest diagonal. + +\subsubsection{The coordinate format (COO) } + +The coordinate format is certainly the simplest storage scheme for +sparse matrices. It consists of three arrays: a real array of size +$NNZ$ containing the real values of nonzero elements of $A$ in any +order, an integer array containing their row indices and a second +integer array containing their column indices. Note that this scheme +is as general as the CSR format, but from the point of view of memory +requirement it is not as efficient. On the other hand it is +attractive because of its simplicity and the fact that it is very +commonly used. Incidentally, we should mention a variation to this +mode which is perhaps the most economical in terms of memory usage. +The modified version requires only a real array $A$ containing the +real values $a_{ij}$ along with only one integer array that contains +the integer values $ (i-1)N + j$ for each corresponding nonzero +element $a_{ij}$. It is clear that this is an unambiguous +representation of all the nonzero elements of $A$. There are two +drawbacks to this scheme. First, it requires some integer arithmetic +to extract the column and row indices of each element when they are +needed. Second, for large matrices it may lead to integer overflow +because of the need to deal with integers which may be very large (of +the order of $N^2$). Because of these two drawbacks this scheme has +seldom been used in practice. + +\subsubsection{The diagonal format (DIA) } +The matrices that arise in many applications often consist of a few +diagonals. This structure has probably been the first one to be +exploited for the purpose of improving performance of +matrix by vector products on supercomputers, see references in +\cite{Saad-Boeing}. To store +these matrices we may store the diagonals in a rectangular array +$DIAG(1:N,1:NDIAG) $ where $NDIAG$ is the number of diagonals. We +also need to know the offsets of each of the diagonals with respect to +the main diagonal. These will be stored in an array $IOFF(1:NDIAG)$. +Thus, in position $(i,k)$ of the array $DIAG$ is located the element +$a_{i,i+ioff(k)}$ of the original matrix. The order in which the +diagonals are stored in the columns of $DIAG$ is unimportant. Note +also that all the diagonals except the main diagonal have fewer than +$N$ elements, so there are positions in $DIAG$ that will not be used. + +In many applications there is a small number of non-empty diagonals +and this scheme is enough. In general however, it may be desirable to +supplement this data structure, e.g., by a compressed sparse row +format. A general matrix is therefore represented as the sum of a +diagonal-structured matrix and a general sparse matrix. The +conversion routine CSRDIA which converts from the compressed +sparse row format to the diagonal format has an option to this +effect. If the user wants to convert a general sparse matrix to one +with, say, 5 diagonals, and if the input matrix has more than 5 +diagonals, the rest of the matrix (after extraction of the 5 desired +diagonals) will be put, if desired, into a matrix in the CSR format. +In addition, the code may also compute the most important 5 diagonals +if wanted, or it can get those indicated by the user through the array +$IOFF$. + +\subsubsection{The Ellpack-Itpack format (ELL) } +The Ellpack-Itpack format +\cite{Oppe-Kincaid,Young-Oppe-al,Oppe-NSPCG} is a +generalization of the diagonal storage scheme which is intended for +general sparse matrices with a limited maximum number of nonzeros per +row. Two rectangular arrays of the same size are required, one real +and one integer. The first, $COEF$, is similar to $DIAG$ and contains +the nonzero elements of $A$. Assuming that there are at most $NDIAG$ +nonzero elements in each row of $A$, we can store the nonzero elements +of each row of the matrix in a row of the array $COEF(1:N,1:NDIAG)$ +completing the row by zeros if necessary. Together with $COEF$ we +need to store an integer array $JCOEF(1:N,1:NDIAG)$ which contains the +column positions of each entry in $COEF$. + +\subsubsection{The Block Sparse Row format (BSR)} +Block matrices are common in all areas of scientific computing. The +best way to describe block matrices is by viewing them as sparse +matrices whose nonzero entries are square dense blocks. Block matrices +arise from the discretization of partial differential equations when +there are several degrees of freedom per grid point. There are +restrictions to this scheme. Each of the blocks is treated as a dense +block. If there are zero elements within each block they must be +treated as nonzero elements with the value zero. + +There are several variations to the method used for storing sparse +matrices with block structure. The one considered here, the Block +Sparse Row format, is a simple generalization of the Compressed Sparse +Row format. + +We denote here by $NBLK$ the dimension of each block, by +$NNZR$ the number of nonzero blocks in $A$ (i.e., +$NNZR = NNZ/(NBLK^2) $) and by $NR$ the block dimension of $A$, +(i.e., $NR = N/NBLK$), the letter $R$ standing for `reduced'. +Like the Compressed Sparse Row format we need three arrays. A rectangular +real array $A(1:NNZR,1:NBLK,1:NBLK) $ contains the nonzero +blocks listed (block)-row-wise. Associated with this real array +is an integer array +$JA(1:NNZR) $ which holds the actual column positions in the +original matrix of the $(1,1)$ elements of the nonzero blocks. +Finally, the pointer array $IA(1:NR+1)$ points to the beginning +of each block row in $A$ and $JA$. + +The savings in memory and in the use of indirect addressing with this +scheme over Compressed Sparse Row can be substantial for large +values of $NBLK$. + +\subsubsection{The Symmetric Skyline format (SSK) } +A skyline matrix is often referred to as a variable band +matrix or a profile matrix \cite{Duff-book}. The main +attraction of skyline matrices is that when pivoting is +not necessary then the skyline structure of the matrix is preserved +during Gaussian elimination. If the matrix is symmetric +we only need to store its lower triangular part. This is a +collection of rows whose length varies. A simple method used to store +a Symmetric Skyline matrix is to place all the rows in order from +1 to $N$ in a real array $A$ and then keep an integer array which holds +the pointers to the beginning of each row, see \cite{Duff-survey}. +The column positions of the nonzero elements stored in $A$ +can easily be derived and are therefore not needed. However, there +are several variations to this scheme that are commonly used is +commercial software packages. For example, we found that in many +instances the pointer is to the diagonal element rather than to the +first element in the row. In some cases (e.g., IBM's ISSL library) +both are supported. Given that these variations are commonly used +it is a good idea to provide at least a few of them. + +\subsubsection{The Non Symmetric Skyline format (NSK) } +Conceptually, the data structure of a nonsymmetric skyline +matrix consists of two substructures. +The first consists of the lower part of $A$ stored in skyline format +and the second of its upper triangular part stored in a column +oriented skyline format (i.e., the transpose is stored in +standard row skyline mode). Several ways of putting these +substructures together may be used and there are no compelling +reasons for preferring one strategy over another one. +One possibility is to use two separate arrays $AL$ and $AU$ for +the lower part and upper part respectively, with the diagonal +element in the upper part. The data structures for each of +two parts is similar to that used for the SSK storage. + +%% NOT DONE YET --- +%%We chose to store contiguously each row of the lower part and column of +%%the upper part of the matrix. The real array $A$ will contain +%%the 1-st row followed by the first column (empty), followed +%%by the second row followed by the second column, etc.. +%%An additional pointer is needed to indicate where the +%%diagonal elements, which separate the lower from the upper part, +%%are located in this array. G + +\subsubsection{The linked list storage format (LNK) } +This is one of the oldest data structures used for sparse matrix computations. +It consists of four arrays: $A$, $JCOL$, $LINK$ and $JSTART$. +The arrays $A$ and $JCOL$ contain the nonzero elements and their +corresponding column indices respectively. The integer array $LINK$ is +the usual link pointer array in linked list data structures: +$LINK(k)$ points to the position of the nonzero element next to +$A(k), JCOL(k)$ in the same row. Note that the order of the elements +within each row is unimportant. If $LINK(k) =0$ then there is no +next element, i.e., $A(k), JCOL(k)$ is the last element of the row. +Finally, $ISTART$ points to the first element of each row in +in the previous arrays. Thus, $k=ISTART(1)$ points to the first element +of the first row, in $A, ICOL$, + $ISTART(2) $ to the second element, etc.. +As a convention $ISTART(i) = 0$, means that the $i$-th row is empty. + +\subsubsection{The Jagged Diagonal format (JAD)} +This storage mode is very useful for the efficient implementation +of iterative methods on parallel and vector processors +\cite{Saad-Boeing}. Starting from the CSR format, the idea is to +first reorder the rows of the matrix decreasingly according to their +number of nonzeros entries. Then, a new data structure is built +by constructing what we call ``jagged diagonals" (j-diagonals). +We store as a dense vector, the vector consisting of all +the first elements in $A, JA$ from each row, together with an integer +vector containing the column positions of the corresponding +elements. This is followed by the second jagged diagonal consisting of the +elements in the second positions from the left. As we build more and +more of these diagonals, their length decreases. The number of +j-diagonals is equal to the number of nonzero elements of the first +row, i.e., to the largest number of nonzero elements per row. The +data structure to represent a general matrix in this form consists, +before anything, of the permutation array which reorders the rows. +Then the real array $A$ containing the jagged diagonals in succession +and the array $JA$ of the corresponding column positions are stored, +together with a pointer array $ IA $ which points to the beginning of +each jagged diagonal in the arrays $A, JA$. The advantage of this +scheme for matrix multiplications has been illustrated in +\cite{Saad-Boeing} and in \cite{Anderson-Saad} in the +context of triangular system solutions. + +\subsubsection{The Symmetric and Unsymmetric Sparse Skyline format +(SSS, USS)} + +This is an extension of the CSR-type format described above. +In the symmetric version, the following arrays are used: +$DIAG$ stores the diagonal, +$AL, JAL, IAL$ stores the strict lower part in CSR format, and +$AU$ stores the values of the strict upper part in CSC format. +In the unsymmetric version, instead of $AU$ alone, the strict upper part +is stored in $AU, JAU, IAU$ in CSC format. + +%% THIS SECTION HAS BEEN MODIFIED +%% \subsubsection{The Compressed Variable Block Format(CVB)} +%% This is an extension of the Block Sparse Row format (BSR). In the BSR +%% format, all the blocks have the same size. +%% A more general way of partitioning might allow the +%% matrix to be split into different size blocks. In the CVB format, an +%% arbitrary partitioning of the matrix is allowed. However, the columns and +%% the rows must be split in the same way. +%% +%% Figure 0 shows a 9x9 sparse matrix and its corresponding storage vectors. +%% Let $h$ be the index of the leading elements of the $k^{th}$ block +%% stored in $AA$. Then $k^{th}$ block of size $m*p$ is stored in +%% $AA(h)$ to $AA(h+mp-1)$. +%% For example, the $3^{rd}$ block is stored in $AA(9)$ to $AA(17)$. +%% +%% The data structure consists of the integers \(N\), \(NB\), and the arrays +%% \(AA\), \(JA\), \(IA\), and +%% \(KVST\), where \(N\) is the matrix size, i.e.~number of rows in the +%% matrix, \(NB\) is the number of block rows, \(AA\) stores the non-zero +%% values of the matrix, \(JA\) has the column indices of the first +%% elements in the blocks, \(IA\) contains the pointers to the beginning +%% of each block row (in \(AA\)), \(KVST\) contains the index of +%% the first row in each block row. +%% +%% \begin{figure}[h] +%% \vspace{3in} +%% \special{psfile= fig1.eps vscale = 100 hscale = 100 hoffset =-50 voffset= -420} +%%\caption {\bf Fig 1: An example of a 9x9 sparse matrix and its storage vectors. } +%%\label{conventional} +%% \end{figure} + +\subsubsection{The Variable Block Row format (VBR)} +In many applications, matrices are blocked, but the blocks are not all +the same size. These so-called variable block matrices arise from the +discretization of systems of partial differential equations where there +is a varying number of equations at each grid point. Like in the Block +Sparse Row (BSR) format, all entries of nonzero blocks (blocks which +contain any nonzeros) are stored, even if their value is zero. Also +like the BSR format, there is significant savings in integer pointer +overhead in the data structure. + +Variable block generalizations can be made to many matrix storage +formats. The Variable Block Row (VBR) format is a generalization of the +Compressed Sparse Row (CSR) format, and is similar to the variable +block format used at the University of Waterloo, and one currently +proposed in the Sparse BLAS toolkit. + +In the VBR format, the $IA$ and $JA$ arrays of the CSR format store the +sparsity structure of the blocks. The entries in each block are stored +in $A$ in column-major order so that each block may be passed as a small +dense matrix to a Fortran subprogram. The block row and block column +partitionings are stored in the vectors {\em KVSTR} and {\em KVSTC}, +by storing the first row or column number of each block row or column +respectively. In most applications, the block row and column partitionings +will be conformal, and the same array may be used in the programs. +Finally, integer pointers to the beginning of each block in $A$ are stored +in the array $KA$. + +$IA$ contains pointers to the beginning of each block row in $JA$ and $KA$. +Thus $IA$ has length equal to the number of block rows (plus one to mark +the end of the matrix), and $JA$ has length equal to the number of nonzero +blocks. $KA$ has the same length as $JA$ plus one to mark the end of +the matrix. {\em KVSTR} and {\em KVSTC} have length equal to the number +of block rows and columns respectively, and $A$ has length equal to the +number of nonzeros in the matrix. The following +figure shows the VBR format applied to a small matrix. + +This version of Sparskit has a number of routines to support the variable +block matrix format. CSRVBR and VBRCSR convert between the VBR and CSR +formats; VBRINFO prints some elementary information about the block +structure of a matrix in VBR format; AMUXV performs a matrix-vector product +with a matrix in VBR format; CSRKVSTR and CSRKVSTC are used +to determine row and column block partitionings of a matrix in CSR format, +and KVSTMERGE is used to combine row and column partitionings to achieve +a conformal partitioning. + +\begin{figure}[htb] +%\vspace{4.8in} +%\centerline{\psfig{figure=vbrpic.eps,width=6.2in}} +\includegraphics[width=6.2in]{vbrpic} +%\special{psfile=vbrpic.eps vscale = 100 hscale = 100} +%\special{psfile=vbrpic.eps vscale = 100 hscale = 100 voffset= -420} +\caption {A $6 \times 8$ sparse matrix and its storage vectors.} +\end{figure} + +\subsection{The FORMATS conversion module} +It is important to note that there is no need to have a subroutine for +each pair of data structures, since all we need is to be able to +convert any format to the standard row-compressed format and then back +to any other format. There are currently 32 different conversion +routines in this module all of which are devoted to converting from +one data structure into another. + +The naming mechanism adopted is to use a 6-character name for each of +the subroutines, the first 3 for the input format and the last 3 for +the output format. Thus COOCSR performs the conversion from the +coordinate format to the Compressed Sparse Row format. However it was +necessary to break the naming rule in one exception. We needed a +version of COOCSR that is in-place, i.e., which can take the input +matrix, and convert it directly into a CSR format by using very little +additional work space. This routine is called COICSR. Each of +the formats has a routine to translate it to the CSR format and a routine +to convert back to it from the CSR format. The only exception is that +a CSCCSR routine is not necessary since +the conversion from Column Sparse format to Sparse Row format can be +performed with the same routine CSRCSC. This is essentially a transposition +operation. + +Considerable effort has been put at attempting to make the conversion +routines in-place, i.e., in allowing some or all of +the output arrays to be the same as the input arrays. +The purpose is to save storage whenever possible without +sacrificing performance. The added flexibility can be +very convenient in some situations. +When the additional coding complexity to permit +the routine to be in-place was not too high this was always done. +If the subroutine is in-place this is clearly indicated in the +documentation. As mentioned above, we found it necessary in one instance +to provide both the in-place version as well as the regular version: + COICSR is an in-place version of the COOCSR routine. +We would also like to add that other routines that avoid the +CSR format for some of the more important data structures may +eventually be included. For now, there is only one such routine +\footnote{Contributed by E. Rothman from Cornell University.} +namely, COOELL. + +\subsection{Internal format used in SPARSKIT} +Most of the routines in SPARSKIT use internally the Compressed +Sparse Row format. The selection of +the CSR mode has been motivated by several factors. Simplicity, +generality, and widespread use are certainly the most +important ones. However, it has often been argued +that the column scheme may +have been a better choice. One argument in this favor is that +vector machines usually give a better performance for such +operations as matrix vector by multiplications for matrices +stored in CSC format. In fact for parallel machines which +have a low overhead in loop synchronization (e.g., the Alliants), +the situation is reversed, see \cite{Saad-Boeing} for details. +For almost any argument in favor of one scheme there seems +to be an argument in favor of the other. Fortunately, +the difference provided in functionality is rather minor. +For example the subroutine APLB to add two matrices in CSR format, +described in Section 5.1, can actually be also used to add +two matrices in CSC format, since the data structures +are identical. Several such subroutines can be used for both +schemes, by pretending that the input matrices +are stored in CSR mode whereas in fact they are +stored in CSC mode. + +\section{Manipulation routines} The module UNARY +of SPARSKIT consists of a number of utilities to manipulate and perform +basic operations with sparse matrices. The following sections +give an overview of this part of the package. + +\subsection{Miscellaneous operations with sparse matrices} +There are a large number of non-algebraic operations that +are commonly used when working with sparse matrices. +A typical example is to transform $A$ into $B = P A Q $ +where $P$ and $Q$ are two permutation matrices. +Another example is to extract the lower triangular +part of $A$ or a given diagonal from $A$. Several other +such `extraction' operations are supplied in SPARSKIT. +Also provided is the transposition function. This may seem +as an unnecessary addition since the routine +CSRCSC already does perform this function economically. However, +the new transposition provided is in-place, in that it may +transpose the matrix and overwrite the result on the original matrix, +thus saving memory usage. Since many of these manipulation routines +involve one matrix (as opposed to two in the basic linear algebra routines) +we created a module called UNARY to include these subroutines. + +Another set of subroutines that are sometimes useful +are those involving a `mask'. A mask +defines a given nonzero pattern and for all practical +purposes a mask matrix is a sparse matrix whose nonzero +entries are all ones (therefore there is no need to store +its real values). Sometimes it is useful +to extract from a given matrix $A$ the `masked' matrix according +to a mask $M$, i.e., to compute the matrix +$A \odot M$ , where $\odot $ denotes the element-wise matrix +product, and $M$ is some mask matrix. + +\subsection{The module UNARY} +This module of SPARSKIT consists of a number of routines +to perform some basic non-algebraic operations on a matrix. +The following is a list of the routines currently supported with +a brief explanation. +%%There are many other routines which are not +%% listed their inclusion still being debated. + +\vskip .5in + +\marg{SUBMAT}\disp{Extracts a square or +rectangular submatrix from a sparse matrix. Both the +input and output matrices are in CSR format. +The routine is in-place.} + +\marg{FILTER}\disp{Filters out elements from a + matrix according to their magnitude. Both the input and +the output matrices are in CSR format. +The output matrix, is obtained from the +input matrix by removing all the elements that are smaller than +a certain threshold. The threshold is computed for each row +according to one of three provided options. +The algorithm is in-place.} + +\marg{FILTERM}\disp{Same as above, but for the MSR format.} + +\marg{CSORT}\disp{Sorts the elements of a matrix stored in +CSR format in increasing order of the column numbers. } + +\marg{ TRANSP }\disp{ This is an in-place transposition routine, +i.e., it can be viewed as an in-place version of the CSRCSC +routine in FORMATS. +One notable disadvantage of TRANSP is that unlike CSRCSC it +does not sort the +nonzero elements in increasing number of the column positions.} + +\marg{ COPMAT }\disp{Copy of a matrix into another +matrix (both stored CSR).} + +\marg{MSRCOP}\disp{Copies a matrix in MSR format into a matrix in MSR format.} +\marg{ GETELM }\disp{Function returning +the value of $a_{ij}$ for any pair $(i,j)$. Also returns address +of the element in arrays $A, JA$. } + +\marg{ GETDIA }\disp{ Extracts a specified diagonal from a matrix. +An option is provided to transform the input matrix so that the +extracted diagonal is zeroed out in input matrix. Otherwise the diagonal +is extracted and the input matrix remains untouched.} + +\marg{ GETL }\disp{This subroutine extracts the +lower triangular part of a matrix, including the main diagonal. +The algorithm is in-place.} + +\marg{ GETU }\disp{Extracts the upper triangular part of +a matrix. Similar to GETL.} + +\marg{ LEVELS }\disp{ +Computes the level scheduling data structure for lower +triangular matrices, see \cite{Anderson-Saad}.} + +\marg{ AMASK }\disp{ Extracts $ C = A \odot M $, +i.e., performs the mask operation. +This routine computes a sparse matrix from an input matrix $A$ by +extracting only the elements in $A$, where the corresponding +elements of $M$ are nonzero. The mask matrix $M$, is a +sparse matrix in CSR format without the real values, i.e., +only the integer arrays of the CSR format are passed. } + +\marg{ CPERM }\disp{ Permutes the columns of a matrix, i.e., +computes the matrix $B = A Q$ where $Q$ is a permutation matrix. } + +\marg{RPERM}\disp{ Permutes the rows of a matrix, i.e., +computes the matrix $B = P A$ where $P$ is a permutation matrix. } + +\marg{DPERM}\disp{Permutes the rows and columns of +a matrix, i.e., computes $B = P A Q$ +given two permutation matrices $ P$ and $ Q$. This routine gives a +special treatment to the common case where $Q=P^T$.} + +\marg{DPERM2}\disp{General submatrix permutation/extraction routine.} + +\marg{DMPERM}\disp{Symmetric permutation of row and column (B=PAP') in MSR format} + +\marg{DVPERM}\disp{ Performs an in-place permutation of a real vector, i.e., +performs $x := P x $, where $P$ is a permutation matrix. } + +\marg{IVPERM}\disp{ Performs an in-place permutation of an +integer vector.} + +\marg{RETMX}\disp{ Returns the maximum absolute value in each row +of an input matrix. } + +\marg{DIAPOS}\disp{ Returns the positions in the arrays $A$ and +$ JA$ of the diagonal elements, for a matrix stored in CSR format. } + +\marg{ EXTBDG }\disp{ Extracts the main diagonal blocks of a matrix. +The output is a rectangular matrix of dimension $N \times NBLK$, +containing the $N/NBLK$ blocks, +in which $NBLK$ is the block-size (input).} + +\marg{ GETBWD }\disp{ Returns bandwidth information on a matrix. This +subroutine returns the bandwidth of the lower part and the upper part +of a given matrix. May be used to determine these two parameters +for converting a matrix into the BND format.} + +\marg{ BLKFND }\disp{ Attempts to find the block-size of a matrix +stored in CSR format. One restriction is that the zero elements in +each block if there are any are assumed to be represented as nonzero +elements in the data structure for the $A$ matrix, with zero values. } + +\marg{ BLKCHK }\disp{ Checks whether a given integer is the block +size of A. This routine is called by BLKFND. Same restriction as +above.} + +\marg{ INFDIA }\disp{ Computes the number of nonzero elements +of each of the $2n-1$ diagonals of a matrix. Note that the first diagonal +is the diagonal with offset $-n$ which consists of the entry +$a_{n,1}$ and the last one is the diagonal with offset $n$ which consists +of the element $a_{1,n}$.} + +\marg{ AMUBDG }\disp{ Computes the number of nonzero elements +in each row of the product of two sparse matrices $A$ and $B$. +Also returns the total number of nonzero elements.} + +\marg{ APLBDG }\disp{ Computes the number of nonzero elements +in each row of the sum of two sparse matrices $A$ and $B$. +Also returns the total number of nonzero elements.} + +\marg{ RNRMS }\disp{ Computes the norms of the rows of a matrix. +The usual three norms $\|.\|_1, \|.\|_2, $ and $\|.\|_{\infty} $ +are supported. } + +\marg{ CNRMS }\disp{ Computes the norms of the columns of a matrix. +Similar to RNRMS. } + +\marg{ ROSCAL }\disp{ Scales the rows of a matrix by their norms. +The same three norms as in RNRMS are available. } + +\marg{ COSCAL }\disp{ Scales the columns of a matrix by their norms. +The same three norms as in RNRMS are available. } + +\marg{ADDBLK}\disp{Adds a matrix B into a block of A. } + +\marg{GET1UP}\disp{Collects the first elements of each row of the upper +triangular portion of the matrix. } + +\marg{XTROWS}\disp{Extracts given rows from a matrix in CSR format.} + +\marg{CSRKVSTR}\disp{Finds block partitioning of matrix in CSR format.} + +\marg{CSRKVSTC}\disp{Finds block column partitioning of matrix in CSR format.} + +\marg{KVSTMERGE}\disp{Merges block partitionings for conformal row/column pattern.} + + +\section{Input/Output routines} +The INOUT module of SPARSKIT comprises a few routines for reading, +writing, and for plotting and visualizing the structure +of sparse matrices. Many of these routines are essentially geared towards +the utilization of the Harwell/Boeing collection of matrices. +There are currently eleven subroutines in this module. + +\vskip .5in + +\marg{ READMT}\disp{ Reads a matrix in the Harwell/Boeing format.} + +\marg{ PRTMT}\disp{ Creates a Harwell Boeing file from an arbitrary + matrix in CSR or CSC format.} + +\marg{ DUMP }\disp{DUMP prints the rows of a + matrix in a file, in a nice readable format. +The best format is internally calculated depending on the number of +nonzero elements. This is a simple routine which might be +helpful for debugging purposes.} + +\marg{ PSPLTM }\disp{Generates a post-script plot of the non-zero +pattern of A.} + +\marg{ PLTMT }\disp{Creates a pic file for plotting the pattern of a +matrix.} + +\marg{ SMMS }\disp{Write the matrx in a format used in SMMS package.} + +\marg{ READSM }\disp{Reads matrices in coordinate format (as in SMMS +package).} + +\marg{ READSK }\disp{Reads matrices in CSR format (simplified H/B format).} + +\marg{ SKIT }\disp{Writes matrices to a file, format same as above.} + +\marg{ PRTUNF }\disp{Writes matrices (in CSR format) in unformatted files.} + +\marg{ READUNF }\disp{Reads unformatted file containing matrices in CSR format.} + + +\vskip 0.3in + +The routines readmt and prtmt allow to read and create files +containing matrices stored in the H/B format. +For details concerning this format the reader is referred to +\cite{Duff-HB} or the summary given in the documentation of +the subroutine READMT. While the purpose of +readmt is clear, it is not obvious that one single +subroutine can write a matrix in H/B format and still satisfy +the needs of all users. For example for some matrices all nonzero +entries are actually integers and a format using say a 10 digit +mantissa may entail an enormous waste of storage if the matrix +is large. The solution provided is to compute internally the best +formats for the integer arrays IA and JA. A little help is +required from the user for the real values in the arrays A and +RHS. Specifically, the desired format is obtained from +a parameter of the subroutine by using a simple notation, +which is explained in detail in the documentation of the routine. + +Besides the pair of routines that can read/write matrices in H/B +format, there are three other pairs which can be used to input and +output matrices in different formats. The SMMS and READSM pair write +and read matrices in the format used in the package SMMS. +Specifically, READSM reads a matrix in SMMS format from a file and outputs +it in CSR format. SMMS accepts a matrix in CSR format and +writes it to a file in SMMS format. The SMMS format is +essentially a COO format. +The size of the matrix appears in the first line of the file. Each other +line of the file +contains triplets in the form of ($i$, $j$, $a_{ij}$) which +denote the non-zero elements of the matrix. +Similarly, READSK and SKIT read and write matrices in CSR format. +This pair is very similar to READMT and PRTMT, only that the +files read/written by READSK and SKIT do not have headers. The pair +READUNF and PRTUNF reads and writes the matrices (stored as $ia$, $ja$ +and $a$) in binary form, +i.e.~the number in the file written by PRTUNF will be in machine +representations. The primary motivation for this is that +handling the arrays in binary form takes less space than in the +usual ASCII form, and is usually faster. +If the matrices are large and they are only used on compatible computers, +it might be desirable to use unformatted files. + +We found it extremely useful to be able to visualize a sparse matrix, +notably for debugging purposes. A simple look at the plot can +sometimes reveal whether the matrix obtained from some reordering +technique does indeed have the expected structure. For now two simple +plotting mechanisms are provided. First, a preprocessor called PLTMT +to the Unix utility `Pic' allows one to generate a pic file from a +matrix that is in the Harwell/Boeing format or any other format. For +example for a Harwell/Boeing matrix file, the command is of the form +%%\[hb2pic.ex \; < \; HBfilename \] +\begin{center} +{\tt hb2pic.ex < HB\_file.} +\end{center} +The output file is then printed by the usual troff or TeX commands. A +translation of this routine into one that generates a post-script file +is also available (called PSPLTM). We should point out that the +plotting routines are very simple in nature and should not be used to +plot large matrices. For example the pltmt routine outputs one pic +command line for every nonzero element. This constitutes a convenient +tool for document preparation for example. Matrices of size just up +to a few thousands can be printed this way. Several options +concerning the size of the plot and caption generation are available. + +There is also a simple utility program called ``hb2ps'' which takes a +matrix file with HB format and translates it into a post-script file. +The usage of this program is as follows: +\begin{center} +{\tt hb2ps.ex < HB\_file > Postscript\_file.} +\end{center} +%%\[ hb2ps.ex < HB\_file > Postscript\_file. \] +The file can be previewed with ghostscript. +The following graph shows a pattern of an unsymmetric matrix. + +\begin{figure}[htb] +%\centerline{\psfig{figure=jpwh.ps,width=5in}} +\includegraphics[width=5in]{jpwh} +%\vskip 5.5in +%\special{psfile=jpwh.ps vscale = 100 hscale = 100 hoffset = -85 voffset= -450} +%\special{psfile=jpwh.ps hoffset = -85} +\end{figure} + +\section{Basic algebraic operations} +The usual algebraic operations involving two matrices, +such as $C= A+ B$, $C= A+\beta B$, $C= A B $, etc.., +are fairly common in sparse matrix computations. +These basic matrix operations +are included in the module called BLASSM. In addition there is a +large number of basic operations, involving a sparse matrix +and a vector, such as matrix-vector products and +triangular system solutions that are very commonly used. Some of +these are included in the module MATVEC. +Sometimes it is desirable to compute the +patterns of the matrices $A+B$ and $AB$, or in fact of any result +of the basic algebraic operations. This can be implemented by +way of job options which will determine whether to fill-in the real +values or not during the computation. +We now briefly describe the contents of each of the +two modules BLASSM and MATVEC. + +\subsection{The BLASSM module} +Currently, the module BLASSM (Basic Linear Algebra Subroutines for +Sparse Matrices) contains the following nine subroutines: + +\vskip 0.3in + +\marg{ AMUB }\disp{ Performs the product of two matrices, i.e., +computes $C = A B $, where $A$ and $B$ are both in CSR format.} + +\marg{ APLB }\disp{ Performs the addition of two matrices, i.e., +computes $C = A + B $, where $A$ and $B$ are both in CSR format.} + +\marg{ APLSB }\disp{ Performs the operation $ C=A + \sigma B $, +where $\sigma$ is a scalar, and $A, B$ are two matrices in +CSR format. } + +\marg{ APMBT }\disp{ Performs either the addition $C = A + B^T$ or the +subtraction $C=A-B^T$. } + +\marg{ APLSBT }\disp{ Performs the operation $C = A + s B^T$. } + +\marg{ DIAMUA }\disp{ Computes the product of diagonal +matrix (from the left) by a sparse matrix, i.e., +computes $C = D A$, where $D$ is a diagonal matrix and $A$ +is a general sparse matrix stored in CSR format. } + +\marg{ AMUDIA }\disp{ Computes the product of a sparse +matrix by a diagonal matrix from the right, i.e., +computes $C = A D $, where $D$ is a diagonal matrix and $A$ +is a general sparse matrix stored in CSR format. } + +\marg{ APLDIA }\disp{ Computes the sum of a sparse matrix and a +diagonal matrix, $ C = A + D $. } + +\marg{ APLSCA }\disp{Performs an in-place +addition of a scalar to the diagonal entries of +a sparse matrix, i.e., performs the operation + $A := A + \sigma I$.} + +\vskip 0.3in + +Missing from this list are the routines {\bf AMUBT} which multiplies $A$ by +the transpose of $B$, $C= AB^T$, and {\bf ATMUB } which multiplies the +transpose of $A$ by $B$, $C= A^T B $. + +\vskip 0.3in + +These are very difficult to implement and we found it better to +perform it with two passes. +Operations of the form $ t A + s B $ have been +avoided as their occurrence does not warrant additional subroutines. +Several other operations similar to those defined for +vectors have not been included. For example the scaling +of a matrix in sparse format is simply a scaling of its +real array $A$, which can be done with the usual BLAS1 +scaling routine, on the array $A$. + + +\subsection{The MATVEC module} +In its current status, this module contains matrix +by vector products and various sparse triangular +solution methods. The contents are as follows. + +\vskip 0.3in + +\marg{ AMUX }\disp{ Performs the product of a matrix by a vector. + Matrix stored in Compressed Sparse Row (CSR) format.} + +\marg{ ATMUX }\disp{ Performs the product of the transpose of +a matrix by a vector. Matrix $A$ stored in Compressed +Sparse Row format. Can also be +viewed as the product of a matrix in the Compressed Sparse Column +format by a vector.} + +\marg{ AMUXE }\disp{ Performs the product of a matrix by a vector. +Matrix stored in Ellpack/Itpack (ELL) format.} + +\marg{ AMUXD }\disp{ Performs the product of a matrix by a vector. +Matrix stored in Diagonal (DIA) format.} + +\marg{ AMUXJ }\disp{ Performs the product of a matrix by a vector. +Matrix stored in Jagged Diagonal (JAD) format.} + +\marg{ VBRMV }\disp{ Sparse matrix - full vector product in VBR format.} + +\marg{ LSOL } +\disp{ Unit lower triangular system solution. Matrix stored in +Compressed Sparse Row (CSR) format. } + +\marg{ LDSOL }\disp{Lower triangular system solution. Matrix stored in +Modified Sparse Row (MSR) format. Diagonal elements inverted. } + +\marg{ LSOLC }\disp{ +Unit lower triangular system solution. Matrix stored in + Compressed Sparse Column (CSC) format. } + +\marg{ LDSOLC }\disp{ +Lower triangular system solution. Matrix stored in +Modified Sparse Column (MSC) format with diagonal elements inverted. } + +\marg{ LDSOLL }\disp{ +Unit lower triangular system solution with the level scheduling +approach. Matrix +stored in Modified Sparse Row format, with diagonal elements inverted.} + +\marg{ USOL }\disp{ Unit upper triangular system solution. +Matrix stored in Compressed Sparse Row (CSR) format. } + +\marg{ UDSOL }\disp{ Upper triangular system solution. +Matrix stored in Modified Sparse Row (MSR) format. Diagonal +elements inverted. } + +\marg{ USOLC }\disp{ +Unit upper triangular system solution. Matrix stored in +Compressed Sparse Column (CSC) format. } + +\marg{ UDSOLC }\disp{ +Upper triangular system solution. Matrix stored in +Modified Sparse Column (MSC) format with diagonal elements inverted. } + +\vskip 0.3in +Most of the above routines are short and rather straightforward. +A long test program is provided to run all of the subroutines +on a large number of matrices that are dynamically generated +using the MATGEN module. + +\section{The basic statistics and information routines} +It is sometimes very informative when analyzing +solution methods, to be able in a short amount of time to +obtain some statistical information about a sparse matrix. +The purpose of the subroutine info1, is to print out such +information. The first question we had to address +was to determine the type of information that +is inexpensive to obtain and yet practical and useful. +The simplest and most common statistics +are: total number of nonzero elements, average number of nonzero +elements per row (with standard deviation), band size. +Our preliminary package Info1 contains the above and a +number of other features. For example it answers the following +questions: Is the matrix lower triangular, upper triangular? +does it have a symmetric structure? If not how close is it +from having this property? Is it weakly row-diagonally dominant? +What percentage of the rows are weakly diagonally dominant? +Same questions for column diagonal dominance. +A sample output from info1 is listed in +Figure\ref{Fig1}. This print-out was generated by typing +\begin{center} +{\tt info1.ex < pores\_2} +\end{center} +%\[ {\rm info1.ex} < {\rm pores\_2} \] +where {\tt pores\_2} is a file containing a matrix in H/B format. + +If the Harwell-Boeing matrix is symmetric then Info1 takes this +information into account to obtain the correct information +instead of the information on the lower triangular part only. +Moreover, in cases where only the pattern is provided (no real +values), then info1 will print a message to this effect and +will then give information related only to the structure of +the matrix. The output for an example of this type is shown in +Figure~\ref{Fig2}. We should point out that the runs for these +two tests were basically instantaneous on a Sun-4 workstation. + +Currently, this module contains the following subroutines: + +\vskip 0.3in + +\marg{ N\_IMP\_DIAG }\disp{ Computes the most important diagonals.} + +\marg{ DIAG\_DOMI }\disp{ Computes the percentage of weakly diagonally +dominant rows/columns.} + +\marg{ BANDWIDTH }\disp{ Computes the lower, upper, maximum, and +average bandwidths.} + +\marg{ NONZ }\disp{ Computes maximum numbers of nonzero elements +per column/row, min numbers of nonzero elements per column/row, +and numbers of zero columns/rows.} + +\marg{ FROBNORM }\disp{ Computes the Frobenius norm of A.} + +\marg{ ANSYM }\disp{ Computes the Frobenius norm of the symmetric and +non-symmetric parts of A, computes the number of matching elements in symmetry +and the relative symmetry match. +The routine ANSYM provides some information on the degree of symmetry of A.} + +\marg{ DISTAIJ }\disp{ Computes the average distance of a(i,j) from diag and +standard deviation for this average.} + +\marg{ SKYLINE }\disp{ Computes the number of nonzeros in the skyline storage.} + +\marg{ DISTDIAG }\disp{ Computes the numbers of elements in each diagonal.} + +\marg{ BANDPART }\disp{ Computes the bandwidth of the banded matrix, +which contains 'nper' percent of the original matrix.} + + +\marg{ NONZ\_LUD }\disp{ Computes the number of nonzero elements in strict +lower part, strict upper part, and main diagonal.} + +\marg{ AVNZ\_COL }\disp{ Computes average number of nonzero elements/column +and standard deviation for the average.} + +\marg{ VBRINFO }\disp{ Prints information about matrices in variable block row +format.} + +% This has been updated to match the new code. -- June 3, 1994. +%* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +%* unsymmetric matrix from pores * +%* Key = pores_2 , Type = rua * +%* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +% * Dimension N = 1224 * +% * Number of nonzero elements = 9613 * +% * Average number of nonzero elements/Column = 7.8538 * +% * Standard deviation for above average = 5.4337 * +% * Nonzero elements in strict upper part = 4384 * +% * Nonzero elements in strict lower part = 4005 * +% * Nonzero elements in main diagonal = 1224 * +% * Weight of longest column = 30 * +% * Weight of shortest column = 2 * +% * Weight of longest row = 30 * +% * Weight of shortest row = 2 * +% * Matching elements in symmetry = 6358 * +% * Relative Symmetry Match (symmetry=1) = 0.6614 * +% * Average distance of a(i,j) from diag. = 0.615E+02 * +% * Standard deviation for above average = 0.103E+03 * +% *-----------------------------------------------------------------* +% * Frobenius norm of A = 0.150E+09 * +% * Frobenius norm of symmetric part = 0.100E+09 * +% * Frobenius norm of nonsymmetric part = 0.951E+08 * +% * Maximum element in A = 0.378E+08 * +% * Percentage of weakly diagonally dominant rows = 0.481E+00 * +% * Percentage of weakly diagonally dominant columns = 0.490E-02 * +% *-----------------------------------------------------------------* +% * Lower bandwidth (max: i-j, a(i,j) .ne. 0) = 470 * +% * Upper bandwidth (max: j-i, a(i,j) .ne. 0) = 471 * +% * Maximum Bandwidth = 736 * +% * Average Bandwidth = 0.190E+03 * +% * Number of nonzeros in skyline storage = 340385 * +% * 90% of matrix is in the band of width = 527 * +% * 80% of matrix is in the band of width = 145 * +% * The total number of nonvoid diagonals is = 367 * +% * The 10 most important diagonals are (offsets) : * +% * 0 1 -1 -2 2 -3 -32 -264 264 32 * +% * The accumulated percentages they represent are : * +% * 12.7 24.6 31.7 37.9 43.6 49.0 52.4 55.7 58.6 61.4 * +% *-----------------------------------------------------------------* +% * The matrix does not have a block structure * +% *-----------------------------------------------------------------* +\begin{figure} +\begin{verbatim} +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* UNSYMMETRIC MATRIX FROM PORES * +* Key = PORES 2 , Type = RUA * +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Dimension N = 1224 * + * Number of nonzero elements = 9613 * + * Average number of nonzero elements/Column = 7.8538 * + * Standard deviation for above average = 5.4337 * + * Nonzero elements in strict lower part = 4384 * + * Nonzero elements in strict upper part = 4005 * + * Nonzero elements in main diagonal = 1224 * + * Weight of longest column = 30 * + * Weight of shortest column = 2 * + * Weight of longest row = 16 * + * Weight of shortest row = 5 * + * Matching elements in symmetry = 6358 * + * Relative Symmetry Match (symmetry=1) = 0.6614 * + * Average distance of a(i,j) from diag. = 0.615E+02 * + * Standard deviation for above average = 0.103E+03 * + *-----------------------------------------------------------------* + * Frobenius norm of A = 0.150E+09 * + * Frobenius norm of symmetric part = 0.103E+09 * + * Frobenius norm of nonsymmetric part = 0.980E+08 * + * Maximum element in A = 0.378E+08 * + * Percentage of weakly diagonally dominant rows = 0.490E-02 * + * Percentage of weakly diagonally dominant columns = 0.481E+00 * + *-----------------------------------------------------------------* + * Lower bandwidth (max: i-j, a(i,j) .ne. 0) = 470 * + * Upper bandwidth (max: j-i, a(i,j) .ne. 0) = 471 * + * Maximum Bandwidth = 736 * + * Average Bandwidth = 0.190E+03 * + * Number of nonzeros in skyline storage = 342833 * + * 90% of matrix is in the band of width = 527 * + * 80% of matrix is in the band of width = 145 * + * The total number of nonvoid diagonals is = 367 * + * The 10 most important diagonals are (offsets) : * + * 0 -1 1 2 -2 3 32 264 -264 -32 * + * The accumulated percentages they represent are : * + * 12.7 24.6 31.7 37.9 43.6 49.0 52.4 55.7 58.6 61.4 * + *-----------------------------------------------------------------* + * The matrix does not have a block structure * + *-----------------------------------------------------------------* +\end{verbatim} +\caption{Sample output from Info1.ex \label{Fig1} } +\end{figure} + + +%* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +%* SYMMETRIC PATTERN FROM CANNES,LUCIEN MARRO,JUNE 1981. * +%* Key = CAN 1072 , Type = PSA * +%* No values provided - Information on pattern only * +%* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +% * Dimension N = 1072 * +% * Number of nonzero elements = 6758 * +% * Average number of nonzero elements/Column = 11.6082 * +% * Standard deviation for above average = 5.6474 * +% * Nonzero elements in strict upper part = 5686 * +% * Nonzero elements in strict lower part = 5686 * +% * Nonzero elements in main diagonal = 1072 * +% * Weight of longest column = 35 * +% * Weight of shortest column = 6 * +% * Matching elements in symmetry = 6758 * +% * Relative Symmetry Match (symmetry=1) = 1.0000 * +% * Average distance of a(i,j) from diag. = 0.110E+03 * +% * Standard deviation for above average = 0.174E+03 * +% *-----------------------------------------------------------------* +% * Lower bandwidth (max: i-j, a(i,j) .ne. 0) = 1048 * +% * Upper bandwidth (max: j-i, a(i,j) .ne. 0) = 1048 * +% * Maximum Bandwidth = 1055 * +% * Average Bandwidth = 0.376E+03 * +% * Number of nonzeros in skyline storage = 277248 * +% * 90% of matrix is in the band of width = 639 * +% * 80% of matrix is in the band of width = 343 * +% * The total number of nonvoid diagonals is = 627 * +% * The 5 most important diagonals are (offsets) : * +% * 0 -1 -2 -3 -4 * +% * The accumulated percentages they represent are : * +% * 15.9 24.7 29.7 33.9 36.3 * +% *-----------------------------------------------------------------* +% * The matrix does not have a block structure * +% *-----------------------------------------------------------------* +\begin{figure} +\begin{verbatim} +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* SYMMETRIC PATTERN FROM CANNES,LUCIEN MARRO,JUNE 1981. * +* Key = CAN 1072 , Type = PSA * +* No values provided - Information on pattern only * +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Dimension N = 1072 * + * Number of nonzero elements = 6758 * + * Average number of nonzero elements/Column = 6.3041 * + * Standard deviation for above average = 6.2777 * + * Nonzero elements in strict lower part = 5686 * + * Nonzero elements in strict upper part = 5686 * + * Nonzero elements in main diagonal = 1072 * + * Weight of longest column = 39 * + * Weight of shortest column = 4 * + * Matching elements in symmetry = 6758 * + * Relative Symmetry Match (symmetry=1) = 1.0000 * + * Average distance of a(i,j) from diag. = 0.110E+03 * + * Standard deviation for above average = 0.174E+03 * + *-----------------------------------------------------------------* + * Lower bandwidth (max: i-j, a(i,j) .ne. 0) = 0 * + * Upper bandwidth (max: j-i, a(i,j) .ne. 0) = 1048 * + * Maximum Bandwidth = 1049 * + * Average Bandwidth = 0.117E+03 * + * Number of nonzeros in skyline storage = 278320 * + * 90% of matrix is in the band of width = 639 * + * 80% of matrix is in the band of width = 343 * + * The total number of nonvoid diagonals is = 627 * + * The 5 most important diagonals are (offsets) : * + * 0 1 2 3 4 * + * The accumulated percentages they represent are : * + * 15.9 24.7 29.7 33.9 36.3 * + *-----------------------------------------------------------------* + * The matrix does not have a block structure * + *-----------------------------------------------------------------* +\end{verbatim} +\caption{Sample output from Info1.ex for matrix with pattern only \label{Fig2}} +\end{figure} + +%% \vfill + +\section{Matrix generation routines} +One of the difficulties encountered when testing and comparing +numerical methods, is that it is sometimes difficult to +guarantee that the matrices compared are indeed identical. +Even though a paper may give full details on the test +problems considered, programming errors or differences in coding +may lead to the incorrect matrices and the incorrect conclusions. +This has often happened in the past and is likely to be avoided if +the matrices were generated with exactly the same code. +The module MATGEN of +SPARSKIT includes several matrix generation routines. + +\subsection{Finite Difference Matrices} + +\begin{enumerate} +\item Scalar 5-point and 7-point matrices arising +from discretization of the elliptic type equation: +\begin{equation} +L u = {\del \over \del x} ( a {\del \over \del x } u ) ++ {\del \over \del y } ( b {\del \over \del y } u) ++ {\del \over \del z } ( c {\del \over \del z } u ) ++ {\del \over \del x } ( d u ) + {\del \over \del y } (e u) ++ {\del \over \del z } ( f u ) + g u = h u +\label{5-7pt} +\end{equation} +on rectangular regions with general mixed type boundary conditions of +the following form +\[ \alpha {\del u \over \del n} + \beta u = \gamma \] +The user provides the functions $a, b, c, ...,h$, $\beta, \gamma$ and +$\alpha$ is a constant on each boundary surface. The resulting +matrix is in general sparse format, possibly printed in a file +in the H/B format. + +There is a switch in the subroutine which makes it possible to choose +between a strict centered difference type of discretization, or an +upwind scheme for the first order derivatives. + +\item +Block 5-point and 7-point matrices arising +from discretization of the elliptic type equation \nref{5-7pt} +in which $u$ is now a vector of $nfree$ components, and +$a,b,c, ..., g$ are $nfree \times nfree $ matrices provided by the +user. + +\end{enumerate} + +\subsection{Finite Element Matrices} + +Finite element matrices created from the convection-diffusion type problem +\begin{equation} - \nabla . ({ K \nabla u }) + {C \nabla u} = f \label{kikuchi} +\end{equation} +on a domain $D$ with Dirichlet boundary conditions. A coarse initial domain +is described by the user and the code does an arbitrary user-specified number +of refinements of the grid and assembles the matrix, in CSR format. +Linear triangular elements are used. If only the matrix is desired the heat +source $f$ can be zero. Arbitrary grids can be input, but the user may +also take advantage of nine initial grids +supplied by the package for simple test problems. + +Two examples of meshes and the corresponding assemble matrices are shown +in the following two pairs of figures: the first pair of figures are the mesh +and assembled matrix with mesh number 8 and refinement 1; the second pair of +figures are the mesh and assembled matrix with mesh number 9 and refinement 1. + +\begin{figure}[b] +\begin{minipage}[h]{6.5cm} +\includegraphics[height=5cm]{msh8} +\end{minipage} +\hfill +\begin{minipage}[h]{6.5cm} +\includegraphics[height=5cm]{mat8} +\end{minipage} +\hfill +\end{figure} + +\newpage + +\begin{figure} +\begin{minipage}[h]{6.5cm} +\includegraphics[width=8cm]{msh9} +\end{minipage} +\hfill +\begin{minipage}[h]{6.5cm} +\includegraphics[height=7cm]{mat9} +\end{minipage} +\hfill +\end{figure} + +\vskip 2.5in +\subsection{Markov Chains} + +Markov chain matrices arising from a random walk on a +triangular grid. This is mainly useful for testing nonsymmetric +eigenvalue codes. It has been suggested by G.W. Stewart in one of his +papers \cite{Stewart-SRRIT} and was used by Y. Saad in a few +subsequent papers as a test problem for nonsymmetric eigenvalue methods, +see, e.g., \cite{Saad-cheb}. + +\subsection{Other Matrices} + +Currently we have only one additional set of matrices. These are +the test matrices +\footnote{These subroutines have been contributed +to the author by E. Rothman from Cornell University.} from +Zlatev et. al. \cite{Zlatev-tests} and Osterby and Zlatev +\cite{OsterbyZlatev-book}. The first two matrix generators +described in the above references +are referred to as $D(n,c) $ and $E(n,c)$ respectively. +A more elaborate class where more than two parameters can be varied, +is referred to as the class $F(m,n,c,r,\alpha) $ in +\cite{OsterbyZlatev-book,Zlatev-tests}. The three subroutines to generate +these matrices are called MATRF2 (for the class $F(m,n,c,r,\alpha)$ ), +DCN (for the class $D(c,n)$) and ECN (for the class $E(c,n) $). +These codes can generate rectangular as well as square +matrices and allow a good flexibility in making the matrices +more or less dense and more or less well conditioned. + +\section{The ORDERING Routines} +The following subroutines are available in the directory ORDERINGS. + +\vskip 0.3in + +\marg{ levset.f }\disp{Reordering based on level sets, including +Cuthill-McKee implemented with breadth first search.} + +\marg{ color.f }\disp{Reordering based on coloring, including a greedy +algorithm for multicolor ordering.} + +\marg{ ccn.f }\disp{Reordering routines based on strongly connected +components. Contributed by Laura C. Dutto (CERCA and Concordia +University.} + + +\section{The ITSOL routines} + +\marg{ILUT}\disp{This file contains a preconditioned GMRES algorithm + with four preconditioners:} +\marg{pgmres}\disp{Preconditioned GMRES solver. This solver may be used + with all four of the precondioners below. Supports right preconditioning + only.} +\marg{ilut}\disp{ A robust preconditioner called ILUT + which uses a dual thresholding strategy for dropping elements. + Arbitrary accuracy is allowed in ILUT.} +\marg{ilutp}\disp{ ILUT with partial pivoting} +\marg{ilu0}\disp{ simple ILU(0) preconditioner} +\marg{milu0}\disp{ MILU(0) preconditioner} + +\marg{ITERS}\disp{This file currently has several basic iterative linear + system solvers which use reverse communication. They are:} +\marg{cg}\disp{Conjugate Gradient Method} +\marg{cgnr}\disp{Conjugate Gradient Method\-- for Normal Residual equation} +\marg{bcg}\disp{Bi\-Conjugate Gradient Method} +\marg{bcgstab}\disp{BCG stablized} +\marg{tfqmr}\disp{Transpose\-Free Quasi\-Minimum Residual method} +\marg{gmres}\disp{Generalized Minimum Residual method} +\marg{fgmres}\disp{Flexible version of Generalized Minimum Residual method} +\marg{dqgmres}\disp{Direct versions of Quasi Generalized Minimum Residual + method} +\marg{dbcg}\disp{BCG with partial pivoting} + + +\section{The UNSUPP directory} +In addition to the basic tools described in the previous +sections, SPARSKIT includes a directory +called UNSUPP includes software that is not necessarily +portable or that does not fit in all previous modules. +For example software for viewing matrix patterns on +some particular workstation +may be found here. Another example is +routines related to matrix exponentials. +%all the different +%reordering schemes, such as minimum degree ordering, or +%nested dissection etc.. +Many of these are available from +NETLIB but others may be contributed by researchers for +comparison purposes. + +%The two basic programs for viewing matrix patterns on +%a sun screen will eventually be replaced by +%programs for the X-windows environment which is fast becoming +%a standard. + +%There are three subdirecitories in this directory. +%\subsection{Blas1} +%The following items are available in Blas1. +% +%\vskip 0.3in +% +%\marg{dcopy} \disp{copies a vector, x, to a vector, y.} +%\marg{ddot} \disp{dot product of two vectors.} +%\marg{csscal}\disp{scales a complex vector by a real constant.} +%\marg{cswap} \disp{interchanges two vectors.} +%\marg{csrot} \disp{applies a plane rotation.} +%\marg{cscal} \disp{scales a vector by a constant.} +%\marg{ccopy} \disp{copies a vector, x, to a vector, y.} +%\marg{drotg} \disp{construct givens plane rotation.} +%\marg{drot} \disp{applies a plane rotation.} +%\marg{dswap} \disp{interchanges two vectors.} +%\marg{dscal} \disp{scales a vector by a constant.} +%\marg{daxpy} \disp{constant times a vector plus a vector.} + + +\subsection{Plots} +The following items are available in PLOTS. + +\vskip 0.3in + +%\marg{ PLTMTPS}\disp{ a translation of the pltmt subroutine +% in INOUT/inout.f +% to produce a post-script file rather than a pic file. +% Does not yet offer the same functionality as pltmt. } +% +%\marg{ HB2PIC}\disp{ reads a Harwell-Boeing +% matrix and creates a picture file for pattern.} +% +%\marg{ HB2PS}\disp{translates a Harwell-Boeing file into a +%Post-Script file.} + +\marg{ PSGRD}\disp{ contains subroutine "psgrid" which plots + a symmetric graph.} + +%\marg{ RUNPS}\disp{ contains subroutine "rpltps" which reads +% a Harwell-Boeing file from standard input and creates a +% Post-Script file for it} + +\marg{ TEXPLT1}\disp{ contains subroutine "texplt" allows + several matrices in the same picture by calling texplt several + times and exploiting job and different shifts.} + +\marg{ TEXGRID1}\disp{ contains subroutine "texgrd" which + generates tex commands for plotting a symmetric graph associated + with a mesh. Allows several grids in the same picture by + calling texgrd several times and exploiting job and different + shifts.} + + +\subsection{Matrix Exponentials} +Two subroutines are available in this directory. +\vskip 0.3in +\marg{ EXPPRO}\disp{ A subroutine for computing the product of a matrix + exponential times a vector, i.e. $w = exp(t\ A)\ v$.} +\marg{ PHIPRO}\disp{ computes $w = \phi(A\ t)\ v$, + where $\phi(x) = (1-exp(x))/x$; Also can solve the + system of ODE's $ y'= A y + b$.} + +\section{Distribution} +The SPARSKIT package +follows the Linpack-Eispack approach in that it aims at providing +efficient and well tested subroutines written in portable FORTRAN. +Similarly to the Linpack and Eispack packages, the goal is to +make available a common base of useful codes for a specific +area of computation, in this case sparse linear algebra. +The package is in the public domain and will be made +accessible through the internet. + +See Figure \ref{organization} for an illustration of the organization +of SPARSKIT. Read the README file in the main directory for more +information. + +%Currently, the package is organized in six distinct subdirectories, +%each containing one or more modules. The six directories +%and the modules they contain are the following: +%INOUT (inout.f), FORMATS (formats.f, unary.f), BLASSM (blassm.f, +%matvec.f), MATGEN (genmat.f, zlatev.f), INFO (dinfo1.f), +%UNSUPP (various routines). Test programs with unix makefiles +%are provided in each +%subdirectory to test a large number of the subroutines. +%Each directory contains a README file listing contents, +%and giving additional information. + +For information concerning distribution contact the author at +%%saad@riacs.edu. +saad@cs.umn.edu. + +\section{Conclusion and Future Plans} +It is hoped that SPARSKIT will be useful in many +ways to researchers in different areas of scientific computing. +In this version of SPARSKIT, there are few sparse +problem solvers, such as direct solution methods, or +eigenvalue solvers. Some of these are available from different +sources and we felt that it was not appropriate to provide +additional ones. The original +motivation for SPARSKIT is that there is +a gap to fill in the manipulation and basic computations +with sparse matrices. Once this gap is filled with some +satisfaction, then additional functionality may be added. + +We briefly mentioned in the introduction the possibility of using +SPARSKIT to develop an interactive package. +Large matrices of dimension tens of of thousands can +easily be manipulated with the current supercomputers, +in real time. One of the difficulties +with such an interactive package is that we do not yet +have reliable routines for computing eigenvalues/eigenvectors of +large sparse matrices. The state of the art in solving linear +systems is in a much better situation. However, one must not +contemplate performing the same type of computations as with +small dense matrices. As an example, +getting all the eigenvalues of a sparse matrix is not likely +to be too useful when the matrix is very large. + +Beyond interactive software for sparse linear algebra, one can +envision the integration of SPARSKIT in a larger package +devoted to solving certain types of Partial Differential Equations, +possibly interactively. + +\vskip 1.3in +\noindent +{\bf Acknowledgements.} The idea of creating a tool package for +sparse matrices germinated while the author was at the Center for +Supercomputing Research and Development of the University of Illinois +(1986-1987) and part of this work was performed there. +Initially the author has benefited from helpful comments from Iain Duff +(then visiting CSRD) and a number of colleagues at CSRD. +Billy Stewart and his students at NCSU used a preliminary version of +SPARSKIT in a class project and made some +valuable comments. Ernie Rothman (Cornell) and +Laura Dutto (Montreal) contributed some software. +The author has also benefited from helpful discussions +from a number of other colleagues, including +Mike Heroux, Giuseppe Radicatti, Ahmed Sameh, Horst Simon, +Phuong Vu, and Harry Wijshoff. Students who contributed to +version 2 of SPARSKIT include Kesheng Wu, Edmond Chow, and Dongli Su. + +\newpage +\begin{thebibliography}{10} + +\bibitem{Anderson-Saad} +E.~C. Anderson and Y.~Saad. +\newblock Solving sparse triangular systems on parallel computers. +\newblock Technical Report 794, University of Illinois, CSRD, Urbana, IL, 1988. + +\bibitem{Duff-survey} +I.~S. Duff. +\newblock A survey of sparse matrix research. +\newblock In {\em Proceedings of the IEEE, 65}, pages 500--535, New York, 1977. + Prentice Hall. + +\bibitem{Duff-book} +I.~S. Duff, {A. M. Erisman}, and {J. K. Reid}. +\newblock {\em Direct Methods for Sparse Matrices}. +\newblock Clarendon Press, Oxford, 1986. + +\bibitem{Duff-HB} +I.~S. Duff, R.~G. Grimes, and J.~G. Lewis. +\newblock Sparse matrix test problems. +\newblock {\em ACM trans. Math. Soft.}, 15:1--14, 1989. + +\bibitem{Oppe-NSPCG} +T.~C. Oppe~Wayne Joubert and D.~R. Kincaid. +\newblock Nspcg user's guide. a package for solving large linear systems by + various iterative methods. +\newblock Technical report, The University of Texas at Austin, 1988. + +\bibitem{Oppe-Kincaid} +T.~C. Oppe and D.~R. Kincaid. +\newblock The performance of {ITPACK} on vector computers for solving large + sparse linear systems arising in sample oil reservoir simulation problems. +\newblock {\em Communications in applied numerical methods}, 2:1--7, 1986. + +\bibitem{OsterbyZlatev-book} +O.~Osterby and Z.~Zlatev. +\newblock {\em Direct methods for sparse matrices}. +\newblock Springer Verlag, New York, 1983. + +\bibitem{Saad-cheb} +Y.~Saad. +\newblock {Chebyshev} acceleration techniques for solving nonsymmetric + eigenvalue problems. +\newblock {\em Mathematics of Computation}, 42:567--588, 1984. + +\bibitem{Saad-Boeing} +Y.~Saad. +\newblock {Krylov} subspace methods on supercomputers. +\newblock {\em SIAM J. Scient. Stat. Comput.}, 10:1200--1232, 1989. + +\bibitem{Stewart-SRRIT} +G.W. Stewart. +\newblock {SRRIT} - a FORTRAN subroutine to calculate the dominant invariant + subspaces of a real matrix. +\newblock Technical Report TR-514, University of Maryland, College Park, MD, + 1978. + +\bibitem{Young-Oppe-al} +D.~M. Young, T.C. Oppe, D.~R. Kincaid, and L.~J. Hayes. +\newblock On the use of vector computers for solving large sparse linear + systems. +\newblock Technical Report CNA-199, Center for Numerical Analysis, University + of Texas at Austin, Austin, Texas, 1985. + +\bibitem{Zlatev-tests} +Z.~Zlatev, K.~Schaumburg, and J.~Wasniewski. +\newblock A testing scheme for subroutines solving large linear problems. +\newblock {\em Computers and Chemistry}, 5:91--100, 1981. + +\end{thebibliography} +%% + +\newpage + +\appendix +\centerline{\bf APPENDIX: QUICK REFERENCE} +\vskip 0.3in + +For convenience we list in this +appendix the most important subroutines in the various +modules of SPARSKIT. More detailed information can be found either +in the body of the paper or in the documentation of the package. + +\vskip 0.3in +\centerline{\bf FORMATS Module} + +\begin{itemize} + +\item CSRDNS : converts a row-stored sparse matrix into the dense format. +\item DNSCSR : converts a dense matrix to a sparse storage format. +\item COOCSR : converts coordinate to to csr format +\item COICSR : in-place conversion of coordinate to csr format +\item CSRCOO : converts compressed sparse row to coordinate format. +\item CSRSSR : converts compressed sparse row to symmetric sparse row format. +\item SSRCSR : converts symmetric sparse row to compressed sparse row format. +\item CSRELL : converts compressed sparse row to Ellpack format +\item ELLCSR : converts Ellpack format to compressed sparse row format. +\item CSRMSR : converts compressed sparse row format to modified sparse + row format. +\item MSRCSR : converts modified sparse row format to compressed sparse + row format. +\item CSRCSC : converts compressed sparse row format to compressed sparse + column format (transposition). +\item CSRLNK : converts compressed sparse row to linked list format. +\item LNKCSR : converts linked list format to compressed sparse row fmt. +\item CSRDIA : converts the compressed sparse row format into the diagonal + format. +\item DIACSR : converts the diagonal format into the compressed sparse row + format. +\item BSRCSR : converts the block-row sparse format into the compressed + sparse row format. +\item CSRBSR : converts the compressed sparse row format into the block-row + sparse format. +\item CSRBND : converts the compressed sparse row format into the banded + format (Linpack style). +\item BNDCSR : converts the banded format (Linpack style) into the compressed + sparse row storage. +\item CSRSSK : converts the compressed sparse row format to the symmetric + skyline format +\item SSKSSR : converts symmetric skyline format to symmetric +sparse row format. +\item CSRJAD : converts the csr format into the jagged diagonal format. +\item JADCSR : converts the jagged-diagonal format into the csr format. +\item CSRUSS : converts the csr format to unsymmetric sparse skyline format. +\item USSCSR : converts unsymmetric sparse skyline format to the csr format. +\item CSRSSS : converts the csr format to symmetric sparse skyline format. +\item SSSCSR : converts symmetric sparse skyline format to the csr format. +\item CSRVBR : converts compressed sparse row into variable block row format. +\item VBRCSR : converts the variable block row format into the +\item COOELL : converts the coordinate format into the Ellpack/Itpack format. +compressed sparse row format. +\end{itemize} + +\vskip 0.3in +\centerline{\bf UNARY Module} + +\begin{itemize} + +\item SUBMAT : extracts a submatrix from a sparse matrix. +\item FILTER : filters elements from a matrix according to their magnitude. +\item FILTERM: Same as above, but for the MSR format. +\item TRANSP : in-place transposition routine (see also CSRCSC in formats) +\item GETELM : returns $a(i,j)$ for any $(i,j)$ from a CSR-stored matrix. +\item COPMAT : copies a matrix into another matrix (both stored csr). +\item MSRCOP : copies a matrix in MSR format into a matrix in MSR format. +\item GETELM : returns a(i,j) for any (i,j) from a CSR-stored matrix. +\item GETDIA : extracts a specified diagonal from a matrix. +\item GETL : extracts lower triangular part. +\item GETU : extracts upper triangular part. +\item LEVELS : gets the level scheduling structure for lower triangular + matrices. +\item AMASK : extracts $C = A \odot M $ +\item RPERM : permutes the rows of a matrix ($B = P A$) +\item CPERM : permutes the columns of a matrix ($B = A Q$) +\item DPERM : permutes a matrix ($B = P A Q$) given two permutations P, Q +\item DPERM2 : general submatrix permutation/extraction routine. +\item DMPERM : symmetric permutation of row and column (B=PAP') in MSR fmt. +\item DVPERM : permutes a vector (in-place). +\item IVPERM : permutes an integer vector (in-place). +\item RETMX : returns the max absolute value in each row of the matrix. +\item DIAPOS : returns the positions of the diagonal elements in A. +\item EXTBDG : extracts the main diagonal blocks of a matrix. +\item GETBWD : returns the bandwidth information on a matrix. +\item BLKFND : finds the block-size of a matrix. +\item BLKCHK : checks whether a given integer is the block size of $A$. +\item INFDIA : obtains information on the diagonals of $A$. +\item AMUBDG : computes the number of nonzero elements in each + row of $A*B$. +\item APLBDG : computes the number of nonzero elements in each + row of $ A+B$. +\item RNRMS : computes the norms of the rows of $A$. +\item CNRMS : computes the norms of the columns of $A$. +\item ROSCAL : scales the rows of a matrix by their norms. +\item COSCAL : scales the columns of a matrix by their norms. +\item ADDBLK : adds a matrix B into a block of A. +\item GET1UP : collects the first elements of each row of the upper + triangular portion of the matrix. +\item XTROWS : extracts given rows from a matrix in CSR format. + +\end{itemize} + +\vskip 0.3in +\centerline{\bf INOUT Module} + +\begin{itemize} + +\item READMT : reads matrices in the boeing/Harwell format. +\item PRTMT : prints matrices in the boeing/Harwell format. +\item DUMP : prints rows of a matrix, in a readable format. +\item PLTMT : produces a 'pic' file for plotting a sparse matrix. +\item PSPLTM : Generates a post-script plot of the non-zero +pattern of A. +\item SMMS : Write the matrix in a format used in SMMS package. +\item READSM : Reads matrices in coordinate format (as in SMMS +package). +\item READSK : Reads matrices in CSR format (simplified H/B formate). +\item SKIT : Writes matrices to a file, format same as above. +\item PRTUNF : Writes matrices (in CSR format) unformatted. +\item READUNF : Reads unformatted data of matrices (in CSR format). +\end{itemize} + +\vskip 0.3in +\centerline{\bf INFO Module} + +\begin{itemize} +\item INFOFUN : routines for statistics on a sparse matrix. +\end{itemize} + +\vskip 0.3in +\centerline{\bf MATGEN Module} + +\begin{itemize} + +\item GEN57PT : generates 5-point and 7-point matrices. +\item GEN57BL : generates block 5-point and 7-point matrices. +\item GENFEA : generates finite element matrices in assembled form. +\item GENFEU : generates finite element matrices in unassembled form. +\item ASSMB1 : assembles an unassembled matrix (as produced by genfeu). +\item MATRF2 : Routines for generating sparse matrices by Zlatev et al. +\item DCN: Routines for generating sparse matrices by Zlatev et al. +\item ECN: Routines for generating sparse matrices by Zlatev et al. +\item MARKGEN: subroutine to produce a Markov chain matrix for + a random walk. +\end{itemize} + +\vskip 0.3in +\centerline{\bf BLASSM Module} +\begin{itemize} +\item AMUB : computes $ C = A*B $ . +\item APLB : computes $ C = A+B $ . +\item APLSB : computes $ C = A + s B $. +\item APMBT : Computes $ C = A \pm B^T $. +\item APLSBT : Computes $ C = A + s * B^T $ . +\item DIAMUA : Computes $ C = Diag * A $ . +\item AMUDIA : Computes $ C = A* Diag $ . +\item APLDIA : Computes $ C = A + Diag $ . +\item APLSCA : Computes $ A:= A + s I $ ($s$ = scalar). +\end{itemize} + +\vskip 0.3in +\centerline{\bf MATVEC Module} + +\begin{itemize} + +\item AMUX : $A$ times a vector. Compressed Sparse Row (CSR) format. +\item ATMUX : $A^T $ times a vector. CSR format. +\item AMUXE : $A$ times a vector. Ellpack/Itpack (ELL) format. +\item AMUXD : $A$ times a vector. Diagonal (DIA) format. +\item AMUXJ : $A$ times a vector. Jagged Diagonal (JAD) format. +\item VBRMV : $A$ times a vector. Variable Block Row (VBR) format. +\item LSOL : Unit lower triangular system solution. +Compressed Sparse Row (CSR) format. +\item LDSOL : Lower triangular system solution. + Modified Sparse Row (MSR) format. +\item LSOL : Unit lower triangular system solution. + Compressed Sparse Column (CSC) format. +\item LDSOLC: Lower triangular system solution. + Modified Sparse Column (MSC) format. +\item LDSOLL: Lower triangular system solution +with level scheduling. MSR format. +\item USOL : Unit upper triangular system solution. + Compressed Sparse Row (CSR) format. +\item UDSOL : Upper triangular system solution. + Modified Sparse Row (MSR) format. +\item USOLC : Unit upper triangular system solution. + Compressed Sparse Column (CSC) format. +\item UDSOLC: Upper triangular system solution. + Modified Sparse Column (MSC) format. + +\end{itemize} + +\vskip 0.3in +\vbox{ +\centerline{\bf ORDERINGS Module} +\begin{itemize} +\item levset.f : level set based reordering, including RCM +\item color.f : coloring based reordering +\item ccn.f : reordering based on strongly connected components +\end{itemize} +} + +\vskip 0.3in +\vbox{ +\centerline{\bf ITSOL Module} +\begin{itemize} +\item ILUT: ILUT(k) preconditioned GMRES mini package. +\item ITERS: nine basic iterative linear system solvers. +\end{itemize} +} + +\vskip 0.3in +\vbox{ +\centerline{\bf PLOTS Module} +\begin{itemize} +%\item PLTMTPS : creates a Post Script file to plot a sparse matrix. +%\item HB2PIC: reads a Harwell-Boeing matrix and creates a pic file +% for pattern. +%\item HB2PS: translates a Harwell - Boeing file into a Post-Script file. +\item PSGRD: plots a symmetric graph. +%\item RUNPS: reads a Harwell - Boeing file from standard input and +% creates a Post-Script file for it. +\item TEXPLT1: allows several matrices in the same picture. +\item TEXGRID1: allows several grids in the same picture. +\end{itemize} + } + +\vskip 0.3in +\vbox{ +\centerline{\bf MATEXP Module} +\begin{itemize} +\item EXPPRO: computes $w = exp(t\ A)\ v$. +\item PHIPRO: computes $w = \phi(A\ t)\ v$, + where $ \phi(x) = (1-exp(x))/x$. + Also solves the P.D.E. system $y' = Ay+b$. +\end{itemize} + } + +\end{document} + +\begin{thebibliography}{1} + diff --git a/DOC/vbrpic.eps b/DOC/vbrpic.eps new file mode 100644 index 0000000..152369a --- /dev/null +++ b/DOC/vbrpic.eps @@ -0,0 +1,307 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /tmp/xfig-fig009549 +%%Creator: fig2dev +%%CreationDate: Sun May 1 19:21:40 1994 +%%For: chow@mega (Edmond Chow,EE/CS 6-210,626-0071,625-3031) +%%BoundingBox: 0 0 403 355 +%%Pages: 0 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/l {lineto} bind def +/m {moveto} bind def +/s {stroke} bind def +/n {newpath} bind def +/gs {gsave} bind def +/gr {grestore} bind def +/clp {closepath} bind def +/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul +4 -2 roll mul setrgbcolor} bind def +/col-1 {} def +/col0 {0 0 0 setrgbcolor} bind def +/col1 {0 0 1 setrgbcolor} bind def +/col2 {0 1 0 setrgbcolor} bind def +/col3 {0 1 1 setrgbcolor} bind def +/col4 {1 0 0 setrgbcolor} bind def +/col5 {1 0 1 setrgbcolor} bind def +/col6 {1 1 0 setrgbcolor} bind def +/col7 {1 1 1 setrgbcolor} bind def + end +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +0 setlinecap 0 setlinejoin +-58.0 414.0 translate 0.900 -0.900 scale +0.500 setlinewidth +% Polyline +n 99 439 m 479 439 l 479 459 l 99 459 l 99 439 l clp gs col-1 s gr +% Polyline +n 119 439 m 119 459 l gs col-1 s gr +% Polyline +n 139 439 m 139 459 l gs col-1 s gr +% Polyline +n 159 439 m 159 459 l gs col-1 s gr +% Polyline +n 179 439 m 179 459 l gs col-1 s gr +% Polyline +n 199 439 m 199 459 l gs col-1 s gr +% Polyline +n 219 439 m 219 459 l gs col-1 s gr +% Polyline +n 239 439 m 239 459 l gs col-1 s gr +% Polyline +n 259 439 m 259 459 l gs col-1 s gr +n 279 439 m 279 439 l gs col-1 s gr +% Polyline +n 279 439 m 279 459 l gs col-1 s gr +% Polyline +n 299 439 m 299 459 l gs col-1 s gr +% Polyline +n 319 439 m 319 459 l gs col-1 s gr +% Polyline +n 339 439 m 339 459 l gs col-1 s gr +% Polyline +n 359 439 m 359 459 l gs col-1 s gr +% Polyline +n 379 439 m 379 459 l gs col-1 s gr +% Polyline +n 399 439 m 399 459 l gs col-1 s gr +% Polyline +n 419 439 m 419 459 l gs col-1 s gr +% Polyline +n 459 439 m 459 459 l gs col-1 s gr +/Times-Roman findfont 12.00 scalefont setfont +104 434 m +gs 1 -1 scale ( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +69 454 m +gs 1 -1 scale (A) col-1 show gr +% Polyline +n 399 79 m 499 79 l 499 99 l 399 99 l 399 79 l clp gs col-1 s gr +% Polyline +n 419 79 m 419 99 l gs col-1 s gr +% Polyline +n 439 79 m 439 99 l gs col-1 s gr +% Polyline +n 459 79 m 459 99 l gs col-1 s gr +% Polyline +n 479 79 m 479 99 l gs col-1 s gr +/Times-Roman findfont 12.00 scalefont setfont +404 74 m +gs 1 -1 scale ( 1 2 3 4 5) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +339 94 m +gs 1 -1 scale (KVSTC) col-1 show gr +% Polyline +n 199 79 m 279 79 l 279 99 l 199 99 l 199 79 l clp gs col-1 s gr +% Polyline +n 219 79 m 219 99 l gs col-1 s gr +% Polyline +n 239 79 m 239 99 l gs col-1 s gr +% Polyline +n 259 79 m 259 99 l gs col-1 s gr +/Times-Roman findfont 12.00 scalefont setfont +209 94 m +gs 1 -1 scale (1 3 4 7) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +204 74 m +gs 1 -1 scale ( 1 2 3 4) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +139 94 m +gs 1 -1 scale (KVSTR) col-1 show gr +% Polyline +n 99 219 m 179 219 l 179 239 l 99 239 l 99 219 l clp gs col-1 s gr +% Polyline +n 99 279 m 219 279 l 219 299 l 99 299 l 99 279 l clp gs col-1 s gr +% Polyline +n 99 339 m 239 339 l 239 359 l 99 359 l 99 339 l clp gs col-1 s gr +% Polyline +n 119 219 m 119 239 l gs col-1 s gr +% Polyline +n 139 219 m 139 239 l gs col-1 s gr +% Polyline +n 159 219 m 159 239 l gs col-1 s gr +% Polyline +n 119 279 m 119 299 l gs col-1 s gr +% Polyline +n 139 279 m 139 299 l gs col-1 s gr +% Polyline +n 159 279 m 159 299 l gs col-1 s gr +% Polyline +n 179 279 m 179 299 l gs col-1 s gr +% Polyline +n 199 279 m 199 299 l gs col-1 s gr +% Polyline +n 119 339 m 119 359 l gs col-1 s gr +% Polyline +n 139 339 m 139 359 l gs col-1 s gr +% Polyline +n 159 339 m 159 359 l gs col-1 s gr +% Polyline +n 179 339 m 179 359 l gs col-1 s gr +% Polyline +n 199 339 m 199 359 l gs col-1 s gr +% Polyline +n 219 339 m 219 359 l gs col-1 s gr +% Polyline +n 109 239 m 109 259 l gs col-1 s gr +n 111.000 251.000 m 109.000 259.000 l 107.000 251.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 124 239 m 144 259 l gs col-1 s gr +n 139.757 251.929 m 144.000 259.000 l 136.929 254.757 l gs 2 setlinejoin col-1 s gr +% Polyline +n 149 239 m 184 259 l gs col-1 s gr +n 178.046 253.294 m 184.000 259.000 l 176.062 256.767 l gs 2 setlinejoin col-1 s gr +% Polyline +n 169 239 m 224 259 l gs col-1 s gr +n 217.165 254.386 m 224.000 259.000 l 215.798 258.146 l gs 2 setlinejoin col-1 s gr +% Polyline +n 439 439 m 439 459 l gs col-1 s gr +% Polyline +n 109 359 m 109 419 l gs col-1 s gr +n 111.000 411.000 m 109.000 419.000 l 107.000 411.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 129 359 m 184 419 l gs col-1 s gr +n 180.069 411.751 m 184.000 419.000 l 177.120 414.454 l gs 2 setlinejoin col-1 s gr +% Polyline +n 144 359 m 224 419 l gs col-1 s gr +n 218.800 412.600 m 224.000 419.000 l 216.400 415.800 l gs 2 setlinejoin col-1 s gr +% Polyline +n 169 359 m 279 419 l gs col-1 s gr +n 272.935 413.413 m 279.000 419.000 l 271.019 416.925 l gs 2 setlinejoin col-1 s gr +% Polyline +n 189 359 m 299 419 l gs col-1 s gr +n 292.935 413.413 m 299.000 419.000 l 291.019 416.925 l gs 2 setlinejoin col-1 s gr +% Polyline +n 209 359 m 364 419 l gs col-1 s gr +n 357.261 414.247 m 364.000 419.000 l 355.817 417.977 l gs 2 setlinejoin col-1 s gr +% Polyline +n 229 359 m 484 419 l gs col-1 s gr +n 476.671 415.221 m 484.000 419.000 l 475.755 419.115 l gs 2 setlinejoin col-1 s gr +% Polyline +n 379 159 m 379 279 l gs col-1 s gr +% Polyline +n 439 159 m 439 279 l gs col-1 s gr +% Polyline +n 499 279 m 499 159 l 339 159 l 339 279 l clp gs col-1 s gr +% Polyline +n 459 159 m 459 279 l gs col-1 s gr +% Polyline +n 339 199 m 499 199 l gs col-1 s gr +% Polyline +n 339 219 m 499 219 l gs col-1 s gr +% Polyline +n 409 99 m 354 139 l gs col-1 s gr +n 361.646 135.912 m 354.000 139.000 l 359.294 132.677 l gs 2 setlinejoin col-1 s gr +% Polyline +n 429 99 m 389 139 l gs col-1 s gr +n 396.071 134.757 m 389.000 139.000 l 393.243 131.929 l gs 2 setlinejoin col-1 s gr +% Polyline +n 449 99 m 449 139 l gs col-1 s gr +n 451.000 131.000 m 449.000 139.000 l 447.000 131.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 469 99 m 469 139 l gs col-1 s gr +n 471.000 131.000 m 469.000 139.000 l 467.000 131.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 489 99 m 504 139 l gs col-1 s gr +n 503.064 130.807 m 504.000 139.000 l 499.318 132.212 l gs 2 setlinejoin col-1 s gr +% Polyline +n 269 99 m 319 284 l gs col-1 s gr +n 318.843 275.755 m 319.000 284.000 l 314.982 276.799 l gs 2 setlinejoin col-1 s gr +% Polyline +n 249 99 m 319 224 l gs col-1 s gr +n 316.836 216.043 m 319.000 224.000 l 313.346 217.997 l gs 2 setlinejoin col-1 s gr +% Polyline +n 224 99 m 319 204 l gs col-1 s gr +n 315.116 196.726 m 319.000 204.000 l 312.150 199.410 l gs 2 setlinejoin col-1 s gr +% Polyline +n 209 99 m 319 169 l gs col-1 s gr +n 313.324 163.018 m 319.000 169.000 l 311.177 166.392 l gs 2 setlinejoin col-1 s gr +/Times-Roman findfont 12.00 scalefont setfont +104 294 m +gs 1 -1 scale ( 1 3 2 3 3 4) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 354 m +gs 1 -1 scale ( 1 5 7 10 11 14 20) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 334 m +gs 1 -1 scale ( 1 2 3 4 5 6 7) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +69 234 m +gs 1 -1 scale (IA) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +69 294 m +gs 1 -1 scale (JA) col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +64 354 m +gs 1 -1 scale (KA) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 234 m +gs 1 -1 scale ( 1 3 5 7) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 214 m +gs 1 -1 scale ( 1 2 3 4) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 274 m +gs 1 -1 scale ( 1 2 3 4 5 6) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +224 274 m +gs 1 -1 scale ( 7) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +104 454 m +gs 1 -1 scale ( 1 4 2 5 3 6 7 8 9 10 11 14 17 12 15 18 13 16 19) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +404 94 m +gs 1 -1 scale ( 1 3 6 7 9 ) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +344 174 m +gs 1 -1 scale ( 1 2 3) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +344 194 m +gs 1 -1 scale ( 4 5 6) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +384 214 m +gs 1 -1 scale ( 7 8 9 10) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +444 234 m +gs 1 -1 scale (11 12 13) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +444 254 m +gs 1 -1 scale (14 15 16) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +444 274 m +gs 1 -1 scale (17 18 19) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 174 m +gs 1 -1 scale (1) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 194 m +gs 1 -1 scale (2) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 214 m +gs 1 -1 scale (3) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 234 m +gs 1 -1 scale (4) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 254 m +gs 1 -1 scale (5) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 274 m +gs 1 -1 scale (6) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +344 154 m +gs 1 -1 scale ( 1 2 3 4 5 6 7 8) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +324 294 m +gs 1 -1 scale (7) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +494 154 m +gs 1 -1 scale ( 9) col-1 show gr +/Times-Roman findfont 12.00 scalefont setfont +259 344 m +gs 1 -1 scale (IA also indexes into KA) col-1 show gr +$F2psEnd diff --git a/DOC/vbrpic.fig b/DOC/vbrpic.fig new file mode 100644 index 0000000..95b49d3 --- /dev/null +++ b/DOC/vbrpic.fig @@ -0,0 +1,207 @@ +#FIG 2.1 +80 2 +6 69 424 499 459 +2 3 0 1 -1 0 0 0 0.000 -1 0 0 + 99 439 479 439 479 459 99 459 99 439 99 439 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 119 439 119 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 139 439 139 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 159 439 159 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 179 439 179 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 199 439 199 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 219 439 219 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 239 439 239 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 259 439 259 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 439 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 439 279 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 299 439 299 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 319 439 319 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 339 439 339 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 359 439 359 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 379 439 379 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 399 439 399 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 419 439 419 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 459 439 459 459 9999 9999 +4 0 0 12 0 -1 0 0.00000 4 9 393 104 434 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +4 0 0 14 0 -1 0 0.00000 4 10 11 69 454 A +-6 +6 339 64 499 99 +2 3 0 1 -1 0 0 0 0.000 -1 0 0 + 399 79 499 79 499 99 399 99 399 79 399 79 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 419 79 419 99 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 439 79 439 99 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 459 79 459 99 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 479 79 479 99 9999 9999 +4 0 0 12 0 -1 0 0.00000 4 9 90 404 74 1 2 3 4 5 +4 0 0 14 0 -1 0 0.00000 4 10 46 339 94 KVSTC +-6 +6 139 64 279 99 +2 3 0 1 -1 0 0 0 0.000 -1 0 0 + 199 79 279 79 279 99 199 99 199 79 199 79 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 219 79 219 99 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 239 79 239 99 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 259 79 259 99 9999 9999 +4 0 0 12 0 -1 0 0.00000 4 9 63 209 94 1 3 4 7 +4 0 0 12 0 -1 0 0.00000 4 9 69 204 74 1 2 3 4 +4 0 0 14 0 -1 0 0.00000 4 10 45 139 94 KVSTR +-6 +2 3 0 1 -1 0 0 0 0.000 -1 0 0 + 99 219 179 219 179 239 99 239 99 219 99 219 9999 9999 +2 3 0 1 -1 0 0 0 0.000 -1 0 0 + 99 279 219 279 219 299 99 299 99 279 99 279 9999 9999 +2 3 0 1 -1 0 0 0 0.000 -1 0 0 + 99 339 239 339 239 359 99 359 99 339 99 339 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 119 219 119 239 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 139 219 139 239 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 159 219 159 239 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 119 279 119 299 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 139 279 139 299 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 159 279 159 299 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 179 279 179 299 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 199 279 199 299 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 119 339 119 359 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 139 339 139 359 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 159 339 159 359 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 179 339 179 359 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 199 339 199 359 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 219 339 219 359 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 109 239 109 259 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 124 239 144 259 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 149 239 184 259 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 169 239 224 259 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 439 439 439 459 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 109 359 109 419 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 129 359 184 419 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 144 359 224 419 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 169 359 279 419 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 189 359 299 419 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 209 359 364 419 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 229 359 484 419 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 379 159 379 279 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 439 159 439 279 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 499 279 499 159 339 159 339 279 499 279 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 459 159 459 279 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 339 199 499 199 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 339 219 499 219 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 409 99 354 139 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 429 99 389 139 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 449 99 449 139 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 469 99 469 139 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 489 99 504 139 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 269 99 319 284 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 249 99 319 224 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 224 99 319 204 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 209 99 319 169 9999 9999 +4 0 0 12 0 -1 0 0.00000 4 9 108 104 294 1 3 2 3 3 4 +4 0 0 12 0 -1 0 0.00000 4 9 132 104 354 1 5 7 10 11 14 20 +4 0 0 12 0 -1 0 0.00000 4 9 129 104 334 1 2 3 4 5 6 7 +4 0 0 14 0 -1 0 0.00000 4 10 16 69 234 IA +4 0 0 14 0 -1 0 0.00000 4 10 17 69 294 JA +4 0 0 14 0 -1 0 0.00000 4 10 21 64 354 KA +4 0 0 12 0 -1 0 0.00000 4 9 69 104 234 1 3 5 7 +4 0 0 12 0 -1 0 0.00000 4 9 69 104 214 1 2 3 4 +4 0 0 12 0 -1 0 0.00000 4 9 108 104 274 1 2 3 4 5 6 +4 0 0 12 0 -1 0 0.00000 4 9 9 224 274 7 +4 0 0 12 0 -1 0 0.00000 4 9 372 104 454 1 4 2 5 3 6 7 8 9 10 11 14 17 12 15 18 13 16 19 +4 0 0 12 0 -1 0 0.00000 4 9 96 404 94 1 3 6 7 9  +4 0 0 12 0 -1 0 0.00000 4 9 108 344 174 1 2 3 +4 0 0 12 0 -1 0 0.00000 4 9 108 344 194 4 5 6 +4 0 0 12 0 -1 0 0.00000 4 9 72 384 214 7 8 9 10 +4 0 0 12 0 -1 0 0.00000 4 9 51 444 234 11 12 13 +4 0 0 12 0 -1 0 0.00000 4 9 51 444 254 14 15 16 +4 0 0 12 0 -1 0 0.00000 4 9 51 444 274 17 18 19 +4 0 0 12 0 -1 0 0.00000 4 9 6 324 174 1 +4 0 0 12 0 -1 0 0.00000 4 9 6 324 194 2 +4 0 0 12 0 -1 0 0.00000 4 9 6 324 214 3 +4 0 0 12 0 -1 0 0.00000 4 9 6 324 234 4 +4 0 0 12 0 -1 0 0.00000 4 9 6 324 254 5 +4 0 0 12 0 -1 0 0.00000 4 9 6 324 274 6 +4 0 0 12 0 -1 0 0.00000 4 9 147 344 154 1 2 3 4 5 6 7 8 +4 0 0 12 0 -1 0 0.00000 4 9 6 324 294 7 +4 0 0 12 0 -1 0 0.00000 4 9 18 494 154 9 +4 0 0 12 0 -1 0 0.00000 4 9 121 259 344 IA also indexes into KA diff --git a/DOC/vbrpic.pdf b/DOC/vbrpic.pdf new file mode 100644 index 0000000..02ab7ae Binary files /dev/null and b/DOC/vbrpic.pdf differ diff --git a/FORMATS/README b/FORMATS/README new file mode 100644 index 0000000..dbe5d9e --- /dev/null +++ b/FORMATS/README @@ -0,0 +1,143 @@ +c----------------------------------------------------------------------c +c c +c SPARSKIT Modules FORMATS and UNARY c +c c +c----------------------------------------------------------------------c +c c +c This directory contains both the module FORMATS and UNARY c +c of SPARSKIT. c +c c +c----------------------------------------------------------------------c +c CONTENTS: c +c======================================================================c +c c +c formats.f : mostly format conversion routines. c +c c +c unary.f : elementary manipulation routines. c +c c +c chkfmt1 : a long test-suite for the conversion routines. c +c c +c chkun.f : a test-suite for *some* of the routines in unary.f c +c c +c rvbr.f : Test program for Variable Block Matrix support c +c c +c c +c makefile : makefile for the sample programs chkfmt1.f, chkun.f c +c and rvbr.f produces the executables fmt.ex for format c +c (usage: make fmt.ex), un.ex for unary.f (usage: c +c make un.ex) and vbr.ex for VBR functions (usage: c +c make vbr.ex). c +c c +c----------------------------------------------------------------------c +c c +c Here are the contents of formats.f and unary.f c +c c +c----------------------------------------------------------------------c +c======================================================================c +c formats.f: c +c======================================================================c +c c +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c FORMAT CONVERSION MODULE c +c----------------------------------------------------------------------c +c contents: c +c---------- c +c csrdns : converts a row-stored sparse matrix into the dense format. c +c dnscsr : converts a dense matrix to a sparse storage format. c +c coocsr : converts coordinate to to csr format c +c coicsr : in-place conversion of coordinate to csr format c +c csrcoo : converts compressed sparse row to coordinate. c +c csrssr : converts compressed sparse row to symmetric sparse row c +c ssrcsr : converts symmetric sparse row to compressed sparse row c +c csrell : converts compressed sparse row to ellpack format c +c ellcsr : converts ellpack format to compressed sparse row format c +c csrmsr : converts compressed sparse row format to modified sparse c +c row format c +c msrcsr : converts modified sparse row format to compressed sparse c +c row format. c +c csrcsc : converts compressed sparse row format to compressed sparse c +c column format (transposition) c +c csrlnk : converts compressed sparse row to linked list format c +c lnkcsr : converts linked list format to compressed sparse row fmt c +c csrdia : converts a compressed sparse row format into a diagonal c +c format. c +c diacsr : converts a diagonal format into a compressed sparse row c +c format. c +c bsrcsr : converts a block-row sparse format into a compressed c +c sparse row format. c +c csrbsr : converts a compressed sparse row format into a block-row c +c sparse format. c +c csrbnd : converts a compressed sparse row format into a banded c +c format (linpack style). c +c bndcsr : converts a banded format (linpack style) into a compressed c +c sparse row storage. c +c csrssk : converts the compressed sparse row format to the symmetric c +c skyline format c +c sskssr : converts symmetric skyline format to symmetric sparse row c +c format. c +c csrjad : converts the csr format into the jagged diagonal format c +c jadcsr : converts the jagged-diagonal format into the csr format c +c csruss : Compressed Sparse Row to Unsymmetric Sparse Skyline format c +c usscsr : Unsymmetric Sparse Skyline format to Compressed Sparse Row c +c csrsss : Compressed Sparse Row to Symmetric Sparse Skyline format c +c ssscsr : Symmetric Sparse Skyline format to Compressed Sparse Row c +c csrvbr : Converts compressed sparse row to var block row format c +c vbrcsr : Converts var block row to compressed sparse row format c +c--------- miscalleneous additions not involving the csr format--------c +c cooell : converts coordinate to Ellpack/Itpack format c +c dcsort : sorting routine used by crsjad c +c csorted : Checks if matrix in CSR format is sorted by columns c +c----------------------------------------------------------------------c +c======================================================================c +c unary.f: c +c======================================================================c +c c +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c UNARY SUBROUTINES MODULE c +c----------------------------------------------------------------------c +c contents: c +c---------- c +c submat : extracts a submatrix from a sparse matrix. c +c filter : filters elements from a matrix according to their magnitude.c +c filterm: same as above, but for the MSR format c +c csort : sorts the elements in increasing order of columns c +c transp : in-place transposition routine (see also csrcsc in formats) c +c copmat : copy of a matrix into another matrix (both stored csr) c +c getelm : returns a(i,j) for any (i,j) from a CSR-stored matrix. c +c getdia : extracts a specified diagonal from a matrix. c +c getl : extracts lower triangular part c +c getu : extracts upper triangular part c +c levels : gets the level scheduling structure for lower triangular c +c matrices. c +c amask : extracts C = A mask M c +c rperm : permutes the rows of a matrix (B = P A) c +c cperm : permutes the columns of a matrix (B = A Q) c +c dperm : permutes both the rows and columns of a matrix (B = P A Q ) c +c dmperm : symmetric permutation of row and column (B = P A P') c +c dvperm : permutes a real vector (in-place) c +c ivperm : permutes an integer vector (in-place) c +c retmx : returns the max absolute value in each row of the matrix c +c diapos : returns the positions of the diagonal elements in A. c +c extbdg : extracts the main diagonal blocks of a matrix. c +c getbwd : returns the bandwidth information on a matrix. c +c blkfnd : finds the block-size of a matrix. c +c blkchk : checks whether a given integer is the block size of A. c +c infdia : obtains information on the diagonals of A. c +c amubdg : gets number of nonzeros in each row of A*B (as well as NNZ) c +c aplbdg : gets number of nonzeros in each row of A+B (as well as NNZ) c +c rnrms : computes the norms of the rows of A c +c cnrms : computes the norms of the columns of A c +c rscal : scales the rows of a matrix by their norms. c +c cscal : scales the columns of a matrix by their norms. c +c addblk : Adds a matrix B into a block of A. c +c get1up : Collects the first elements of each row of the upper c +c triangular portion of the matrix. c +c xtrows : extracts given rows from a matrix in CSR format. c +c csrkvstr: Finds block row partitioning of matrix in CSR format c +c csrkvstc: Finds block column partitioning of matrix in CSR format c +c kvstmerge: Merges block partitionings, for conformal row/col pattern c +c----------------------------------------------------------------------c diff --git a/FORMATS/chkfmt1.f b/FORMATS/chkfmt1.f new file mode 100644 index 0000000..846a220 --- /dev/null +++ b/FORMATS/chkfmt1.f @@ -0,0 +1,424 @@ + program chkfmt +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c test suite for the Formats routines. c +c tests all of the routines in the module formats. c +c----------------------------------------------------------------------c +c Note: the comments may not have been updated. +c +c Here is the sequence of what is done by this program. +c 1) call gen57bl togenerate a block matrix associated with a simple +c 5-point matrix on a 4 x 2 grid (2-D) with 2 degrees of freedom +c per grid point. Thus N = 16. This is produced in BSR format. +c the pattern of the reduced matrix is written in csr.mat. +c +c 2) the block format is translated into a compressed sparse row +c format by bsrcsr. The result is dumped in file csr.mat +c matrix is converted back to bsr format. block pattern shown again +c +c 3) the matrix is translated in dense format by csrdns. +c result a 16 x 16 matrix is written in unit dns.mat. +c This is a good file to look at to see what the matrix is +c and to compare results of other formats with. +c 4) the dense matrix obtained in 3) is reconverted back to +c csr format using dnscsr. Result appended to file csr.mat +c 5) The matrix obtained in 4) is converted in coordinate format +c and the resulting matrix is written in file coo.mat +c 6) the result is converted back to csr format. matrix +c appended to csr.mat. +c 7) result of 6) is converted to symmetric sparse row storage +c (ssr) and the result is appended to csr.mat +c 8) result of 7) converted back to csr format and result is +c appended to csr.mat +c 9) matrix resulting from 8) is converted to modified sparse +c row format using csrmsr and result is written in msr.mat. +c10) the resulting matrix is converted back to csrformat and +c result is appended to csr.mat +c11) result is converted to ellpack-itpack format with +c csrell and result is printed in itp.mat +c12) result is converted back to csr format and appended to csr.mat +c12) result converted to csc format (transposition) using csrcsc +c which should produce the same matrix here. result appended +c to csr.mat. A second call to csrcsc is made on resulting +c matrix. +c13) the subroutine csrdia is used to extract two diagonals +c (offsets -1 and 0) and then all the diagonals of matrix. +c results in dia.mat +c14) diacsr is then called to convert the diagonally stored matrix +c back to csr format. result appended to csr.mat +c15) result is converted to band format (bnd) by calling +c csrbnd. result dumped to bnd.mat +c16) result is converted back to csr format and appended to csr.mat +c17) result sorted by a call to csrcsc and then converted to +c block format (csrbsr) and then back to csr format again. +c result appedned to csr.mat. +c18) matrix converted to symmetric skyline format. result appended +c to file band.mat +c19) matrix converted back to csr format and result appended to +c csr.mat. +c20) result converted to jad format. result output in jad.mat +c21) result concverted back to csr fromat. appended to csr.mat +c------------------------------------------------------------------ + implicit none + integer ndns, nxmax, nmx, nnzmax + parameter (nxmax = 10, nmx = nxmax*nxmax, nnzmax=10*nmx) + integer ia(nmx+1),ja(nnzmax),ia1(nnzmax),ja1(nnzmax), + * iwk(nmx*2+1),ioff(20),iwk2(nmx+1) + real*8 stencil(7,100),a(nnzmax),a1(nnzmax),dns(20,20),wk(nmx) +c + integer k,nx,ny,nz,nfree,na,nr,n,iout,nnz,i,ierr, + * maxcol, ndiag,job,lowd,len,imod,j,kend,k1,k2, + * kstart,mu,ml,idiag,idiag0,kdiag +c----------------------------------------------------------------------- + data ndns/20/ +c----- open statements ---------------- + open (unit=7,file='csr.mat') + open (unit=8,file='dns.mat') + open (unit=9,file='coo.mat') + open (unit=10,file='msr.mat') + open (unit=11,file='itp.mat') + open (unit=12,file='dia.mat') + open (unit=13,file='bnd.mat') + open (unit=14,file='jad.mat') +c +c---- dimension of grid +c + nx = 4 + ny = 2 + nz = 1 + nfree = 2 +c +c---- generate grid problem. +c +c na = nx*ny*nz*5 + na = nfree*nfree + call gen57bl (nx,ny,nz,nfree,na,nr,a1,ja1,ia1,iwk,stencil) +c nr = n / nfree + n = nr*nfree +c +c---- dump the reduced matrix +c + iout = 7 + nnz = ia(n+1)-1 + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ Pattern of block matrix (CSR) +++ ' + write (iout,*) '-----------------------------------------' +c + call dump(1,nr,.false.,a1,ja1,ia1,7) +c +c---- convert to CSR format and dump result +c + call bsrcsr (1,nr,nfree,na,a1,ja1,ia1,a,ja,ia) + iout = 7 + nnz = ia(n+1)-1 + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ initial matrix in CSR format +++ ' + write (iout,*) '-----------------------------------------' + call dump(1,n,.true.,a,ja,ia,7) +c +c---- convert back to BSR format and dump pattern again. +c + call csrbsr (1,n,nfree,na,a,ja,ia,a1,ja1,ia1,iwk2,ierr) + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ Pattern of block matrix (CSR) +++ ' + write (iout,*) '-----------------------------------------' + call dump(1,nr,.false.,a1,ja1,ia1,7) +c +c----- convert to BSR format. +c + call bsrcsr (1,nr,nfree,na,a1,ja1,ia1,a,ja,ia) + iout = 7 + nnz = ia(n+1)-1 + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ matrix after BSRCSR conversion +++ ' + write (iout,*) '-----------------------------------------' + call dump(1,n,.true.,a,ja,ia,7) +c +c----- convert to dense format. +c + call csrdns(n,n,a,ja,ia,dns,ndns,ierr) +c + iout = iout+1 + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ initial matrix in DENSE format+++ ' + write (iout,*) '-----------------------------------------' + write (iout,'(4x,16i4)') (j,j=1,n) + write (iout,'(3x,65(1h-))') + do 3 i=1,n + write (8,102) i,(dns(i,j), j=1,n) + 102 format(1h ,i2,1h|,16f4.1) + 3 continue +c +c----- convert back to sparse format. +c + call dnscsr(n,n,nnzmax,dns,ndns,a1,ja1,ia1,ierr) + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from dnscsr +++ ' + write (7,*) '-----------------------------------------' + if (ierr .ne. 0) write (7,*) ' ***** ERROR FROM DNSCSR' + if (ierr .ne. 0) write (7,*) ' IERR = ', ierr + call dump(1,n,.true.,a1,ja1,ia1,7) +c +c convert it to coordinate format. +c + call csrcoo(n,3,nnzmax,a,ja,ia,nnz,a1,ia1,ja1,ierr) + iout = iout+ 1 + if (ierr .ne. 0) write (iout,*) ' ***** ERROR IN CSRCOO' + if (ierr .ne. 0) write (iout,*) ' IERR = ', ierr + write (iout,*) '-----------------------------------------' + write(iout,*) ' +++ Matrix in coordinate format +++ ' + write (iout,*) '-----------------------------------------' + write(iout,103) (ia1(j),ja1(j),a1(j),j=1,nnz) + 103 format (' i =', i3,' j = ',i3,' a(i,j) = ',f4.1) +c +c convert it back again to csr format +c + call coocsr(n,nnz,a1,ia1,ja1,a,ja,ia) + + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from coocsr +++ ' + write (7,*) '-----------------------------------------' + call dump(1,n,.true.,a,ja,ia,7) +c +c going to srs format +c + call csrssr(n,a,ja,ia,nnzmax,a1,ja1,ia1,ierr) + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion to ssr format +++ ' + write (7,*) ' (lower part only stored in csr format) ' + write (7,*) '-----------------------------------------' + call dump(1,n,.true.,a1,ja1,ia1,7) +c back to csr + call ssrcsr (3,1,n,a1,ja1,ia1,nnzmax,a,ja,ia,iwk,iwk2,ierr) + if (ierr .ne. 0) write(7,*) ' error in ssrcsr-IERR=',ierr + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from ssrcsr +++ ' + write (7,*) '-----------------------------------------' + call dump(1,n,.true.,a,ja,ia,7) +c---- msr format + iout = iout+1 + call csrmsr (n,a,ja,ia,a1,ja1,a1,ja1) + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ matrix in modified sparse row format +++' + write (iout,*) '-----------------------------------------' + write (iout,*) ' ** MAIN DIAGONAL ' + write (iout,'(16f4.1)') (a1(k),k=1,n) + write (iout,*) ' ** POINTERS: ' + write (iout,'(17i4)') (ja1(k),k=1,n+1) + write (iout,*) ' ** REMAINDER :' + call dump(1,n,.true.,a1,ja1,ja1,iout) +c------- + call msrcsr (n,a1,ja1,a,ja,ia,wk,iwk2) + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from msrcsr +++' + write (7,*) '-----------------------------------------' +c + call dump(1,n,.true.,a,ja,ia,7) +c + maxcol = 13 +c + call csrell (n,a,ja,ia,maxcol,a1,ja1,n,ndiag,ierr) + iout = iout+1 + if (ierr .ne. 0) write (iout,*) ' ***** ERROR IN CSRELL' + if (ierr .ne. 0) write (iout,*) ' IERR = ', ierr + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ matrix in ELLPACK-ITPACK format +++ ' + write (iout,*) '-----------------------------------------' + do 12 i=1,ndiag + write (iout,*) ' Column number: ', i + write (iout,104) (a1(n*(i-1)+k),k=1,n) + 104 format(9h COEF = ,16f4.0) + write (iout,105) (ja1(n*(i-1)+k),k=1,n) + 105 format (9h JCOEF = ,16i4) + 12 continue + call ellcsr (n,a1,ja1,n,ndiag,a,ja,ia,nnzmax,ierr) + if (ierr .ne. 0) write (7,*) ' ***** ERROR IN ELLCSR' + if (ierr .ne. 0) write (7,*) ' IERR = ', ierr + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from ellcsr +++' + write (7,*) '-----------------------------------------' + call dump(1,n,.true.,a,ja,ia,7) +c + call csrcsc(n,1,1,a,ja,ia, a1,ja1,ia1) + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from csrcsc +++ ' + write (7,*) '-----------------------------------------' + call dump(1,n,.true.,a1,ja1,ia1,7) + call csrcsc(n,1,1,a1,ja1,ia1, a,ja,ia) +c +c--------test 1 : get main diagonal and subdiagonal +c get some info on diagonals + call infdia(n,ja,ia,iwk,idiag0) + job = 0 + ioff(1) = 0 + ioff(2) = -1 + idiag = 2 + call csrdia (n,idiag,job,a,ja,ia,ndns,dns,ioff,a1,ja1,ia1,iwk) + iout = iout+1 + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ diagonal format +++ ' + write (iout,*) '-----------------------------------------' + write (iout,*) ' diagonals ioff = 0 and ioff = -1 ' + write (iout,*) ' number of diag.s returned from csrdia=',idiag + do 13 kdiag = 1, idiag + write (iout,*) ' diagonal offset = ', ioff(kdiag) + write (iout,'(16f4.1)') (dns(k,kdiag),k=1,n) + 13 continue +c reverse conversion + ndiag = ndns + idiag = idiag0 + job = 10 + call csrdia (n,idiag,job,a,ja,ia,ndns,dns,ioff,a1,ja1,ia1,iwk) + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ second test diagonal format +++ ' + write (iout,*) ' ** all diagonals of A ** ' + write (iout,*) '-----------------------------------------' + write (iout,*) ' number of diagonals on return from csrdia=', + * idiag + do 131 kdiag = 1, idiag + write (iout,*) ' diagonal offset = ', ioff(kdiag) + write (iout,'(16f4.1)') (dns(k,kdiag),k=1,n) + 131 continue +c +c reverse conversion +c + job = 0 + call diacsr (n,job,idiag,dns,ndns,ioff,a,ja,ia) +c-------- + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from diacsr +++ ' + write (7,*) '-----------------------------------------' + call dump(1,n,.true.,a,ja,ia,7) +c +c checking the banded format +c + lowd = 0 + job = 1 + call csrbnd(n,a,ja,ia,job,dns,ndns,lowd,ml,mu,ierr) + iout = iout+1 + if (ierr .ne. 0) write (iout,*) ' ***** ERROR IN CSRBND' + if (ierr .ne. 0) write (iout,*) ' IERR = ', ierr + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ banded format +++ ' + write (iout,*) ' bandwidth values found ml=',ml,' mu=',mu + write (iout,*) '-----------------------------------------' + write (iout,'(4x,16i4)') (j,j=1,n) + write (iout,'(3x,65(1h-))') + do 14 i=1, lowd + write (iout,102) i, (dns(i,j), j=1,n) + 14 continue +c +c convert back to a, ja, ia format. +c + len = nnzmax +c-------- + call bndcsr(n,dns,ndns,lowd,ml,mu,a,ja,ia,len,ierr) + write (7,*) ' IERR IN BNDCSR = ', ierr + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from bndcsr +++' + write (7,*) '-----------------------------------------' + call dump(1,n,.true.,a,ja,ia,7) +c +c make sure it is sorted +c + call csrcsc(n,1,1,a,ja,ia, a1,ja1,ia1) +c +c checking skyline format. +c + imod = 1 + call csrssk (n,imod,a1,ja1,ia1,a,ia,nnzmax,ierr) +c + if (ierr .ne. 0) write (iout,*) ' IERR = ', ierr + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ Sym. Skyline format +++ ' + write (iout,*) '-----------------------------------------' + write (iout,'(3x,65(1h-))') +c--------------------- +c create column values. +c--------------------- + do 15 i=1, n + kend = ia(i+1)-1 + kstart = ia(i) + do k=kstart,kend + ja(k) = i-(kend-k) + enddo + 15 continue +c + call dump(1,n,.true.,a,ja,ia,iout) +c +c back to ssr format.. +c + call sskssr (n,imod,a,ia,a1,ja1,ia1,nnzmax,ierr) + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from sskcsr +++' + write (7,*) '-----------------------------------------' + call dump(1,n,.true.,a1,ja1,ia1,7) +c +c checking jad format ----- +c +c first go back to the csr format ---- +c + call ssrcsr (3,1,n,a1,ja1,ia1,nnzmax,a,ja,ia,iwk,iwk2,ierr) +c + call csrjad (n, a, ja, ia, ndiag, iwk, a1, ja1, ia1) +c + iout = iout+1 + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ matrix in JAD format +++ ' + write (iout,*) '-----------------------------------------' +c +c permutation array +c + write (iout,*) ' ** PERMUTATION ARRAY ' + write (iout,'(17i4)') (iwk(k),k=1,n) +c ------ diagonals + do 16 i=1,ndiag + write (iout,*) ' J-diagonal number: ', i + k1 = ia1(i) + k2 = ia1(i+1)-1 + write (iout,104) (a1(k),k=k1,k2) + write (iout,105) (ja1(k),k=k1,k2) + 16 continue +c +c back to csr format.. +c + call jadcsr (n, ndiag, a1, ja1, ia1, iwk, a, ja, ia) +c + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from jadcsr +++' + write (7,*) '-----------------------------------------' + call dump(1,n,.true.,a,ja,ia,7) +c----------------------------------------------------------------------- +c checking the linked list format +c----------------------------------------------------------------------- +c + nnz = ia(n+1) - ia(1) + call csrlnk (n, a, ja, ia, iwk) +c +c print links in file 7 (no need for another file) +c + iout = 7 + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ matrix in LNK format +++ ' + write (iout,*) '-----------------------------------------' +c +c permutation array +c + write (iout,*) ' LINK ARRAY ' + write (iout,*) ' ---------- ' + write (iout,'(17i4)') (iwk(k),k=1,nnz) +c +c back to csr format.. +c + call lnkcsr (n, a, ja, ia, iwk, a1, ja1, ia1) +c + write (7,*) '-----------------------------------------' + write (7,*) ' +++ matrix after conversion from lnkcsr +++' + write (7,*) '-----------------------------------------' + call dump(1,n,.true.,a,ja,ia,7) +c------------------------------------------------------------ + stop +c----------------------------------------------------------------------- +c-----------end-of-chkfmt1---------------------------------------------- + end diff --git a/FORMATS/chkun.f b/FORMATS/chkun.f new file mode 100644 index 0000000..1778637 --- /dev/null +++ b/FORMATS/chkun.f @@ -0,0 +1,168 @@ + program chkfmt +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c test suite for the unary routines. c +c tests some of the routines in the module unary. Still needs to tests c +c many other routines. c +c Last update: May 2, 1994. +c----------------------------------------------------------------------c + parameter (nxmax = 10, nmx = nxmax*nxmax, nnzmax=10*nmx) + implicit real*8 (a-h,o-z) + integer ia(nmx+1),ja(nnzmax),ia1(nnzmax),ja1(nnzmax), + * iwk(nmx*2+1), perm(16), qperm(16) , + * iwork(nnzmax*2) + real*8 a(nnzmax),a1(nnzmax),dns(20,20),rhs(nnzmax),al(6) + data ndns/20/ + data qperm /1, 3, 6, 8, 9, 11, 14, 16, 2, 4, 5, 7, 10, 12, 13, 15/ +c +c define correct permutation +c + do 1 i=1, 16 + perm(qperm(i)) = i + 1 continue +c----- open statements ---------------- + open (unit=7,file='unary.mat') +c +c---- dimension of grid +c +c generate a 16 by 16 matrix (after eliminating boundary) + nx = 6 + ny = 6 + nz = 1 + al(1) = 0.D0 + al(2) = 0.D0 + al(3) = 0.D0 + al(4) = 0.D0 + al(5) = 0.D0 + al(6) = 0.D0 +c +c---- generate grid problem. +c + call gen57pt (nx,ny,nz,al,0,n,a,ja,ia,iwk,rhs) +c +c---- write out the matrix +c + iout = 7 + nnz = ia(n+1)-1 + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ initial matrix in CSR format +++ ' + write (iout,*) '-----------------------------------------' + call dump(1,n,.true.,a,ja,ia,iout) +c +c call csrdns +c + call csrdns(n,n,a,ja,ia,dns,ndns,ierr) +c +c write it out as a dense matrix. +c + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ initial matrix in DENSE format+++ ' + write (iout,*) '-----------------------------------------' + call dmpdns(n, n, ndns, dns, iout) +c +c red black ordering +c + job = 1 +c + call dperm (n,a,ja,ia,a1,ja1,ia1,perm,perm,job) +c + nnz = ia(n+1)-1 + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ red-black matrix in CSR format +++ ' + write (iout,*) '-----------------------------------------' + call dump(1,n,.true.,a1,ja1,ia1,iout) +c +c sort matrix +c + call csort (n,a1,ja1,ia1,iwork,.true.) + nnz = ia(n+1)-1 + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ matrix after sorting +++ ' + write (iout,*) '-----------------------------------------' + call dump(1,n,.true.,a1,ja1,ia1,iout) +c +c +c convert into dense format +c + call csrdns(n, n, a1,ja1,ia1,dns,ndns,ierr) + write (iout,*) '-----------------------------------------' + write (iout,*) ' +++ red-black matrix in DENSE format+++ ' + write (iout,*) '-----------------------------------------' + call dmpdns(n,n, ndns, dns, iout) + stop + end +c----------------------------------------------------------------------- + subroutine dmpdns(nrow, ncol, ndns, dns, iout) + integer nrow, ncol, ndns, iout + real*8 dns(ndns,*) +c----------------------------------------------------------------------- +c this subroutine prints out a dense matrix in a simple format. +c the zero elements of the matrix are omitted. The format for the +c nonzero elements is f4.1, i.e., very little precision is provided. +c----------------------------------------------------------------------- +c on entry +c -------- +c nrow = row dimension of matrix +c ncol = column dimension of matrix +c ndns = first dimension of array dns. +c dns = double dimensional array of size n x n containing the matrix +c iout = logical unit where to write matrix +c +c on return +c --------- +c matrix will be printed out on unit output iout. +c------------------------------------------------------------------------ +c local variables + integer j, j1, j2, last, i + character*80 fmt +c +c prints out a dense matrix -- without the zeros. +c + write (iout,'(4x,16i4)') (j,j=1,ncol) + fmt(1:5) = ' |' + j1 = 6 + do 1 j=1, ncol + j2 = j1+4 + fmt(j1:j2) = '----' + j1 = j2 + 1 continue + last = j1 + fmt(last:last) = '|' + write (iout,*) fmt +c +c undo loop 1 --- +c + j1 = 6 + do 2 j=1,ncol + j2 = j1+4 + fmt(j1:j2) = ' ' + j1 = j2 + 2 continue +c + do 4 i=1, nrow + j1 = 6 + write (fmt,101) i + 101 format(1h ,i2,2h |) + do 3 j=1, ncol + j2= j1+4 + if (dns(i,j) .ne. 0.0) then + write (fmt(j1:j2),102) dns(i,j) + 102 format(f4.1) + endif + j1 = j2 + 3 continue + fmt(last:last) = '|' + write (iout,*) fmt + 4 continue + fmt(1:5) = ' |' + j1 = 6 + do 5 j=1, ncol + j2 = j1+4 + fmt(j1:j2) = '----' + j1 = j2 + 5 continue + fmt(last:last) = '|' + write (iout,*) fmt + return + end diff --git a/FORMATS/formats.f b/FORMATS/formats.f new file mode 100644 index 0000000..fde8f92 --- /dev/null +++ b/FORMATS/formats.f @@ -0,0 +1,3716 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c FORMAT CONVERSION MODULE c +c----------------------------------------------------------------------c +c contents: c +c---------- c +c csrdns : converts a row-stored sparse matrix into the dense format. c +c dnscsr : converts a dense matrix to a sparse storage format. c +c coocsr : converts coordinate to to csr format c +c coicsr : in-place conversion of coordinate to csr format c +c csrcoo : converts compressed sparse row to coordinate. c +c csrssr : converts compressed sparse row to symmetric sparse row c +c ssrcsr : converts symmetric sparse row to compressed sparse row c +c csrell : converts compressed sparse row to ellpack format c +c ellcsr : converts ellpack format to compressed sparse row format c +c csrmsr : converts compressed sparse row format to modified sparse c +c row format c +c msrcsr : converts modified sparse row format to compressed sparse c +c row format. c +c csrcsc : converts compressed sparse row format to compressed sparse c +c column format (transposition) c +c csrcsc2 : rectangular version of csrcsc c +c csrlnk : converts compressed sparse row to linked list format c +c lnkcsr : converts linked list format to compressed sparse row fmt c +c csrdia : converts a compressed sparse row format into a diagonal c +c format. c +c diacsr : converts a diagonal format into a compressed sparse row c +c format. c +c bsrcsr : converts a block-row sparse format into a compressed c +c sparse row format. c +c csrbsr : converts a compressed sparse row format into a block-row c +c sparse format. c +c csrbnd : converts a compressed sparse row format into a banded c +c format (linpack style). c +c bndcsr : converts a banded format (linpack style) into a compressed c +c sparse row storage. c +c csrssk : converts the compressed sparse row format to the symmetric c +c skyline format c +c sskssr : converts symmetric skyline format to symmetric sparse row c +c format. c +c csrjad : converts the csr format into the jagged diagonal format c +c jadcsr : converts the jagged-diagonal format into the csr format c +c csruss : Compressed Sparse Row to Unsymmetric Sparse Skyline c +c format c +c usscsr : Unsymmetric Sparse Skyline format to Compressed Sparse Row c +c csrsss : Compressed Sparse Row to Symmetric Sparse Skyline format c +c ssscsr : Symmetric Sparse Skyline format to Compressed Sparse Row c +c csrvbr : Converts compressed sparse row to var block row format c +c vbrcsr : Converts var block row to compressed sparse row format c +c csorted : Checks if matrix in CSR format is sorted by columns c +c--------- miscalleneous additions not involving the csr format--------c +c cooell : converts coordinate to Ellpack/Itpack format c +c dcsort : sorting routine used by crsjad c +c----------------------------------------------------------------------c + subroutine csrdns(nrow,ncol,a,ja,ia,dns,ndns,ierr) + real*8 dns(ndns,*),a(*) + integer ja(*),ia(*) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Dense +c----------------------------------------------------------------------- +c +c converts a row-stored sparse matrix into a densely stored one +c +c On entry: +c---------- +c +c nrow = row-dimension of a +c ncol = column dimension of a +c a, +c ja, +c ia = input matrix in compressed sparse row format. +c (a=value array, ja=column array, ia=pointer array) +c dns = array where to store dense matrix +c ndns = first dimension of array dns +c +c on return: +c----------- +c dns = the sparse matrix a, ja, ia has been stored in dns(ndns,*) +c +c ierr = integer error indicator. +c ierr .eq. 0 means normal return +c ierr .eq. i means that the code has stopped when processing +c row number i, because it found a column number .gt. ncol. +c +c----------------------------------------------------------------------- + ierr = 0 + do 1 i=1, nrow + do 2 j=1,ncol + dns(i,j) = 0.0d0 + 2 continue + 1 continue +c + do 4 i=1,nrow + do 3 k=ia(i),ia(i+1)-1 + j = ja(k) + if (j .gt. ncol) then + ierr = i + return + endif + dns(i,j) = a(k) + 3 continue + 4 continue + return +c---- end of csrdns ---------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine dnscsr(nrow,ncol,nzmax,dns,ndns,a,ja,ia,ierr) + real*8 dns(ndns,*),a(*) + integer ia(*),ja(*) +c----------------------------------------------------------------------- +c Dense to Compressed Row Sparse +c----------------------------------------------------------------------- +c +c converts a densely stored matrix into a row orientied +c compactly sparse matrix. ( reverse of csrdns ) +c Note: this routine does not check whether an element +c is small. It considers that a(i,j) is zero if it is exactly +c equal to zero: see test below. +c----------------------------------------------------------------------- +c on entry: +c--------- +c +c nrow = row-dimension of a +c ncol = column dimension of a +c nzmax = maximum number of nonzero elements allowed. This +c should be set to be the lengths of the arrays a and ja. +c dns = input nrow x ncol (dense) matrix. +c ndns = first dimension of dns. +c +c on return: +c---------- +c +c a, ja, ia = value, column, pointer arrays for output matrix +c +c ierr = integer error indicator: +c ierr .eq. 0 means normal retur +c ierr .eq. i means that the the code stopped while +c processing row number i, because there was no space left in +c a, and ja (as defined by parameter nzmax). +c----------------------------------------------------------------------- + ierr = 0 + next = 1 + ia(1) = 1 + do 4 i=1,nrow + do 3 j=1, ncol + if (dns(i,j) .eq. 0.0d0) goto 3 + if (next .gt. nzmax) then + ierr = i + return + endif + ja(next) = j + a(next) = dns(i,j) + next = next+1 + 3 continue + ia(i+1) = next + 4 continue + return +c---- end of dnscsr ---------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine coocsr(nrow,nnz,a,ir,jc,ao,jao,iao) +c----------------------------------------------------------------------- + real*8 a(*),ao(*),x + integer ir(*),jc(*),jao(*),iao(*) +c----------------------------------------------------------------------- +c Coordinate to Compressed Sparse Row +c----------------------------------------------------------------------- +c converts a matrix that is stored in coordinate format +c a, ir, jc into a row general sparse ao, jao, iao format. +c +c on entry: +c--------- +c nrow = dimension of the matrix +c nnz = number of nonzero elements in matrix +c a, +c ir, +c jc = matrix in coordinate format. a(k), ir(k), jc(k) store the nnz +c nonzero elements of the matrix with a(k) = actual real value of +c the elements, ir(k) = its row number and jc(k) = its column +c number. The order of the elements is arbitrary. +c +c on return: +c----------- +c ir is destroyed +c +c ao, jao, iao = matrix in general sparse matrix format with ao +c continung the real values, jao containing the column indices, +c and iao being the pointer to the beginning of the row, +c in arrays ao, jao. +c +c Notes: +c------ This routine is NOT in place. See coicsr +c +c------------------------------------------------------------------------ + do 1 k=1,nrow+1 + iao(k) = 0 + 1 continue +c determine row-lengths. + do 2 k=1, nnz + iao(ir(k)) = iao(ir(k))+1 + 2 continue +c starting position of each row.. + k = 1 + do 3 j=1,nrow+1 + k0 = iao(j) + iao(j) = k + k = k+k0 + 3 continue +c go through the structure once more. Fill in output matrix. + do 4 k=1, nnz + i = ir(k) + j = jc(k) + x = a(k) + iad = iao(i) + ao(iad) = x + jao(iad) = j + iao(i) = iad+1 + 4 continue +c shift back iao + do 5 j=nrow,1,-1 + iao(j+1) = iao(j) + 5 continue + iao(1) = 1 + return +c------------- end of coocsr ------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine coicsr (n,nnz,job,a,ja,ia,iwk) + integer ia(nnz),ja(nnz),iwk(n+1) + real*8 a(*) +c------------------------------------------------------------------------ +c IN-PLACE coo-csr conversion routine. +c------------------------------------------------------------------------ +c this subroutine converts a matrix stored in coordinate format into +c the csr format. The conversion is done in place in that the arrays +c a,ja,ia of the result are overwritten onto the original arrays. +c------------------------------------------------------------------------ +c on entry: +c--------- +c n = integer. row dimension of A. +c nnz = integer. number of nonzero elements in A. +c job = integer. Job indicator. when job=1, the real values in a are +c filled. Otherwise a is not touched and the structure of the +c array only (i.e. ja, ia) is obtained. +c a = real array of size nnz (number of nonzero elements in A) +c containing the nonzero elements +c ja = integer array of length nnz containing the column positions +c of the corresponding elements in a. +c ia = integer array of length nnz containing the row positions +c of the corresponding elements in a. +c iwk = integer work array of length n+1 +c on return: +c---------- +c a +c ja +c ia = contains the compressed sparse row data structure for the +c resulting matrix. +c Note: +c------- +c the entries of the output matrix are not sorted (the column +c indices in each are not in increasing order) use coocsr +c if you want them sorted. +c----------------------------------------------------------------------c +c Coded by Y. Saad, Sep. 26 1989 c +c----------------------------------------------------------------------c + real*8 t,tnext + logical values +c----------------------------------------------------------------------- + values = (job .eq. 1) +c find pointer array for resulting matrix. + do 35 i=1,n+1 + iwk(i) = 0 + 35 continue + do 4 k=1,nnz + i = ia(k) + iwk(i+1) = iwk(i+1)+1 + 4 continue +c------------------------------------------------------------------------ + iwk(1) = 1 + do 44 i=2,n + iwk(i) = iwk(i-1) + iwk(i) + 44 continue +c +c loop for a cycle in chasing process. +c + init = 1 + k = 0 + 5 if (values) t = a(init) + i = ia(init) + j = ja(init) + ia(init) = -1 +c------------------------------------------------------------------------ + 6 k = k+1 +c current row number is i. determine where to go. + ipos = iwk(i) +c save the chased element. + if (values) tnext = a(ipos) + inext = ia(ipos) + jnext = ja(ipos) +c then occupy its location. + if (values) a(ipos) = t + ja(ipos) = j +c update pointer information for next element to come in row i. + iwk(i) = ipos+1 +c determine next element to be chased, + if (ia(ipos) .lt. 0) goto 65 + t = tnext + i = inext + j = jnext + ia(ipos) = -1 + if (k .lt. nnz) goto 6 + goto 70 + 65 init = init+1 + if (init .gt. nnz) goto 70 + if (ia(init) .lt. 0) goto 65 +c restart chasing -- + goto 5 + 70 do 80 i=1,n + ia(i+1) = iwk(i) + 80 continue + ia(1) = 1 + return +c----------------- end of coicsr ---------------------------------------- +c------------------------------------------------------------------------ + end +c----------------------------------------------------------------------- + subroutine csrcoo (nrow,job,nzmax,a,ja,ia,nnz,ao,ir,jc,ierr) +c----------------------------------------------------------------------- + real*8 a(*),ao(*) + integer ir(*),jc(*),ja(*),ia(nrow+1) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Coordinate +c----------------------------------------------------------------------- +c converts a matrix that is stored in coordinate format +c a, ir, jc into a row general sparse ao, jao, iao format. +c +c on entry: +c--------- +c nrow = dimension of the matrix. +c job = integer serving as a job indicator. +c if job = 1 fill in only the array ir, ignore jc, and ao. +c if job = 2 fill in ir, and jc but not ao +c if job = 3 fill in everything. +c The reason why these options are provided is that on return +c ao and jc are the same as a, ja. So when job = 3, a and ja are +c simply copied into ao, jc. When job=2, only jc and ir are +c returned. With job=1 only the array ir is returned. Moreover, +c the algorithm is in place: +c call csrcoo (nrow,1,nzmax,a,ja,ia,nnz,a,ia,ja,ierr) +c will write the output matrix in coordinate format on a, ja,ia. +c +c a, +c ja, +c ia = matrix in compressed sparse row format. +c nzmax = length of space available in ao, ir, jc. +c the code will stop immediatly if the number of +c nonzero elements found in input matrix exceeds nzmax. +c +c on return: +c----------- +c ao, ir, jc = matrix in coordinate format. +c +c nnz = number of nonzero elements in matrix. +c ierr = integer error indicator. +c ierr .eq. 0 means normal retur +c ierr .eq. 1 means that the the code stopped +c because there was no space in ao, ir, jc +c (according to the value of nzmax). +c +c NOTES: 1)This routine is PARTIALLY in place: csrcoo can be called with +c ao being the same array as as a, and jc the same array as ja. +c but ir CANNOT be the same as ia. +c 2) note the order in the output arrays, +c------------------------------------------------------------------------ + ierr = 0 + nnz = ia(nrow+1)-1 + if (nnz .gt. nzmax) then + ierr = 1 + return + endif +c------------------------------------------------------------------------ + goto (3,2,1) job + 1 do 10 k=1,nnz + ao(k) = a(k) + 10 continue + 2 do 11 k=1,nnz + jc(k) = ja(k) + 11 continue +c +c copy backward to allow for in-place processing. +c + 3 do 13 i=nrow,1,-1 + k1 = ia(i+1)-1 + k2 = ia(i) + do 12 k=k1,k2,-1 + ir(k) = i + 12 continue + 13 continue + return +c------------- end-of-csrcoo ------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrssr (nrow,a,ja,ia,nzmax,ao,jao,iao,ierr) + real*8 a(*), ao(*), t + integer ia(*), ja(*), iao(*), jao(*) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Symmetric Sparse Row +c----------------------------------------------------------------------- +c this subroutine extracts the lower triangular part of a matrix. +c It can used as a means for converting a symmetric matrix for +c which all the entries are stored in sparse format into one +c in which only the lower part is stored. The routine is in place in +c that the output matrix ao, jao, iao can be overwritten on +c the input matrix a, ja, ia if desired. Csrssr has been coded to +c put the diagonal elements of the matrix in the last position in +c each row (i.e. in position ao(ia(i+1)-1 of ao and jao) +c----------------------------------------------------------------------- +c On entry +c----------- +c nrow = dimension of the matrix a. +c a, ja, +c ia = matrix stored in compressed row sparse format +c +c nzmax = length of arrays ao, and jao. +c +c On return: +c----------- +c ao, jao, +c iao = lower part of input matrix (a,ja,ia) stored in compressed sparse +c row format format. +c +c ierr = integer error indicator. +c ierr .eq. 0 means normal return +c ierr .eq. i means that the code has stopped when processing +c row number i, because there is not enough space in ao, jao +c (according to the value of nzmax) +c +c----------------------------------------------------------------------- + ierr = 0 + ko = 0 +c----------------------------------------------------------------------- + do 7 i=1, nrow + kold = ko + kdiag = 0 + do 71 k = ia(i), ia(i+1) -1 + if (ja(k) .gt. i) goto 71 + ko = ko+1 + if (ko .gt. nzmax) then + ierr = i + return + endif + ao(ko) = a(k) + jao(ko) = ja(k) + if (ja(k) .eq. i) kdiag = ko + 71 continue + if (kdiag .eq. 0 .or. kdiag .eq. ko) goto 72 +c +c exchange +c + t = ao(kdiag) + ao(kdiag) = ao(ko) + ao(ko) = t +c + k = jao(kdiag) + jao(kdiag) = jao(ko) + jao(ko) = k + 72 iao(i) = kold+1 + 7 continue +c redefine iao(n+1) + iao(nrow+1) = ko+1 + return +c--------- end of csrssr ----------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine ssrcsr(job, value2, nrow, a, ja, ia, nzmax, + & ao, jao, iao, indu, iwk, ierr) +c .. Scalar Arguments .. + integer ierr, job, nrow, nzmax, value2 +c .. +c .. Array Arguments .. + integer ia(nrow+1), iao(nrow+1), indu(nrow), + & iwk(nrow+1), ja(*), jao(nzmax) + real*8 a(*), ao(nzmax) +c .. +c----------------------------------------------------------------------- +c Symmetric Sparse Row to Compressed Sparse Row format +c----------------------------------------------------------------------- +c This subroutine converts a given matrix in SSR format to regular +c CSR format by computing Ao = A + A' - diag(A), where A' is A +c transpose. +c +c Typically this routine is used to expand the SSR matrix of +c Harwell Boeing matrices, or to obtain a symmetrized graph of +c unsymmetric matrices. +c +c This routine is inplace, i.e., (Ao,jao,iao) may be same as +c (a,ja,ia). +c +c It is possible to input an arbitrary CSR matrix to this routine, +c since there is no syntactical difference between CSR and SSR +c format. It also removes duplicate entries and perform a partial +c ordering. The output matrix has an order of lower half, main +c diagonal and upper half after the partial ordering. +c----------------------------------------------------------------------- +c on entry: +c--------- +c +c job = options +c 0 -- duplicate entries are not removed. If the input matrix is +c SSR (not an arbitary CSR) matrix, no duplicate entry should +c arise from this routine. +c 1 -- eliminate duplicate entries, zero entries. +c 2 -- eliminate duplicate entries and perform partial ordering. +c 3 -- eliminate duplicate entries, sort the entries in the +c increasing order of clumn indices. +c +c value2= will the values of A be copied? +c 0 -- only expand the graph (a, ao are not touched) +c 1 -- expand the matrix with the values. +c +c nrow = column dimension of inout matrix +c a, +c ia, +c ja = matrix in compressed sparse row format. +c +c nzmax = size of arrays ao and jao. SSRCSR will abort if the storage +c provided in ao, jao is not sufficient to store A. See ierr. +c +c on return: +c---------- +c ao, jao, iao +c = output matrix in compressed sparse row format. The resulting +c matrix is symmetric and is equal to A+A'-D. ao, jao, iao, +c can be the same as a, ja, ia in the calling sequence. +c +c indu = integer array of length nrow. INDU will contain pointers +c to the beginning of upper traigular part if job > 1. +c Otherwise it is also used as a work array (size nrow). +c +c iwk = integer work space (size nrow+1). +c +c ierr = integer. Serving as error message. If the length of the arrays +c ao, jao exceeds nzmax, ierr returns the minimum value +c needed for nzmax. otherwise ierr=0 (normal return). +c +c----------------------------------------------------------------------- +c .. Local Scalars .. + integer i, ipos, j, k, kfirst, klast, ko, kosav, nnz + real*8 tmp +c .. +c .. Executable Statements .. + ierr = 0 + do 10 i = 1, nrow + indu(i) = 0 + iwk(i) = 0 + 10 continue + iwk(nrow+1) = 0 +c +c .. compute number of elements in each row of (A'-D) +c put result in iwk(i+1) for row i. +c + do 30 i = 1, nrow + do 20 k = ia(i), ia(i+1) - 1 + j = ja(k) + if (j.ne.i) + & iwk(j+1) = iwk(j+1) + 1 + 20 continue + 30 continue +c +c .. find addresses of first elements of ouput matrix. result in iwk +c + iwk(1) = 1 + do 40 i = 1, nrow + indu(i) = iwk(i) + ia(i+1) - ia(i) + iwk(i+1) = iwk(i+1) + indu(i) + indu(i) = indu(i) - 1 + 40 continue +c.....Have we been given enough storage in ao, jao ? + nnz = iwk(nrow+1) - 1 + if (nnz.gt.nzmax) then + ierr = nnz + return + endif +c +c .. copy the existing matrix (backwards). +c + kosav = iwk(nrow+1) + do 60 i = nrow, 1, -1 + klast = ia(i+1) - 1 + kfirst = ia(i) + iao(i+1) = kosav + kosav = iwk(i) + ko = iwk(i) - kfirst + iwk(i) = ko + klast + 1 + do 50 k = klast, kfirst, -1 + if (value2.ne.0) + & ao(k+ko) = a(k) + jao(k+ko) = ja(k) + 50 continue + 60 continue + iao(1) = 1 +c +c now copy (A'-D). Go through the structure of ao, jao, iao +c that has already been copied. iwk(i) is the address +c of the next free location in row i for ao, jao. +c + do 80 i = 1, nrow + do 70 k = iao(i), indu(i) + j = jao(k) + if (j.ne.i) then + ipos = iwk(j) + if (value2.ne.0) + & ao(ipos) = ao(k) + jao(ipos) = i + iwk(j) = ipos + 1 + endif + 70 continue + 80 continue + if (job.le.0) return +c +c .. eliminate duplicate entries -- +c array INDU is used as marker for existing indices, it is also the +c location of the entry. +c IWK is used to stored the old IAO array. +c matrix is copied to squeeze out the space taken by the duplicated +c entries. +c + do 90 i = 1, nrow + indu(i) = 0 + iwk(i) = iao(i) + 90 continue + iwk(nrow+1) = iao(nrow+1) + k = 1 + do 120 i = 1, nrow + iao(i) = k + ipos = iwk(i) + klast = iwk(i+1) + 100 if (ipos.lt.klast) then + j = jao(ipos) + if (indu(j).eq.0) then +c .. new entry .. + if (value2.ne.0) then + if (ao(ipos) .ne. 0.0D0) then + indu(j) = k + jao(k) = jao(ipos) + ao(k) = ao(ipos) + k = k + 1 + endif + else + indu(j) = k + jao(k) = jao(ipos) + k = k + 1 + endif + else if (value2.ne.0) then +c .. duplicate entry .. + ao(indu(j)) = ao(indu(j)) + ao(ipos) + endif + ipos = ipos + 1 + go to 100 + endif +c .. remove marks before working on the next row .. + do 110 ipos = iao(i), k - 1 + indu(jao(ipos)) = 0 + 110 continue + 120 continue + iao(nrow+1) = k + if (job.le.1) return +c +c .. partial ordering .. +c split the matrix into strict upper/lower triangular +c parts, INDU points to the the beginning of the strict upper part. +c + do 140 i = 1, nrow + klast = iao(i+1) - 1 + kfirst = iao(i) + 130 if (klast.gt.kfirst) then + if (jao(klast).lt.i .and. jao(kfirst).ge.i) then +c .. swap klast with kfirst .. + j = jao(klast) + jao(klast) = jao(kfirst) + jao(kfirst) = j + if (value2.ne.0) then + tmp = ao(klast) + ao(klast) = ao(kfirst) + ao(kfirst) = tmp + endif + endif + if (jao(klast).ge.i) + & klast = klast - 1 + if (jao(kfirst).lt.i) + & kfirst = kfirst + 1 + go to 130 + endif +c + if (jao(klast).lt.i) then + indu(i) = klast + 1 + else + indu(i) = klast + endif + 140 continue + if (job.le.2) return +c +c .. order the entries according to column indices +c bubble-sort is used +c + do 190 i = 1, nrow + do 160 ipos = iao(i), indu(i)-1 + do 150 j = indu(i)-1, ipos+1, -1 + k = j - 1 + if (jao(k).gt.jao(j)) then + ko = jao(k) + jao(k) = jao(j) + jao(j) = ko + if (value2.ne.0) then + tmp = ao(k) + ao(k) = ao(j) + ao(j) = tmp + endif + endif + 150 continue + 160 continue + do 180 ipos = indu(i), iao(i+1)-1 + do 170 j = iao(i+1)-1, ipos+1, -1 + k = j - 1 + if (jao(k).gt.jao(j)) then + ko = jao(k) + jao(k) = jao(j) + jao(j) = ko + if (value2.ne.0) then + tmp = ao(k) + ao(k) = ao(j) + ao(j) = tmp + endif + endif + 170 continue + 180 continue + 190 continue +c + return +c---- end of ssrcsr ---------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine xssrcsr (nrow,a,ja,ia,nzmax,ao,jao,iao,indu,ierr) + integer ia(nrow+1),iao(nrow+1),ja(*),jao(nzmax),indu(nrow+1) + real*8 a(*),ao(nzmax) +c----------------------------------------------------------------------- +c Symmetric Sparse Row to (regular) Compressed Sparse Row +c----------------------------------------------------------------------- +c this subroutine converts a symmetric matrix in which only the lower +c part is stored in compressed sparse row format, i.e., +c a matrix stored in symmetric sparse format, into a fully stored matrix +c i.e., a matrix where both the lower and upper parts are stored in +c compressed sparse row format. the algorithm is in place (i.e. result +c may be overwritten onto the input matrix a, ja, ia ----- ). +c the output matrix delivered by ssrcsr is such that each row starts with +c the elements of the lower part followed by those of the upper part. +c----------------------------------------------------------------------- +c on entry: +c--------- +c +c nrow = row dimension of inout matrix +c a, +c ia, +c ja = matrix in compressed sparse row format. This is assumed to be +c a lower triangular matrix. +c +c nzmax = size of arrays ao and jao. ssrcsr will abort if the storage +c provided in a, ja is not sufficient to store A. See ierr. +c +c on return: +c---------- +c ao, iao, +c jao = output matrix in compressed sparse row format. The resulting +c matrix is symmetric and is equal to A+A**T - D, if +c A is the original lower triangular matrix. ao, jao, iao, +c can be the same as a, ja, ia in the calling sequence. +c +c indu = integer array of length nrow+1. If the input matrix is such +c that the last element in each row is its diagonal element then +c on return, indu will contain the pointers to the diagonal +c element in each row of the output matrix. Otherwise used as +c work array. +c ierr = integer. Serving as error message. If the length of the arrays +c ao, jao exceeds nzmax, ierr returns the minimum value +c needed for nzmax. otherwise ierr=0 (normal return). +c +c----------------------------------------------------------------------- + ierr = 0 + do 1 i=1,nrow+1 + indu(i) = 0 + 1 continue +c +c compute number of elements in each row of strict upper part. +c put result in indu(i+1) for row i. +c + do 3 i=1, nrow + do 2 k=ia(i),ia(i+1)-1 + j = ja(k) + if (j .lt. i) indu(j+1) = indu(j+1)+1 + 2 continue + 3 continue +c----------- +c find addresses of first elements of ouput matrix. result in indu +c----------- + indu(1) = 1 + do 4 i=1,nrow + lenrow = ia(i+1)-ia(i) + indu(i+1) = indu(i) + indu(i+1) + lenrow + 4 continue +c--------------------- enough storage in a, ja ? -------- + nnz = indu(nrow+1)-1 + if (nnz .gt. nzmax) then + ierr = nnz + return + endif +c +c now copy lower part (backwards). +c + kosav = indu(nrow+1) + do 6 i=nrow,1,-1 + klast = ia(i+1)-1 + kfirst = ia(i) + iao(i+1) = kosav + ko = indu(i) + kosav = ko + do 5 k = kfirst, klast + ao(ko) = a(k) + jao(ko) = ja(k) + ko = ko+1 + 5 continue + indu(i) = ko + 6 continue + iao(1) = 1 +c +c now copy upper part. Go through the structure of ao, jao, iao +c that has already been copied (lower part). indu(i) is the address +c of the next free location in row i for ao, jao. +c + do 8 i=1,nrow +c i-th row is now in ao, jao, iao structure -- lower half part + do 9 k=iao(i), iao(i+1)-1 + j = jao(k) + if (j .ge. i) goto 8 + ipos = indu(j) + ao(ipos) = ao(k) + jao(ipos) = i + indu(j) = indu(j) + 1 + 9 continue + 8 continue + return +c----- end of xssrcsr -------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrell (nrow,a,ja,ia,maxcol,coef,jcoef,ncoef, + * ndiag,ierr) + integer ia(nrow+1), ja(*), jcoef(ncoef,1) + real*8 a(*), coef(ncoef,1) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Ellpack - Itpack format +c----------------------------------------------------------------------- +c this subroutine converts matrix stored in the general a, ja, ia +c format into the coef, jcoef itpack format. +c +c----------------------------------------------------------------------- +c on entry: +c---------- +c nrow = row dimension of the matrix A. +c +c a, +c ia, +c ja = input matrix in compressed sparse row format. +c +c ncoef = first dimension of arrays coef, and jcoef. +c +c maxcol = integer equal to the number of columns available in coef. +c +c on return: +c---------- +c coef = real array containing the values of the matrix A in +c itpack-ellpack format. +c jcoef = integer array containing the column indices of coef(i,j) +c in A. +c ndiag = number of active 'diagonals' found. +c +c ierr = error message. 0 = correct return. If ierr .ne. 0 on +c return this means that the number of diagonals found +c (ndiag) exceeds maxcol. +c +c----------------------------------------------------------------------- +c first determine the length of each row of lower-part-of(A) + ierr = 0 + ndiag = 0 + do 3 i=1, nrow + k = ia(i+1)-ia(i) + ndiag = max0(ndiag,k) + 3 continue +c----- check whether sufficient columns are available. ----------------- + if (ndiag .gt. maxcol) then + ierr = 1 + return + endif +c +c fill coef with zero elements and jcoef with row numbers.------------ +c + do 4 j=1,ndiag + do 41 i=1,nrow + coef(i,j) = 0.0d0 + jcoef(i,j) = i + 41 continue + 4 continue +c +c------- copy elements row by row.-------------------------------------- +c + do 6 i=1, nrow + k1 = ia(i) + k2 = ia(i+1)-1 + do 5 k=k1,k2 + coef(i,k-k1+1) = a(k) + jcoef(i,k-k1+1) = ja(k) + 5 continue + 6 continue + return +c--- end of csrell------------------------------------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine ellcsr(nrow,coef,jcoef,ncoef,ndiag,a,ja,ia,nzmax,ierr) + integer ia(nrow+1), ja(*), jcoef(ncoef,1) + real*8 a(*), coef(ncoef,1) +c----------------------------------------------------------------------- +c Ellpack - Itpack format to Compressed Sparse Row +c----------------------------------------------------------------------- +c this subroutine converts a matrix stored in ellpack-itpack format +c coef-jcoef into the compressed sparse row format. It actually checks +c whether an entry in the input matrix is a nonzero element before +c putting it in the output matrix. The test does not account for small +c values but only for exact zeros. +c----------------------------------------------------------------------- +c on entry: +c---------- +c +c nrow = row dimension of the matrix A. +c coef = array containing the values of the matrix A in ellpack format. +c jcoef = integer arraycontains the column indices of coef(i,j) in A. +c ncoef = first dimension of arrays coef, and jcoef. +c ndiag = number of active columns in coef, jcoef. +c +c ndiag = on entry the number of columns made available in coef. +c +c on return: +c---------- +c a, ia, +c ja = matrix in a, ia, ja format where. +c +c nzmax = size of arrays a and ja. ellcsr will abort if the storage +c provided in a, ja is not sufficient to store A. See ierr. +c +c ierr = integer. serves are output error message. +c ierr = 0 means normal return. +c ierr = 1 means that there is not enough space in +c a and ja to store output matrix. +c----------------------------------------------------------------------- +c first determine the length of each row of lower-part-of(A) + ierr = 0 +c-----check whether sufficient columns are available. ----------------- +c +c------- copy elements row by row.-------------------------------------- + kpos = 1 + ia(1) = kpos + do 6 i=1, nrow + do 5 k=1,ndiag + if (coef(i,k) .ne. 0.0d0) then + if (kpos .gt. nzmax) then + ierr = kpos + return + endif + a(kpos) = coef(i,k) + ja(kpos) = jcoef(i,k) + kpos = kpos+1 + endif + 5 continue + ia(i+1) = kpos + 6 continue + return +c--- end of ellcsr ----------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrmsr (n,a,ja,ia,ao,jao,wk,iwk) + real*8 a(*),ao(*),wk(n) + integer ia(n+1),ja(*),jao(*),iwk(n+1) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Modified - Sparse Row +c Sparse row with separate main diagonal +c----------------------------------------------------------------------- +c converts a general sparse matrix a, ja, ia into +c a compressed matrix using a separated diagonal (referred to as +c the bell-labs format as it is used by bell labs semi conductor +c group. We refer to it here as the modified sparse row format. +c Note: this has been coded in such a way that one can overwrite +c the output matrix onto the input matrix if desired by a call of +c the form +c +c call csrmsr (n, a, ja, ia, a, ja, wk,iwk) +c +c In case ao, jao, are different from a, ja, then one can +c use ao, jao as the work arrays in the calling sequence: +c +c call csrmsr (n, a, ja, ia, ao, jao, ao,jao) +c +c----------------------------------------------------------------------- +c +c on entry : +c--------- +c a, ja, ia = matrix in csr format. note that the +c algorithm is in place: ao, jao can be the same +c as a, ja, in which case it will be overwritten on it +c upon return. +c +c on return : +c----------- +c +c ao, jao = sparse matrix in modified sparse row storage format: +c + ao(1:n) contains the diagonal of the matrix. +c + ao(n+2:nnz) contains the nondiagonal elements of the +c matrix, stored rowwise. +c + jao(n+2:nnz) : their column indices +c + jao(1:n+1) contains the pointer array for the nondiagonal +c elements in ao(n+1:nnz) and jao(n+2:nnz). +c i.e., for i .le. n+1 jao(i) points to beginning of row i +c in arrays ao, jao. +c here nnz = number of nonzero elements+1 +c work arrays: +c------------ +c wk = real work array of length n +c iwk = integer work array of length n+1 +c +c notes: +c------- +c Algorithm is in place. i.e. both: +c +c call csrmsr (n, a, ja, ia, ao, jao, ao,jao) +c (in which ao, jao, are different from a, ja) +c and +c call csrmsr (n, a, ja, ia, a, ja, wk,iwk) +c (in which wk, jwk, are different from a, ja) +c are OK. +c-------- +c coded by Y. Saad Sep. 1989. Rechecked Feb 27, 1990. +c----------------------------------------------------------------------- + icount = 0 +c +c store away diagonal elements and count nonzero diagonal elements. +c + do 1 i=1,n + wk(i) = 0.0d0 + iwk(i+1) = ia(i+1)-ia(i) + do 2 k=ia(i),ia(i+1)-1 + if (ja(k) .eq. i) then + wk(i) = a(k) + icount = icount + 1 + iwk(i+1) = iwk(i+1)-1 + endif + 2 continue + 1 continue +c +c compute total length +c + iptr = n + ia(n+1) - icount +c +c copy backwards (to avoid collisions) +c + do 500 ii=n,1,-1 + do 100 k=ia(ii+1)-1,ia(ii),-1 + j = ja(k) + if (j .ne. ii) then + ao(iptr) = a(k) + jao(iptr) = j + iptr = iptr-1 + endif + 100 continue + 500 continue +c +c compute pointer values and copy wk(*) +c + jao(1) = n+2 + do 600 i=1,n + ao(i) = wk(i) + jao(i+1) = jao(i)+iwk(i+1) + 600 continue + return +c------------ end of subroutine csrmsr --------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine msrcsr (n,a,ja,ao,jao,iao,wk,iwk) + real*8 a(*),ao(*),wk(n) + integer ja(*),jao(*),iao(n+1),iwk(n+1) +c----------------------------------------------------------------------- +c Modified - Sparse Row to Compressed Sparse Row +c +c----------------------------------------------------------------------- +c converts a compressed matrix using a separated diagonal +c (modified sparse row format) in the Compressed Sparse Row +c format. +c does not check for zero elements in the diagonal. +c +c +c on entry : +c--------- +c n = row dimension of matrix +c a, ja = sparse matrix in msr sparse storage format +c see routine csrmsr for details on data structure +c +c on return : +c----------- +c +c ao,jao,iao = output matrix in csr format. +c +c work arrays: +c------------ +c wk = real work array of length n +c iwk = integer work array of length n+1 +c +c notes: +c The original version of this was NOT in place, but has +c been modified by adding the vector iwk to be in place. +c The original version had ja instead of iwk everywhere in +c loop 500. Modified Sun 29 May 1994 by R. Bramley (Indiana). +c +c----------------------------------------------------------------------- + logical added + do 1 i=1,n + wk(i) = a(i) + iwk(i) = ja(i) + 1 continue + iwk(n+1) = ja(n+1) + iao(1) = 1 + iptr = 1 +c--------- + do 500 ii=1,n + added = .false. + idiag = iptr + (iwk(ii+1)-iwk(ii)) + do 100 k=iwk(ii),iwk(ii+1)-1 + j = ja(k) + if (j .lt. ii) then + ao(iptr) = a(k) + jao(iptr) = j + iptr = iptr+1 + elseif (added) then + ao(iptr) = a(k) + jao(iptr) = j + iptr = iptr+1 + else +c add diag element - only reserve a position for it. + idiag = iptr + iptr = iptr+1 + added = .true. +c then other element + ao(iptr) = a(k) + jao(iptr) = j + iptr = iptr+1 + endif + 100 continue + ao(idiag) = wk(ii) + jao(idiag) = ii + if (.not. added) iptr = iptr+1 + iao(ii+1) = iptr + 500 continue + return +c------------ end of subroutine msrcsr --------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrcsc (n,job,ipos,a,ja,ia,ao,jao,iao) + integer ia(n+1),iao(n+1),ja(*),jao(*) + real*8 a(*),ao(*) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Compressed Sparse Column +c +c (transposition operation) Not in place. +c----------------------------------------------------------------------- +c -- not in place -- +c this subroutine transposes a matrix stored in a, ja, ia format. +c --------------- +c on entry: +c---------- +c n = dimension of A. +c job = integer to indicate whether to fill the values (job.eq.1) of the +c matrix ao or only the pattern., i.e.,ia, and ja (job .ne.1) +c +c ipos = starting position in ao, jao of the transposed matrix. +c the iao array takes this into account (thus iao(1) is set to ipos.) +c Note: this may be useful if one needs to append the data structure +c of the transpose to that of A. In this case use for example +c call csrcsc (n,1,ia(n+1),a,ja,ia,a,ja,ia(n+2)) +c for any other normal usage, enter ipos=1. +c a = real array of length nnz (nnz=number of nonzero elements in input +c matrix) containing the nonzero elements. +c ja = integer array of length nnz containing the column positions +c of the corresponding elements in a. +c ia = integer of size n+1. ia(k) contains the position in a, ja of +c the beginning of the k-th row. +c +c on return: +c ---------- +c output arguments: +c ao = real array of size nzz containing the "a" part of the transpose +c jao = integer array of size nnz containing the column indices. +c iao = integer array of size n+1 containing the "ia" index array of +c the transpose. +c +c----------------------------------------------------------------------- + call csrcsc2 (n,n,job,ipos,a,ja,ia,ao,jao,iao) + end +c----------------------------------------------------------------------- + subroutine csrcsc2 (n,n2,job,ipos,a,ja,ia,ao,jao,iao) + integer ia(n+1),iao(n2+1),ja(*),jao(*) + real*8 a(*),ao(*) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Compressed Sparse Column +c +c (transposition operation) Not in place. +c----------------------------------------------------------------------- +c Rectangular version. n is number of rows of CSR matrix, +c n2 (input) is number of columns of CSC matrix. +c----------------------------------------------------------------------- +c -- not in place -- +c this subroutine transposes a matrix stored in a, ja, ia format. +c --------------- +c on entry: +c---------- +c n = number of rows of CSR matrix. +c n2 = number of columns of CSC matrix. +c job = integer to indicate whether to fill the values (job.eq.1) of the +c matrix ao or only the pattern., i.e.,ia, and ja (job .ne.1) +c +c ipos = starting position in ao, jao of the transposed matrix. +c the iao array takes this into account (thus iao(1) is set to ipos.) +c Note: this may be useful if one needs to append the data structure +c of the transpose to that of A. In this case use for example +c call csrcsc2 (n,n,1,ia(n+1),a,ja,ia,a,ja,ia(n+2)) +c for any other normal usage, enter ipos=1. +c a = real array of length nnz (nnz=number of nonzero elements in input +c matrix) containing the nonzero elements. +c ja = integer array of length nnz containing the column positions +c of the corresponding elements in a. +c ia = integer of size n+1. ia(k) contains the position in a, ja of +c the beginning of the k-th row. +c +c on return: +c ---------- +c output arguments: +c ao = real array of size nzz containing the "a" part of the transpose +c jao = integer array of size nnz containing the column indices. +c iao = integer array of size n+1 containing the "ia" index array of +c the transpose. +c +c----------------------------------------------------------------------- +c----------------- compute lengths of rows of transp(A) ---------------- + do 1 i=1,n2+1 + iao(i) = 0 + 1 continue + do 3 i=1, n + do 2 k=ia(i), ia(i+1)-1 + j = ja(k)+1 + iao(j) = iao(j)+1 + 2 continue + 3 continue +c---------- compute pointers from lengths ------------------------------ + iao(1) = ipos + do 4 i=1,n2 + iao(i+1) = iao(i) + iao(i+1) + 4 continue +c--------------- now do the actual copying ----------------------------- + do 6 i=1,n + do 62 k=ia(i),ia(i+1)-1 + j = ja(k) + next = iao(j) + if (job .eq. 1) ao(next) = a(k) + jao(next) = i + iao(j) = next+1 + 62 continue + 6 continue +c-------------------------- reshift iao and leave ---------------------- + do 7 i=n2,1,-1 + iao(i+1) = iao(i) + 7 continue + iao(1) = ipos +c--------------- end of csrcsc2 ---------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrlnk (n,a,ja,ia,link) + real*8 a(*) + integer n, ja(*), ia(n+1), link(*) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Linked storage format. +c----------------------------------------------------------------------- +c this subroutine translates a matrix stored in compressed sparse +c row into one with a linked list storage format. Only the link +c array needs to be obtained since the arrays a, ja, and ia may +c be unchanged and carry the same meaning for the output matrix. +c in other words a, ja, ia, link is the output linked list data +c structure with a, ja, unchanged from input, and ia possibly +c altered (in case therea re null rows in matrix). Details on +c the output array link are given below. +c----------------------------------------------------------------------- +c Coded by Y. Saad, Feb 21, 1991. +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c n = integer equal to the dimension of A. +c +c a = real array of size nna containing the nonzero elements +c ja = integer array of size nnz containing the column positions +c of the corresponding elements in a. +c ia = integer of size n+1 containing the pointers to the beginning +c of each row. ia(k) contains the position in a, ja of the +c beginning of the k-th row. +c +c on return: +c---------- +c a, ja, are not changed. +c ia may be changed if there are null rows. +c +c a = nonzero elements. +c ja = column positions. +c ia = ia(i) points to the first element of row i in linked structure. +c link = integer array of size containing the linked list information. +c link(k) points to the next element of the row after element +c a(k), ja(k). if link(k) = 0, then there is no next element, +c i.e., a(k), jcol(k) is the last element of the current row. +c +c Thus row number i can be accessed as follows: +c next = ia(i) +c while(next .ne. 0) do +c value = a(next) ! value a(i,j) +c jcol = ja(next) ! column index j +c next = link(next) ! address of next element in row +c endwhile +c notes: +c ------ ia may be altered on return. +c----------------------------------------------------------------------- +c local variables + integer i, k +c +c loop through all rows +c + do 100 i =1, n + istart = ia(i) + iend = ia(i+1)-1 + if (iend .gt. istart) then + do 99 k=istart, iend-1 + link(k) = k+1 + 99 continue + link(iend) = 0 + else + ia(i) = 0 + endif + 100 continue +c + return +c-------------end-of-csrlnk -------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine lnkcsr (n, a, jcol, istart, link, ao, jao, iao) + real*8 a(*), ao(*) + integer n, jcol(*), istart(n), link(*), jao(*), iao(*) +c----------------------------------------------------------------------- +c Linked list storage format to Compressed Sparse Row format +c----------------------------------------------------------------------- +c this subroutine translates a matrix stored in linked list storage +c format into the compressed sparse row format. +c----------------------------------------------------------------------- +c Coded by Y. Saad, Feb 21, 1991. +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c n = integer equal to the dimension of A. +c +c a = real array of size nna containing the nonzero elements +c jcol = integer array of size nnz containing the column positions +c of the corresponding elements in a. +c istart= integer array of size n poiting to the beginning of the rows. +c istart(i) contains the position of the first element of +c row i in data structure. (a, jcol, link). +c if a row is empty istart(i) must be zero. +c link = integer array of size nnz containing the links in the linked +c list data structure. link(k) points to the next element +c of the row after element ao(k), jcol(k). if link(k) = 0, +c then there is no next element, i.e., ao(k), jcol(k) is +c the last element of the current row. +c +c on return: +c----------- +c ao, jao, iao = matrix stored in csr format: +c +c ao = real array containing the values of the nonzero elements of +c the matrix stored row-wise. +c jao = integer array of size nnz containing the column indices. +c iao = integer array of size n+1 containing the pointers array to the +c beginning of each row. iao(i) is the address in ao,jao of +c first element of row i. +c +c----------------------------------------------------------------------- +c first determine individial bandwidths and pointers. +c----------------------------------------------------------------------- +c local variables + integer irow, ipos, next +c----------------------------------------------------------------------- + ipos = 1 + iao(1) = ipos +c +c loop through all rows +c + do 100 irow =1, n +c +c unroll i-th row. +c + next = istart(irow) + 10 if (next .eq. 0) goto 99 + jao(ipos) = jcol(next) + ao(ipos) = a(next) + ipos = ipos+1 + next = link(next) + goto 10 + 99 iao(irow+1) = ipos + 100 continue +c + return +c-------------end-of-lnkcsr ------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrdia (n,idiag,job,a,ja,ia,ndiag, + * diag,ioff,ao,jao,iao,ind) + real*8 diag(ndiag,idiag), a(*), ao(*) + integer ia(*), ind(*), ja(*), jao(*), iao(*), ioff(*) +c----------------------------------------------------------------------- +c Compressed sparse row to diagonal format +c----------------------------------------------------------------------- +c this subroutine extracts idiag diagonals from the input matrix a, +c a, ia, and puts the rest of the matrix in the output matrix ao, +c jao, iao. The diagonals to be extracted depend on the value of job +c (see below for details.) In the first case, the diagonals to be +c extracted are simply identified by their offsets provided in ioff +c by the caller. In the second case, the code internally determines +c the idiag most significant diagonals, i.e., those diagonals of the +c matrix which have the largest number of nonzero elements, and +c extracts them. +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = dimension of the matrix a. +c idiag = integer equal to the number of diagonals to be extracted. +c Note: on return idiag may be modified. +c a, ja, +c ia = matrix stored in a, ja, ia, format +c job = integer. serves as a job indicator. Job is better thought +c of as a two-digit number job=xy. If the first (x) digit +c is one on entry then the diagonals to be extracted are +c internally determined. In this case csrdia exctracts the +c idiag most important diagonals, i.e. those having the largest +c number on nonzero elements. If the first digit is zero +c then csrdia assumes that ioff(*) contains the offsets +c of the diagonals to be extracted. there is no verification +c that ioff(*) contains valid entries. +c The second (y) digit of job determines whether or not +c the remainder of the matrix is to be written on ao,jao,iao. +c If it is zero then ao, jao, iao is not filled, i.e., +c the diagonals are found and put in array diag and the rest is +c is discarded. if it is one, ao, jao, iao contains matrix +c of the remaining elements. +c Thus: +c job= 0 means do not select diagonals internally (pick those +c defined by ioff) and do not fill ao,jao,iao +c job= 1 means do not select diagonals internally +c and fill ao,jao,iao +c job=10 means select diagonals internally +c and do not fill ao,jao,iao +c job=11 means select diagonals internally +c and fill ao,jao,iao +c +c ndiag = integer equal to the first dimension of array diag. +c +c on return: +c----------- +c +c idiag = number of diagonals found. This may be smaller than its value +c on entry. +c diag = real array of size (ndiag x idiag) containing the diagonals +c of A on return +c +c ioff = integer array of length idiag, containing the offsets of the +c diagonals to be extracted. +c ao, jao +c iao = remainder of the matrix in a, ja, ia format. +c work arrays: +c------------ +c ind = integer array of length 2*n-1 used as integer work space. +c needed only when job.ge.10 i.e., in case the diagonals are to +c be selected internally. +c +c Notes: +c------- +c 1) The algorithm is in place: ao, jao, iao can be overwritten on +c a, ja, ia if desired +c 2) When the code is required to select the diagonals (job .ge. 10) +c the selection of the diagonals is done from left to right +c as a result if several diagonals have the same weight (number +c of nonzero elemnts) the leftmost one is selected first. +c----------------------------------------------------------------------- + job1 = job/10 + job2 = job-job1*10 + if (job1 .eq. 0) goto 50 + n2 = n+n-1 + call infdia(n,ja,ia,ind,idum) +c----------- determine diagonals to accept.---------------------------- +c----------------------------------------------------------------------- + ii = 0 + 4 ii=ii+1 + jmax = 0 + do 41 k=1, n2 + j = ind(k) + if (j .le. jmax) goto 41 + i = k + jmax = j + 41 continue + if (jmax .le. 0) then + ii = ii-1 + goto 42 + endif + ioff(ii) = i-n + ind(i) = - jmax + if (ii .lt. idiag) goto 4 + 42 idiag = ii +c---------------- initialize diago to zero ----------------------------- + 50 continue + do 55 j=1,idiag + do 54 i=1,n + diag(i,j) = 0.0d0 + 54 continue + 55 continue +c----------------------------------------------------------------------- + ko = 1 +c----------------------------------------------------------------------- +c extract diagonals and accumulate remaining matrix. +c----------------------------------------------------------------------- + do 6 i=1, n + do 51 k=ia(i),ia(i+1)-1 + j = ja(k) + do 52 l=1,idiag + if (j-i .ne. ioff(l)) goto 52 + diag(i,l) = a(k) + goto 51 + 52 continue +c--------------- append element not in any diagonal to ao,jao,iao ----- + if (job2 .eq. 0) goto 51 + ao(ko) = a(k) + jao(ko) = j + ko = ko+1 + 51 continue + if (job2 .ne. 0 ) ind(i+1) = ko + 6 continue + if (job2 .eq. 0) return +c finish with iao + iao(1) = 1 + do 7 i=2,n+1 + iao(i) = ind(i) + 7 continue + return +c----------- end of csrdia --------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine diacsr (n,job,idiag,diag,ndiag,ioff,a,ja,ia) + real*8 diag(ndiag,idiag), a(*), t + integer ia(*), ja(*), ioff(*) +c----------------------------------------------------------------------- +c diagonal format to compressed sparse row +c----------------------------------------------------------------------- +c this subroutine extract the idiag most important diagonals from the +c input matrix a, ja, ia, i.e, those diagonals of the matrix which have +c the largest number of nonzero elements. If requested (see job), +c the rest of the matrix is put in a the output matrix ao, jao, iao +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = integer. dimension of the matrix a. +c job = integer. job indicator with the following meaning. +c if (job .eq. 0) then check for each entry in diag +c whether this entry is zero. If it is then do not include +c in the output matrix. Note that the test is a test for +c an exact arithmetic zero. Be sure that the zeros are +c actual zeros in double precision otherwise this would not +c work. +c +c idiag = integer equal to the number of diagonals to be extracted. +c Note: on return idiag may be modified. +c +c diag = real array of size (ndiag x idiag) containing the diagonals +c of A on return. +c +c ndiag = integer equal to the first dimension of array diag. +c +c ioff = integer array of length idiag, containing the offsets of the +c diagonals to be extracted. +c +c on return: +c----------- +c a, +c ja, +c ia = matrix stored in a, ja, ia, format +c +c Note: +c ----- the arrays a and ja should be of length n*idiag. +c +c----------------------------------------------------------------------- + ia(1) = 1 + ko = 1 + do 80 i=1, n + do 70 jj = 1, idiag + j = i+ioff(jj) + if (j .lt. 1 .or. j .gt. n) goto 70 + t = diag(i,jj) + if (job .eq. 0 .and. t .eq. 0.0d0) goto 70 + a(ko) = t + ja(ko) = j + ko = ko+1 + 70 continue + ia(i+1) = ko + 80 continue + return +c----------- end of diacsr --------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine bsrcsr (job, n, m, na, a, ja, ia, ao, jao, iao) + implicit none + integer job, n, m, na, ia(*), ja(*), jao(*), iao(n+1) + real*8 a(na,*), ao(*) +c----------------------------------------------------------------------- +c Block Sparse Row to Compressed Sparse Row. +c----------------------------------------------------------------------- +c NOTE: ** meanings of parameters may have changed wrt earlier versions +c FORMAT DEFINITION HAS CHANGED WRT TO EARLIER VERSIONS... +c----------------------------------------------------------------------- +c +c converts a matrix stored in block-reduced a, ja, ia format to the +c general sparse row a, ja, ia format. A matrix that has a block +c structure is a matrix whose entries are blocks of the same size m +c (e.g. 3 x 3). Then it is often preferred to work with the reduced +c graph of the matrix. Instead of storing one element at a time one can +c store a whole block at a time. In this storage scheme an entry is a +c square array holding the m**2 elements of a block. +c +c----------------------------------------------------------------------- +c on entry: +c---------- +c job = if job.eq.0 on entry, values are not copied (pattern only) +c +c n = the block row dimension of the matrix. +c +c m = the dimension of each block. Thus, the actual row dimension +c of A is n x m. +c +c na = first dimension of array a as declared in calling program. +c This should be .ge. m**2. +c +c a = real array containing the real entries of the matrix. Recall +c that each entry is in fact an m x m block. These entries +c are stored column-wise in locations a(1:m*m,k) for each k-th +c entry. See details below. +c +c ja = integer array of length n. ja(k) contains the column index +c of the leading element, i.e., the element (1,1) of the block +c that is held in the column a(*,k) of the value array. +c +c ia = integer array of length n+1. ia(i) points to the beginning +c of block row number i in the arrays a and ja. +c +c on return: +c----------- +c ao, jao, +c iao = matrix stored in compressed sparse row format. The number of +c rows in the new matrix is n x m. +c +c Notes: THIS CODE IS NOT IN PLACE. +c +c----------------------------------------------------------------------- +c BSR FORMAT. +c---------- +c Each row of A contains the m x m block matrix unpacked column- +c wise (this allows the user to declare the array a as a(m,m,*) on entry +c if desired). The block rows are stored in sequence just as for the +c compressed sparse row format. +c +c----------------------------------------------------------------------- +c example with m = 2: +c 1 2 3 +c +-------|--------|--------+ +-------+ +c | 1 2 | 0 0 | 3 4 | Block | x 0 x | 1 +c | 5 6 | 0 0 | 7 8 | Representation: | 0 x x | 2 +c +-------+--------+--------+ | x 0 0 | 3 +c | 0 0 | 9 10 | 11 12 | +-------+ +c | 0 0 | 13 14 | 15 16 | +c +-------+--------+--------+ +c | 17 18 | 0 0 | 0 0 | +c | 22 23 | 0 0 | 0 0 | +c +-------+--------+--------+ +c +c For this matrix: n = 3 +c m = 2 +c nnz = 5 +c----------------------------------------------------------------------- +c Data structure in Block Sparse Row format: +c------------------------------------------- +c Array A: +c------------------------- +c 1 3 9 11 17 <<--each m x m block is stored column-wise +c 5 7 13 15 22 in a column of the array A. +c 2 4 10 12 18 +c 6 8 14 16 23 +c------------------------- +c JA 1 3 2 3 1 <<-- column indices for each block. Note that +c------------------------- these indices are wrt block matrix. +c IA 1 3 5 6 <<-- pointers to beginning of each block row +c------------------------- in arrays A and JA. +c----------------------------------------------------------------------- +c locals +c + integer i, i1, i2, ij, ii, irow, j, jstart, k, krow, no + logical val +c + val = (job.ne.0) + no = n * m + irow = 1 + krow = 1 + iao(irow) = 1 +c----------------------------------------------------------------------- + do 2 ii=1, n +c +c recall: n is the block-row dimension +c + i1 = ia(ii) + i2 = ia(ii+1)-1 +c +c create m rows for each block row -- i.e., each k. +c + do 23 i=1,m + do 21 k=i1, i2 + jstart = m*(ja(k)-1) + do 22 j=1,m + ij = (j-1)*m + i + if (val) ao(krow) = a(ij,k) + jao(krow) = jstart+j + krow = krow+1 + 22 continue + 21 continue + irow = irow+1 + iao(irow) = krow + 23 continue + 2 continue + return +c-------------end-of-bsrcsr -------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrbsr (job,nrow,m,na,a,ja,ia,ao,jao,iao,iw,ierr) + implicit none + integer job,ierr,nrow,m,na,ia(nrow+1),ja(*),jao(na),iao(*),iw(*) + real*8 a(*),ao(na,*) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Block Sparse Row +c----------------------------------------------------------------------- +c +c This subroutine converts a matrix stored in a general compressed a, +c ja, ia format into a a block sparse row format a(m,m,*),ja(*),ia(*). +c See routine bsrcsr for more details on data structure for block +c matrices. +c +c NOTES: 1) the initial matrix does not have to have a block structure. +c zero padding is done for general sparse matrices. +c 2) For most practical purposes, na should be the same as m*m. +c +c----------------------------------------------------------------------- +c +c In what follows nr=1+(nrow-1)/m = block-row dimension of output matrix +c +c on entry: +c---------- +c +c job = job indicator. +c job = 0 -> only the pattern of output matrix is generated +c job > 0 -> both pattern and values are generated. +c job = -1 -> iao(1) will return the number of nonzero blocks, +c in the output matrix. In this case jao(1:nr) is used as +c workspace, ao is untouched, iao is untouched except iao(1) +c +c nrow = integer, the actual row dimension of the matrix. +c +c m = integer equal to the dimension of each block. m should be > 0. +c +c na = first dimension of array ao as declared in calling program. +c na should be .ge. m*m. +c +c a, ja, +c ia = input matrix stored in compressed sparse row format. +c +c on return: +c----------- +c +c ao = real array containing the values of the matrix. For details +c on the format see below. Each row of a contains the m x m +c block matrix unpacked column-wise (this allows the user to +c declare the array a as ao(m,m,*) on entry if desired). The +c block rows are stored in sequence just as for the compressed +c sparse row format. The block dimension of the output matrix +c is nr = 1 + (nrow-1) / m. +c +c jao = integer array. containing the block-column indices of the +c block-matrix. Each jao(k) is an integer between 1 and nr +c containing the block column index of the block ao(*,k). +c +c iao = integer array of length nr+1. iao(i) points to the beginning +c of block row number i in the arrays ao and jao. When job=-1 +c iao(1) contains the number of nonzero blocks of the output +c matrix and the rest of iao is unused. This is useful for +c determining the lengths of ao and jao. +c +c ierr = integer, error code. +c 0 -- normal termination +c 1 -- m is equal to zero +c 2 -- NA too small to hold the blocks (should be .ge. m**2) +c +c Work arrays: +c------------- +c iw = integer work array of dimension nr = 1 + (nrow-1) / m +c +c NOTES: +c------- +c 1) this code is not in place. +c 2) see routine bsrcsr for details on data sctructure for block +c sparse row format. +c +c----------------------------------------------------------------------- +c nr is the block-dimension of the output matrix. +c + integer nr, m2, io, ko, ii, len, k, jpos, j, i, ij, jr, irow + logical vals +c----- + ierr = 0 + if (m*m .gt. na) ierr = 2 + if (m .eq. 0) ierr = 1 + if (ierr .ne. 0) return +c----------------------------------------------------------------------- + vals = (job .gt. 0) + nr = 1 + (nrow-1) / m + m2 = m*m + ko = 1 + io = 1 + iao(io) = 1 + len = 0 +c +c iw determines structure of block-row (nonzero indicator) +c + do j=1, nr + iw(j) = 0 + enddo +c +c big loop -- leap by m rows each time. +c + do ii=1, nrow, m + irow = 0 +c +c go through next m rows -- make sure not to go beyond nrow. +c + do while (ii+irow .le. nrow .and. irow .le. m-1) + do k=ia(ii+irow),ia(ii+irow+1)-1 +c +c block column index = (scalar column index -1) / m + 1 +c + j = ja(k)-1 + jr = j/m + 1 + j = j - (jr-1)*m + jpos = iw(jr) + if (jpos .eq. 0) then +c +c create a new block +c + iw(jr) = ko + jao(ko) = jr + if (vals) then +c +c initialize new block to zero -- then copy nonzero element +c + do i=1, m2 + ao(i,ko) = 0.0d0 + enddo + ij = j*m + irow + 1 + ao(ij,ko) = a(k) + endif + ko = ko+1 + else +c +c copy column index and nonzero element +c + jao(jpos) = jr + ij = j*m + irow + 1 + if (vals) ao(ij,jpos) = a(k) + endif + enddo + irow = irow+1 + enddo +c +c refresh iw +c + do j = iao(io),ko-1 + iw(jao(j)) = 0 + enddo + if (job .eq. -1) then + len = len + ko-1 + ko = 1 + else + io = io+1 + iao(io) = ko + endif + enddo + if (job .eq. -1) iao(1) = len +c + return +c--------------end-of-csrbsr-------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrbnd (n,a,ja,ia,job,abd,nabd,lowd,ml,mu,ierr) + real*8 a(*),abd(nabd,n) + integer ia(n+1),ja(*) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Banded (Linpack ) format. +c----------------------------------------------------------------------- +c this subroutine converts a general sparse matrix stored in +c compressed sparse row format into the banded format. for the +c banded format,the Linpack conventions are assumed (see below). +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = integer,the actual row dimension of the matrix. +c +c a, +c ja, +c ia = input matrix stored in compressed sparse row format. +c +c job = integer. if job=1 then the values of the lower bandwith ml +c and the upper bandwidth mu are determined internally. +c otherwise it is assumed that the values of ml and mu +c are the correct bandwidths on input. See ml and mu below. +c +c nabd = integer. first dimension of array abd. +c +c lowd = integer. this should be set to the row number in abd where +c the lowest diagonal (leftmost) of A is located. +c lowd should be ( 1 .le. lowd .le. nabd). +c if it is not known in advance what lowd should be +c enter lowd = 0 and the default value lowd = ml+mu+1 +c will be chosen. Alternative: call routine getbwd from unary +c first to detrermione ml and mu then define lowd accordingly. +c (Note: the banded solvers in linpack use lowd=2*ml+mu+1. ) +c +c ml = integer. equal to the bandwidth of the strict lower part of A +c mu = integer. equal to the bandwidth of the strict upper part of A +c thus the total bandwidth of A is ml+mu+1. +c if ml+mu+1 is found to be larger than lowd then an error +c flag is raised (unless lowd = 0). see ierr. +c +c note: ml and mu are assumed to have the correct bandwidth values +c as defined above if job is set to zero on entry. +c +c on return: +c----------- +c +c abd = real array of dimension abd(nabd,n). +c on return contains the values of the matrix stored in +c banded form. The j-th column of abd contains the elements +c of the j-th column of the original matrix comprised in the +c band ( i in (j-ml,j+mu) ) with the lowest diagonal at +c the bottom row (row lowd). See details below for this format. +c +c ml = integer. equal to the bandwidth of the strict lower part of A +c mu = integer. equal to the bandwidth of the strict upper part of A +c if job=1 on entry then these two values are internally computed. +c +c lowd = integer. row number in abd where the lowest diagonal +c (leftmost) of A is located on return. In case lowd = 0 +c on return, then it is defined to ml+mu+1 on return and the +c lowd will contain this value on return. ` +c +c ierr = integer. used for error messages. On return: +c ierr .eq. 0 :means normal return +c ierr .eq. -1 : means invalid value for lowd. (either .lt. 0 +c or larger than nabd). +c ierr .eq. -2 : means that lowd is not large enough and as +c result the matrix cannot be stored in array abd. +c lowd should be at least ml+mu+1, where ml and mu are as +c provided on output. +c +c----------------------------------------------------------------------* +c Additional details on banded format. (this closely follows the * +c format used in linpack. may be useful for converting a matrix into * +c this storage format in order to use the linpack banded solvers). * +c----------------------------------------------------------------------* +c --- band storage format for matrix abd --- * +c uses ml+mu+1 rows of abd(nabd,*) to store the diagonals of * +c a in rows of abd starting from the lowest (sub)-diagonal which is * +c stored in row number lowd of abd. the minimum number of rows needed * +c in abd is ml+mu+1, i.e., the minimum value for lowd is ml+mu+1. the * +c j-th column of abd contains the elements of the j-th column of a, * +c from bottom to top: the element a(j+ml,j) is stored in position * +c abd(lowd,j), then a(j+ml-1,j) in position abd(lowd-1,j) and so on. * +c Generally, the element a(j+k,j) of original matrix a is stored in * +c position abd(lowd+k-ml,j), for k=ml,ml-1,..,0,-1, -mu. * +c The first dimension nabd of abd must be .ge. lowd * +c * +c example [from linpack ]: if the original matrix is * +c * +c 11 12 13 0 0 0 * +c 21 22 23 24 0 0 * +c 0 32 33 34 35 0 original banded matrix * +c 0 0 43 44 45 46 * +c 0 0 0 54 55 56 * +c 0 0 0 0 65 66 * +c * +c then n = 6, ml = 1, mu = 2. lowd should be .ge. 4 (=ml+mu+1) and * +c if lowd = 5 for example, abd should be: * +c * +c untouched --> x x x x x x * +c * * 13 24 35 46 * +c * 12 23 34 45 56 resulting abd matrix in banded * +c 11 22 33 44 55 66 format * +c row lowd--> 21 32 43 54 65 * * +c * +c * = not used * +c +* +c----------------------------------------------------------------------* +c first determine ml and mu. +c----------------------------------------------------------------------- + ierr = 0 +c----------- + if (job .eq. 1) call getbwd(n,a,ja,ia,ml,mu) + m = ml+mu+1 + if (lowd .eq. 0) lowd = m + if (m .gt. lowd) ierr = -2 + if (lowd .gt. nabd .or. lowd .lt. 0) ierr = -1 + if (ierr .lt. 0) return +c------------ + do 15 i=1,m + ii = lowd -i+1 + do 10 j=1,n + abd(ii,j) = 0.0d0 + 10 continue + 15 continue +c--------------------------------------------------------------------- + mdiag = lowd-ml + do 30 i=1,n + do 20 k=ia(i),ia(i+1)-1 + j = ja(k) + abd(i-j+mdiag,j) = a(k) + 20 continue + 30 continue + return +c------------- end of csrbnd ------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine bndcsr (n,abd,nabd,lowd,ml,mu,a,ja,ia,len,ierr) + real*8 a(*),abd(nabd,*), t + integer ia(n+1),ja(*) +c----------------------------------------------------------------------- +c Banded (Linpack ) format to Compressed Sparse Row format. +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = integer,the actual row dimension of the matrix. +c +c nabd = first dimension of array abd. +c +c abd = real array containing the values of the matrix stored in +c banded form. The j-th column of abd contains the elements +c of the j-th column of the original matrix,comprised in the +c band ( i in (j-ml,j+mu) ) with the lowest diagonal located +c in row lowd (see below). +c +c lowd = integer. this should be set to the row number in abd where +c the lowest diagonal (leftmost) of A is located. +c lowd should be s.t. ( 1 .le. lowd .le. nabd). +c The subroutines dgbco, ... of linpack use lowd=2*ml+mu+1. +c +c ml = integer. equal to the bandwidth of the strict lower part of A +c mu = integer. equal to the bandwidth of the strict upper part of A +c thus the total bandwidth of A is ml+mu+1. +c if ml+mu+1 is found to be larger than nabd then an error +c message is set. see ierr. +c +c len = integer. length of arrays a and ja. bndcsr will stop if the +c length of the arrays a and ja is insufficient to store the +c matrix. see ierr. +c +c on return: +c----------- +c a, +c ja, +c ia = input matrix stored in compressed sparse row format. +c +c lowd = if on entry lowd was zero then lowd is reset to the default +c value ml+mu+l. +c +c ierr = integer. used for error message output. +c ierr .eq. 0 :means normal return +c ierr .eq. -1 : means invalid value for lowd. +c ierr .gt. 0 : means that there was not enough storage in a and ja +c for storing the ourput matrix. The process ran out of space +c (as indicated by len) while trying to fill row number ierr. +c This should give an idea of much more storage might be required. +c Moreover, the first irow-1 rows are correctly filled. +c +c notes: the values in abd found to be equal to zero +c ----- (actual test: if (abd(...) .eq. 0.0d0) are removed. +c The resulting may not be identical to a csr matrix +c originally transformed to a bnd format. +c +c----------------------------------------------------------------------- + ierr = 0 +c----------- + if (lowd .gt. nabd .or. lowd .le. 0) then + ierr = -1 + return + endif +c----------- + ko = 1 + ia(1) = 1 + do 30 irow=1,n +c----------------------------------------------------------------------- + i = lowd + do 20 j=irow-ml,irow+mu + if (j .le. 0 ) goto 19 + if (j .gt. n) goto 21 + t = abd(i,j) + if (t .eq. 0.0d0) goto 19 + if (ko .gt. len) then + ierr = irow + return + endif + a(ko) = t + ja(ko) = j + ko = ko+1 + 19 i = i-1 + 20 continue +c end for row irow + 21 ia(irow+1) = ko + 30 continue + return +c------------- end of bndcsr ------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrssk (n,imod,a,ja,ia,asky,isky,nzmax,ierr) + real*8 a(*),asky(nzmax) + integer n, imod, nzmax, ierr, ia(n+1), isky(n+1), ja(*) +c----------------------------------------------------------------------- +c Compressed Sparse Row to Symmetric Skyline Format +c or Symmetric Sparse Row +c----------------------------------------------------------------------- +c this subroutine translates a compressed sparse row or a symmetric +c sparse row format into a symmetric skyline format. +c the input matrix can be in either compressed sparse row or the +c symmetric sparse row format. The output matrix is in a symmetric +c skyline format: a real array containing the (active portions) of the +c rows in sequence and a pointer to the beginning of each row. +c +c This module is NOT in place. +c----------------------------------------------------------------------- +c Coded by Y. Saad, Oct 5, 1989. Revised Feb. 18, 1991. +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c n = integer equal to the dimension of A. +c imod = integer indicating the variant of skyline format wanted: +c imod = 0 means the pointer isky points to the `zeroth' +c element of the row, i.e., to the position of the diagonal +c element of previous row (for i=1, isky(1)= 0) +c imod = 1 means that itpr points to the beginning of the row. +c imod = 2 means that isky points to the end of the row (diagonal +c element) +c +c a = real array of size nna containing the nonzero elements +c ja = integer array of size nnz containing the column positions +c of the corresponding elements in a. +c ia = integer of size n+1. ia(k) contains the position in a, ja of +c the beginning of the k-th row. +c nzmax = integer. must be set to the number of available locations +c in the output array asky. +c +c on return: +c---------- +c +c asky = real array containing the values of the matrix stored in skyline +c format. asky contains the sequence of active rows from +c i=1, to n, an active row being the row of elemnts of +c the matrix contained between the leftmost nonzero element +c and the diagonal element. +c isky = integer array of size n+1 containing the pointer array to +c each row. The meaning of isky depends on the input value of +c imod (see above). +c ierr = integer. Error message. If the length of the +c output array asky exceeds nzmax. ierr returns the minimum value +c needed for nzmax. otherwise ierr=0 (normal return). +c +c Notes: +c 1) This module is NOT in place. +c 2) even when imod = 2, length of isky is n+1, not n. +c +c----------------------------------------------------------------------- +c first determine individial bandwidths and pointers. +c----------------------------------------------------------------------- + ierr = 0 + isky(1) = 0 + do 3 i=1,n + ml = 0 + do 31 k=ia(i),ia(i+1)-1 + ml = max(ml,i-ja(k)+1) + 31 continue + isky(i+1) = isky(i)+ml + 3 continue +c +c test if there is enough space asky to do the copying. +c + nnz = isky(n+1) + if (nnz .gt. nzmax) then + ierr = nnz + return + endif +c +c fill asky with zeros. +c + do 1 k=1, nnz + asky(k) = 0.0d0 + 1 continue +c +c copy nonzero elements. +c + do 4 i=1,n + kend = isky(i+1) + do 41 k=ia(i),ia(i+1)-1 + j = ja(k) + if (j .le. i) asky(kend+j-i) = a(k) + 41 continue + 4 continue +c +c modify pointer according to imod if necessary. +c + if (imod .eq. 0) return + if (imod .eq. 1) then + do 50 k=1, n+1 + isky(k) = isky(k)+1 + 50 continue + endif + if (imod .eq. 2) then + do 60 k=1, n + isky(k) = isky(k+1) + 60 continue + endif +c + return +c------------- end of csrssk ------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine sskssr (n,imod,asky,isky,ao,jao,iao,nzmax,ierr) + real*8 asky(*),ao(nzmax) + integer n, imod,nzmax,ierr, isky(n+1),iao(n+1),jao(nzmax) +c----------------------------------------------------------------------- +c Symmetric Skyline Format to Symmetric Sparse Row format. +c----------------------------------------------------------------------- +c tests for exact zeros in skyline matrix (and ignores them in +c output matrix). In place routine (a, isky :: ao, iao) +c----------------------------------------------------------------------- +c this subroutine translates a symmetric skyline format into a +c symmetric sparse row format. Each element is tested to see if it is +c a zero element. Only the actual nonzero elements are retained. Note +c that the test used is simple and does take into account the smallness +c of a value. the subroutine filter (see unary module) can be used +c for this purpose. +c----------------------------------------------------------------------- +c Coded by Y. Saad, Oct 5, 1989. Revised Feb 18, 1991./ +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c n = integer equal to the dimension of A. +c imod = integer indicating the variant of skyline format used: +c imod = 0 means the pointer iao points to the `zeroth' +c element of the row, i.e., to the position of the diagonal +c element of previous row (for i=1, iao(1)= 0) +c imod = 1 means that itpr points to the beginning of the row. +c imod = 2 means that iao points to the end of the row +c (diagonal element) +c asky = real array containing the values of the matrix. asky contains +c the sequence of active rows from i=1, to n, an active row +c being the row of elemnts of the matrix contained between the +c leftmost nonzero element and the diagonal element. +c isky = integer array of size n+1 containing the pointer array to +c each row. isky (k) contains the address of the beginning of the +c k-th active row in the array asky. +c nzmax = integer. equal to the number of available locations in the +c output array ao. +c +c on return: +c ---------- +c ao = real array of size nna containing the nonzero elements +c jao = integer array of size nnz containing the column positions +c of the corresponding elements in a. +c iao = integer of size n+1. iao(k) contains the position in a, ja of +c the beginning of the k-th row. +c ierr = integer. Serving as error message. If the length of the +c output arrays ao, jao exceeds nzmax then ierr returns +c the row number where the algorithm stopped: rows +c i, to ierr-1 have been processed succesfully. +c ierr = 0 means normal return. +c ierr = -1 : illegal value for imod +c Notes: +c------- +c This module is in place: ao and iao can be the same as asky, and isky. +c----------------------------------------------------------------------- +c local variables + integer next, kend, kstart, i, j + ierr = 0 +c +c check for validity of imod +c + if (imod.ne.0 .and. imod.ne.1 .and. imod .ne. 2) then + ierr =-1 + return + endif +c +c next = pointer to next available position in output matrix +c kend = pointer to end of current row in skyline matrix. +c + next = 1 +c +c set kend = start position -1 in skyline matrix. +c + kend = 0 + if (imod .eq. 1) kend = isky(1)-1 + if (imod .eq. 0) kend = isky(1) +c +c loop through all rows +c + do 50 i=1,n +c +c save value of pointer to ith row in output matrix +c + iao(i) = next +c +c get beginnning and end of skyline row +c + kstart = kend+1 + if (imod .eq. 0) kend = isky(i+1) + if (imod .eq. 1) kend = isky(i+1)-1 + if (imod .eq. 2) kend = isky(i) +c +c copy element into output matrix unless it is a zero element. +c + do 40 k=kstart,kend + if (asky(k) .eq. 0.0d0) goto 40 + j = i-(kend-k) + jao(next) = j + ao(next) = asky(k) + next=next+1 + if (next .gt. nzmax+1) then + ierr = i + return + endif + 40 continue + 50 continue + iao(n+1) = next + return +c-------------end-of-sskssr -------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrjad (nrow, a, ja, ia, idiag, iperm, ao, jao, iao) + integer ja(*), jao(*), ia(nrow+1), iperm(nrow), iao(nrow) + real*8 a(*), ao(*) +c----------------------------------------------------------------------- +c Compressed Sparse Row to JAgged Diagonal storage. +c----------------------------------------------------------------------- +c this subroutine converts matrix stored in the compressed sparse +c row format to the jagged diagonal format. The data structure +c for the JAD (Jagged Diagonal storage) is as follows. The rows of +c the matrix are (implicitly) permuted so that their lengths are in +c decreasing order. The real entries ao(*) and their column indices +c jao(*) are stored in succession. The number of such diagonals is idiag. +c the lengths of each of these diagonals is stored in iao(*). +c For more details see [E. Anderson and Y. Saad, +c ``Solving sparse triangular systems on parallel computers'' in +c Inter. J. of High Speed Computing, Vol 1, pp. 73-96 (1989).] +c or [Y. Saad, ``Krylov Subspace Methods on Supercomputers'' +c SIAM J. on Stat. Scient. Comput., volume 10, pp. 1200-1232 (1989).] +c----------------------------------------------------------------------- +c on entry: +c---------- +c nrow = row dimension of the matrix A. +c +c a, +c ia, +c ja = input matrix in compressed sparse row format. +c +c on return: +c---------- +c +c idiag = integer. The number of jagged diagonals in the matrix. +c +c iperm = integer array of length nrow containing the permutation +c of the rows that leads to a decreasing order of the +c number of nonzero elements. +c +c ao = real array containing the values of the matrix A in +c jagged diagonal storage. The j-diagonals are stored +c in ao in sequence. +c +c jao = integer array containing the column indices of the +c entries in ao. +c +c iao = integer array containing pointers to the beginning +c of each j-diagonal in ao, jao. iao is also used as +c a work array and it should be of length n at least. +c +c----------------------------------------------------------------------- +c ---- define initial iperm and get lengths of each row +c ---- jao is used a work vector to store tehse lengths +c + idiag = 0 + ilo = nrow + do 10 j=1, nrow + iperm(j) = j + len = ia(j+1) - ia(j) + ilo = min(ilo,len) + idiag = max(idiag,len) + jao(j) = len + 10 continue +c +c call sorter to get permutation. use iao as work array. +c + call dcsort (jao, nrow, iao, iperm, ilo, idiag) +c +c define output data structure. first lengths of j-diagonals +c + do 20 j=1, nrow + iao(j) = 0 + 20 continue + do 40 k=1, nrow + len = jao(iperm(k)) + do 30 i=1,len + iao(i) = iao(i)+1 + 30 continue + 40 continue +c +c get the output matrix itself +c + k1 = 1 + k0 = k1 + do 60 jj=1, idiag + len = iao(jj) + do 50 k=1,len + i = ia(iperm(k))+jj-1 + ao(k1) = a(i) + jao(k1) = ja(i) + k1 = k1+1 + 50 continue + iao(jj) = k0 + k0 = k1 + 60 continue + iao(idiag+1) = k1 + return +c----------end-of-csrjad------------------------------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine jadcsr (nrow, idiag, a, ja, ia, iperm, ao, jao, iao) + integer ja(*), jao(*), ia(idiag+1), iperm(nrow), iao(nrow+1) + real*8 a(*), ao(*) +c----------------------------------------------------------------------- +c Jagged Diagonal Storage to Compressed Sparse Row +c----------------------------------------------------------------------- +c this subroutine converts a matrix stored in the jagged diagonal format +c to the compressed sparse row format. +c----------------------------------------------------------------------- +c on entry: +c---------- +c nrow = integer. the row dimension of the matrix A. +c +c idiag = integer. The number of jagged diagonals in the data +c structure a, ja, ia. +c +c a, +c ja, +c ia = input matrix in jagged diagonal format. +c +c iperm = permutation of the rows used to obtain the JAD ordering. +c +c on return: +c---------- +c +c ao, jao, +c iao = matrix in CSR format. +c----------------------------------------------------------------------- +c determine first the pointers for output matrix. Go through the +c structure once: +c + do 137 j=1,nrow + jao(j) = 0 + 137 continue +c +c compute the lengths of each row of output matrix - +c + do 140 i=1, idiag + len = ia(i+1)-ia(i) + do 138 k=1,len + jao(iperm(k)) = jao(iperm(k))+1 + 138 continue + 140 continue +c +c remember to permute +c + kpos = 1 + iao(1) = 1 + do 141 i=1, nrow + kpos = kpos+jao(i) + iao(i+1) = kpos + 141 continue +c +c copy elemnts one at a time. +c + do 200 jj = 1, idiag + k1 = ia(jj)-1 + len = ia(jj+1)-k1-1 + do 160 k=1,len + kpos = iao(iperm(k)) + ao(kpos) = a(k1+k) + jao(kpos) = ja(k1+k) + iao(iperm(k)) = kpos+1 + 160 continue + 200 continue +c +c rewind pointers +c + do 5 j=nrow,1,-1 + iao(j+1) = iao(j) + 5 continue + iao(1) = 1 + return +c----------end-of-jadcsr------------------------------------------------ +c----------------------------------------------------------------------- + end + subroutine dcsort(ival, n, icnt, index, ilo, ihi) +c----------------------------------------------------------------------- +c Specifications for arguments: +c ---------------------------- + integer n, ilo, ihi, ival(n), icnt(ilo:ihi), index(n) +c----------------------------------------------------------------------- +c This routine computes a permutation which, when applied to the +c input vector ival, sorts the integers in ival in descending +c order. The permutation is represented by the vector index. The +c permuted ival can be interpreted as follows: +c ival(index(i-1)) .ge. ival(index(i)) .ge. ival(index(i+1)) +c +c A specialized sort, the distribution counting sort, is used +c which takes advantage of the knowledge that +c 1) The values are in the (small) range [ ilo, ihi ] +c 2) Values are likely to be repeated often +c +c contributed to SPARSKIT by Mike Heroux. (Cray Research) +c --------------------------------------- +c----------------------------------------------------------------------- +c Usage: +c------ +c call dcsort( ival, n, icnt, index, ilo, ihi ) +c +c Arguments: +c----------- +c ival integer array (input) +c On entry, ia is an n dimensional array that contains +c the values to be sorted. ival is unchanged on exit. +c +c n integer (input) +c On entry, n is the number of elements in ival and index. +c +c icnt integer (work) +c On entry, is an integer work vector of length +c (ihi - ilo + 1). +c +c index integer array (output) +c On exit, index is an n-length integer vector containing +c the permutation which sorts the vector ival. +c +c ilo integer (input) +c On entry, ilo is .le. to the minimum value in ival. +c +c ihi integer (input) +c On entry, ihi is .ge. to the maximum value in ival. +c +c Remarks: +c--------- +c The permutation is NOT applied to the vector ival. +c +c---------------------------------------------------------------- +c +c Local variables: +c Other integer values are temporary indices. +c +c Author: +c-------- +c Michael Heroux +c Sandra Carney +c Mathematical Software Research Group +c Cray Research, Inc. +c +c References: +c Knuth, Donald E., "The Art of Computer Programming, Volume 3: +c Sorting and Searching," Addison-Wesley, Reading, Massachusetts, +c 1973, pp. 78-79. +c +c Revision history: +c 05/09/90: Original implementation. A variation of the +c Distribution Counting Sort recommended by +c Sandra Carney. (Mike Heroux) +c +c----------------------------------------------------------------- +c ---------------------------------- +c Specifications for local variables +c ---------------------------------- + integer i, j, ivalj +c +c -------------------------- +c First executable statement +c -------------------------- + do 10 i = ilo, ihi + icnt(i) = 0 + 10 continue +c + do 20 i = 1, n + icnt(ival(i)) = icnt(ival(i)) + 1 + 20 continue +c + do 30 i = ihi-1,ilo,-1 + icnt(i) = icnt(i) + icnt(i+1) + 30 continue +c + do 40 j = n, 1, -1 + ivalj = ival(j) + index(icnt(ivalj)) = j + icnt(ivalj) = icnt(ivalj) - 1 + 40 continue + return + end +c-------end-of-dcsort--------------------------------------------------- +c----------------------------------------------------------------------- + subroutine cooell(job,n,nnz,a,ja,ia,ao,jao,lda,ncmax,nc,ierr) + implicit none + integer job,n,nnz,lda,ncmax,nc,ierr + integer ja(nnz),ia(nnz),jao(lda,ncmax) + real*8 a(nnz),ao(lda,ncmax) +c----------------------------------------------------------------------- +c COOrdinate format to ELLpack format +c----------------------------------------------------------------------- +c On entry: +c job -- 0 if only pattern is to be processed(AO is not touched) +c n -- number of rows in the matrix +c a,ja,ia -- input matix in COO format +c lda -- leading dimension of array AO and JAO +c ncmax -- size of the second dimension of array AO and JAO +c +c On exit: +c ao,jao -- the matrix in ELL format +c nc -- maximum number of nonzeros per row +c ierr -- 0 if convertion succeeded +c -1 if LDA < N +c nc if NC > ncmax +c +c NOTE: the last column of JAO is used as work space!! +c----------------------------------------------------------------------- + integer i,j,k,ip + real*8 zero + logical copyval + parameter (zero=0.0D0) +c .. first executable statement .. + copyval = (job.ne.0) + if (lda .lt. n) then + ierr = -1 + return + endif +c .. use the last column of JAO as workspace +c .. initialize the work space + do i = 1, n + jao(i,ncmax) = 0 + enddo + nc = 0 +c .. go through ia and ja to find out number nonzero per row + do k = 1, nnz + i = ia(k) + jao(i,ncmax) = jao(i,ncmax) + 1 + enddo +c .. maximum number of nonzero per row + nc = 0 + do i = 1, n + if (nc.lt.jao(i,ncmax)) nc = jao(i,ncmax) + jao(i,ncmax) = 0 + enddo +c .. if nc > ncmax retrun now + if (nc.gt.ncmax) then + ierr = nc + return + endif +c .. go through ia and ja to copy the matrix to AO and JAO + do k = 1, nnz + i = ia(k) + j = ja(k) + jao(i,ncmax) = jao(i,ncmax) + 1 + ip = jao(i,ncmax) + if (ip.gt.nc) nc = ip + if (copyval) ao(i,ip) = a(k) + jao(i,ip) = j + enddo +c .. fill the unspecified elements of AO and JAO with zero diagonals + do i = 1, n + do j = ia(i+1)-ia(i)+1, nc + jao(i,j)=i + if(copyval) ao(i,j) = zero + enddo + enddo + ierr = 0 +c + return + end +c-----end-of-cooell----------------------------------------------------- +c----------------------------------------------------------------------- + subroutine xcooell(n,nnz,a,ja,ia,ac,jac,nac,ner,ncmax,ierr) +C----------------------------------------------------------------------- +C coordinate format to ellpack format. +C----------------------------------------------------------------------- +C +C DATE WRITTEN: June 4, 1989. +C +C PURPOSE +C ------- +C This subroutine takes a sparse matrix in coordinate format and +C converts it into the Ellpack-Itpack storage. +C +C Example: +C ------- +C ( 11 0 13 0 0 0 ) +C | 21 22 0 24 0 0 | +C | 0 32 33 0 35 0 | +C A = | 0 0 43 44 0 46 | +C | 51 0 0 54 55 0 | +C ( 61 62 0 0 65 66 ) +C +C Coordinate storage scheme: +C +C A = (11,22,33,44,55,66,13,21,24,32,35,43,46,51,54,61,62,65) +C IA = (1, 2, 3, 4, 5, 6, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6 ) +C JA = ( 1, 2, 3, 4, 5, 6, 3, 1, 4, 2, 5, 3, 6, 1, 4, 1, 2, 5) +C +C Ellpack-Itpack storage scheme: +C +C ( 11 13 0 0 ) ( 1 3 * * ) +C | 22 21 24 0 | | 2 1 4 * | +C AC = | 33 32 35 0 | JAC = | 3 2 5 * | +C | 44 43 46 0 | | 4 3 6 * | +C | 55 51 54 0 | | 5 1 4 * | +C ( 66 61 62 65 ) ( 6 1 2 5 ) +C +C Note: * means that you can store values from 1 to 6 (1 to n, where +C n is the order of the matrix) in that position in the array. +C +C Contributed by: +C --------------- +C Ernest E. Rothman +C Cornell Thoery Center/Cornell National Supercomputer Facility +C e-mail address: BITNET: EER@CORNELLF.BITNET +C INTERNET: eer@cornellf.tn.cornell.edu +C +C checked and modified 04/13/90 Y.Saad. +C +C REFERENCES +C ---------- +C Kincaid, D. R.; Oppe, T. C.; Respess, J. R.; Young, D. M. 1984. +C ITPACKV 2C User's Guide, CNA-191. Center for Numerical Analysis, +C University of Texas at Austin. +C +C "Engineering and Scientific Subroutine Library; Guide and +C Reference; Release 3 (SC23-0184-3). Pp. 79-86. +C +C----------------------------------------------------------------------- +C +C INPUT PARAMETERS +C ---------------- +C N - Integer. The size of the square matrix. +C +C NNZ - Integer. Must be greater than or equal to the number of +C nonzero elements in the sparse matrix. Dimension of A, IA +C and JA. +C +C NCA - Integer. First dimension of output arrays ca and jac. +C +C A(NNZ) - Real array. (Double precision) +C Stored entries of the sparse matrix A. +C NNZ is the number of nonzeros. +C +C IA(NNZ) - Integer array. +C Pointers to specify rows for the stored nonzero entries +C in A. +C +C JA(NNZ) - Integer array. +C Pointers to specify columns for the stored nonzero +C entries in A. +C +C NER - Integer. Must be set greater than or equal to the maximum +C number of nonzeros in any row of the sparse matrix. +C +C OUTPUT PARAMETERS +C ----------------- +C AC(NAC,*) - Real array. (Double precision) +C Stored entries of the sparse matrix A in compressed +C storage mode. +C +C JAC(NAC,*) - Integer array. +C Contains the column numbers of the sparse matrix +C elements stored in the corresponding positions in +C array AC. +C +C NCMAX - Integer. Equals the maximum number of nonzeros in any +C row of the sparse matrix. +C +C IERR - Error parameter is returned as zero on successful +C execution of the subroutin 1 +c +c Work space: +c iwk -- integer work space of size nrow+1 +c +c .. Local Scalars .. + integer i,j,k,ko,ipos,kfirst,klast + real*8 tmp +c .. +c + if (job.le.0) return +c +c .. eliminate duplicate entries -- +c array INDU is used as marker for existing indices, it is also the +c location of the entry. +c IWK is used to stored the old IA array. +c matrix is copied to squeeze out the space taken by the duplicated +c entries. +c + do 90 i = 1, nrow + indu(i) = 0 + iwk(i) = ia(i) + 90 continue + iwk(nrow+1) = ia(nrow+1) + k = 1 + do 120 i = 1, nrow + ia(i) = k + ipos = iwk(i) + klast = iwk(i+1) + 100 if (ipos.lt.klast) then + j = ja(ipos) + if (indu(j).eq.0) then +c .. new entry .. + if (value2.ne.0) then + if (a(ipos) .ne. 0.0D0) then + indu(j) = k + ja(k) = ja(ipos) + a(k) = a(ipos) + k = k + 1 + endif + else + indu(j) = k + ja(k) = ja(ipos) + k = k + 1 + endif + else if (value2.ne.0) then +c .. duplicate entry .. + a(indu(j)) = a(indu(j)) + a(ipos) + endif + ipos = ipos + 1 + go to 100 + endif +c .. remove marks before working on the next row .. + do 110 ipos = ia(i), k - 1 + indu(ja(ipos)) = 0 + 110 continue + 120 continue + ia(nrow+1) = k + if (job.le.1) return +c +c .. partial ordering .. +c split the matrix into strict upper/lower triangular +c parts, INDU points to the the beginning of the upper part. +c + do 140 i = 1, nrow + klast = ia(i+1) - 1 + kfirst = ia(i) + 130 if (klast.gt.kfirst) then + if (ja(klast).lt.i .and. ja(kfirst).ge.i) then +c .. swap klast with kfirst .. + j = ja(klast) + ja(klast) = ja(kfirst) + ja(kfirst) = j + if (value2.ne.0) then + tmp = a(klast) + a(klast) = a(kfirst) + a(kfirst) = tmp + endif + endif + if (ja(klast).ge.i) + & klast = klast - 1 + if (ja(kfirst).lt.i) + & kfirst = kfirst + 1 + go to 130 + endif +c + if (ja(klast).lt.i) then + indu(i) = klast + 1 + else + indu(i) = klast + endif + 140 continue + if (job.le.2) return +c +c .. order the entries according to column indices +c burble-sort is used +c + do 190 i = 1, nrow + do 160 ipos = ia(i), indu(i)-1 + do 150 j = indu(i)-1, ipos+1, -1 + k = j - 1 + if (ja(k).gt.ja(j)) then + ko = ja(k) + ja(k) = ja(j) + ja(j) = ko + if (value2.ne.0) then + tmp = a(k) + a(k) = a(j) + a(j) = tmp + endif + endif + 150 continue + 160 continue + do 180 ipos = indu(i), ia(i+1)-1 + do 170 j = ia(i+1)-1, ipos+1, -1 + k = j - 1 + if (ja(k).gt.ja(j)) then + ko = ja(k) + ja(k) = ja(j) + ja(j) = ko + if (value2.ne.0) then + tmp = a(k) + a(k) = a(j) + a(j) = tmp + endif + endif + 170 continue + 180 continue + 190 continue + return +c---- end of clncsr ---------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine copmat (nrow,a,ja,ia,ao,jao,iao,ipos,job) + real*8 a(*),ao(*) + integer nrow, ia(*),ja(*),jao(*),iao(*), ipos, job +c---------------------------------------------------------------------- +c copies the matrix a, ja, ia, into the matrix ao, jao, iao. +c---------------------------------------------------------------------- +c on entry: +c--------- +c nrow = row dimension of the matrix +c a, +c ja, +c ia = input matrix in compressed sparse row format. +c ipos = integer. indicates the position in the array ao, jao +c where the first element should be copied. Thus +c iao(1) = ipos on return. +c job = job indicator. if (job .ne. 1) the values are not copies +c (i.e., pattern only is copied in the form of arrays ja, ia). +c +c on return: +c---------- +c ao, +c jao, +c iao = output matrix containing the same data as a, ja, ia. +c----------------------------------------------------------------------- +c Y. Saad, March 1990. +c----------------------------------------------------------------------- +c local variables + integer kst, i, k +c + kst = ipos -ia(1) + do 100 i = 1, nrow+1 + iao(i) = ia(i) + kst + 100 continue +c + do 200 k=ia(1), ia(nrow+1)-1 + jao(kst+k)= ja(k) + 200 continue +c + if (job .ne. 1) return + do 201 k=ia(1), ia(nrow+1)-1 + ao(kst+k) = a(k) + 201 continue +c + return +c--------end-of-copmat ------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine msrcop (nrow,a,ja,ao,jao,job) + real*8 a(*),ao(*) + integer nrow, ja(*),jao(*), job +c---------------------------------------------------------------------- +c copies the MSR matrix a, ja, into the MSR matrix ao, jao +c---------------------------------------------------------------------- +c on entry: +c--------- +c nrow = row dimension of the matrix +c a,ja = input matrix in Modified compressed sparse row format. +c job = job indicator. Values are not copied if job .ne. 1 +c +c on return: +c---------- +c ao, jao = output matrix containing the same data as a, ja. +c----------------------------------------------------------------------- +c Y. Saad, +c----------------------------------------------------------------------- +c local variables + integer i, k +c + do 100 i = 1, nrow+1 + jao(i) = ja(i) + 100 continue +c + do 200 k=ja(1), ja(nrow+1)-1 + jao(k)= ja(k) + 200 continue +c + if (job .ne. 1) return + do 201 k=ja(1), ja(nrow+1)-1 + ao(k) = a(k) + 201 continue + do 202 k=1,nrow + ao(k) = a(k) + 202 continue +c + return +c--------end-of-msrcop ------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + double precision function getelm (i,j,a,ja,ia,iadd,sorted) +c----------------------------------------------------------------------- +c purpose: +c -------- +c this function returns the element a(i,j) of a matrix a, +c for any pair (i,j). the matrix is assumed to be stored +c in compressed sparse row (csr) format. getelm performs a +c binary search in the case where it is known that the elements +c are sorted so that the column indices are in increasing order. +c also returns (in iadd) the address of the element a(i,j) in +c arrays a and ja when the search is successsful (zero if not). +c----- +c first contributed by noel nachtigal (mit). +c recoded jan. 20, 1991, by y. saad [in particular +c added handling of the non-sorted case + the iadd output] +c----------------------------------------------------------------------- +c parameters: +c ----------- +c on entry: +c---------- +c i = the row index of the element sought (input). +c j = the column index of the element sought (input). +c a = the matrix a in compressed sparse row format (input). +c ja = the array of column indices (input). +c ia = the array of pointers to the rows' data (input). +c sorted = logical indicating whether the matrix is knonw to +c have its column indices sorted in increasing order +c (sorted=.true.) or not (sorted=.false.). +c (input). +c on return: +c----------- +c getelm = value of a(i,j). +c iadd = address of element a(i,j) in arrays a, ja if found, +c zero if not found. (output) +c +c note: the inputs i and j are not checked for validity. +c----------------------------------------------------------------------- +c noel m. nachtigal october 28, 1990 -- youcef saad jan 20, 1991. +c----------------------------------------------------------------------- + integer i, ia(*), iadd, j, ja(*) + double precision a(*) + logical sorted +c +c local variables. +c + integer ibeg, iend, imid, k +c +c initialization +c + iadd = 0 + getelm = 0.0 + ibeg = ia(i) + iend = ia(i+1)-1 +c +c case where matrix is not necessarily sorted +c + if (.not. sorted) then +c +c scan the row - exit as soon as a(i,j) is found +c + do 5 k=ibeg, iend + if (ja(k) .eq. j) then + iadd = k + goto 20 + endif + 5 continue +c +c end unsorted case. begin sorted case +c + else +c +c begin binary search. compute the middle index. +c + 10 imid = ( ibeg + iend ) / 2 +c +c test if found +c + if (ja(imid).eq.j) then + iadd = imid + goto 20 + endif + if (ibeg .ge. iend) goto 20 +c +c else update the interval bounds. +c + if (ja(imid).gt.j) then + iend = imid -1 + else + ibeg = imid +1 + endif + goto 10 +c +c end both cases +c + endif +c + 20 if (iadd .ne. 0) getelm = a(iadd) +c + return +c--------end-of-getelm-------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine getdia (nrow,ncol,job,a,ja,ia,len,diag,idiag,ioff) + real*8 diag(*),a(*) + integer nrow, ncol, job, len, ioff, ia(*), ja(*), idiag(*) +c----------------------------------------------------------------------- +c this subroutine extracts a given diagonal from a matrix stored in csr +c format. the output matrix may be transformed with the diagonal removed +c from it if desired (as indicated by job.) +c----------------------------------------------------------------------- +c our definition of a diagonal of matrix is a vector of length nrow +c (always) which contains the elements in rows 1 to nrow of +c the matrix that are contained in the diagonal offset by ioff +c with respect to the main diagonal. if the diagonal element +c falls outside the matrix then it is defined as a zero entry. +c thus the proper definition of diag(*) with offset ioff is +c +c diag(i) = a(i,ioff+i) i=1,2,...,nrow +c with elements falling outside the matrix being defined as zero. +c +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c +c nrow = integer. the row dimension of the matrix a. +c ncol = integer. the column dimension of the matrix a. +c job = integer. job indicator. if job = 0 then +c the matrix a, ja, ia, is not altered on return. +c if job.ne.0 then getdia will remove the entries +c collected in diag from the original matrix. +c this is done in place. +c +c a,ja, +c ia = matrix stored in compressed sparse row a,ja,ia,format +c ioff = integer,containing the offset of the wanted diagonal +c the diagonal extracted is the one corresponding to the +c entries a(i,j) with j-i = ioff. +c thus ioff = 0 means the main diagonal +c +c on return: +c----------- +c len = number of nonzero elements found in diag. +c (len .le. min(nrow,ncol-ioff)-max(1,1-ioff) + 1 ) +c +c diag = real*8 array of length nrow containing the wanted diagonal. +c diag contains the diagonal (a(i,j),j-i = ioff ) as defined +c above. +c +c idiag = integer array of length len, containing the poisitions +c in the original arrays a and ja of the diagonal elements +c collected in diag. a zero entry in idiag(i) means that +c there was no entry found in row i belonging to the diagonal. +c +c a, ja, +c ia = if job .ne. 0 the matrix is unchanged. otherwise the nonzero +c diagonal entries collected in diag are removed from the +c matrix and therefore the arrays a, ja, ia will change. +c (the matrix a, ja, ia will contain len fewer elements) +c +c----------------------------------------------------------------------c +c Y. Saad, sep. 21 1989 - modified and retested Feb 17, 1996. c +c----------------------------------------------------------------------c +c local variables + integer istart, max, iend, i, kold, k, kdiag, ko +c + istart = max(0,-ioff) + iend = min(nrow,ncol-ioff) + len = 0 + do 1 i=1,nrow + idiag(i) = 0 + diag(i) = 0.0d0 + 1 continue +c +c extract diagonal elements +c + do 6 i=istart+1, iend + do 51 k= ia(i),ia(i+1) -1 + if (ja(k)-i .eq. ioff) then + diag(i)= a(k) + idiag(i) = k + len = len+1 + goto 6 + endif + 51 continue + 6 continue + if (job .eq. 0 .or. len .eq.0) return +c +c remove diagonal elements and rewind structure +c + ko = 0 + do 7 i=1, nrow + kold = ko + kdiag = idiag(i) + do 71 k= ia(i), ia(i+1)-1 + if (k .ne. kdiag) then + ko = ko+1 + a(ko) = a(k) + ja(ko) = ja(k) + endif + 71 continue + ia(i) = kold+1 + 7 continue +c +c redefine ia(nrow+1) +c + ia(nrow+1) = ko+1 + return +c------------end-of-getdia---------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine transp (nrow,ncol,a,ja,ia,iwk,ierr) + integer nrow, ncol, ia(*), ja(*), iwk(*), ierr + real*8 a(*) +c------------------------------------------------------------------------ +c In-place transposition routine. +c------------------------------------------------------------------------ +c this subroutine transposes a matrix stored in compressed sparse row +c format. the transposition is done in place in that the arrays a,ja,ia +c of the transpose are overwritten onto the original arrays. +c------------------------------------------------------------------------ +c on entry: +c--------- +c nrow = integer. The row dimension of A. +c ncol = integer. The column dimension of A. +c a = real array of size nnz (number of nonzero elements in A). +c containing the nonzero elements +c ja = integer array of length nnz containing the column positions +c of the corresponding elements in a. +c ia = integer of size n+1, where n = max(nrow,ncol). On entry +c ia(k) contains the position in a,ja of the beginning of +c the k-th row. +c +c iwk = integer work array of same length as ja. +c +c on return: +c---------- +c +c ncol = actual row dimension of the transpose of the input matrix. +c Note that this may be .le. the input value for ncol, in +c case some of the last columns of the input matrix are zero +c columns. In the case where the actual number of rows found +c in transp(A) exceeds the input value of ncol, transp will +c return without completing the transposition. see ierr. +c a, +c ja, +c ia = contains the transposed matrix in compressed sparse +c row format. The row dimension of a, ja, ia is now ncol. +c +c ierr = integer. error message. If the number of rows for the +c transposed matrix exceeds the input value of ncol, +c then ierr is set to that number and transp quits. +c Otherwise ierr is set to 0 (normal return). +c +c Note: +c----- 1) If you do not need the transposition to be done in place +c it is preferrable to use the conversion routine csrcsc +c (see conversion routines in formats). +c 2) the entries of the output matrix are not sorted (the column +c indices in each are not in increasing order) use csrcsc +c if you want them sorted. +c----------------------------------------------------------------------c +c Y. Saad, Sep. 21 1989 c +c modified Oct. 11, 1989. c +c----------------------------------------------------------------------c +c local variables + real*8 t, t1 + ierr = 0 + nnz = ia(nrow+1)-1 +c +c determine column dimension +c + jcol = 0 + do 1 k=1, nnz + jcol = max(jcol,ja(k)) + 1 continue + if (jcol .gt. ncol) then + ierr = jcol + return + endif +c +c convert to coordinate format. use iwk for row indices. +c + ncol = jcol +c + do 3 i=1,nrow + do 2 k=ia(i),ia(i+1)-1 + iwk(k) = i + 2 continue + 3 continue +c find pointer array for transpose. + do 35 i=1,ncol+1 + ia(i) = 0 + 35 continue + do 4 k=1,nnz + i = ja(k) + ia(i+1) = ia(i+1)+1 + 4 continue + ia(1) = 1 +c------------------------------------------------------------------------ + do 44 i=1,ncol + ia(i+1) = ia(i) + ia(i+1) + 44 continue +c +c loop for a cycle in chasing process. +c + init = 1 + k = 0 + 5 t = a(init) + i = ja(init) + j = iwk(init) + iwk(init) = -1 +c------------------------------------------------------------------------ + 6 k = k+1 +c current row number is i. determine where to go. + l = ia(i) +c save the chased element. + t1 = a(l) + inext = ja(l) +c then occupy its location. + a(l) = t + ja(l) = j +c update pointer information for next element to be put in row i. + ia(i) = l+1 +c determine next element to be chased + if (iwk(l) .lt. 0) goto 65 + t = t1 + i = inext + j = iwk(l) + iwk(l) = -1 + if (k .lt. nnz) goto 6 + goto 70 + 65 init = init+1 + if (init .gt. nnz) goto 70 + if (iwk(init) .lt. 0) goto 65 +c restart chasing -- + goto 5 + 70 continue + do 80 i=ncol,1,-1 + ia(i+1) = ia(i) + 80 continue + ia(1) = 1 +c + return +c------------------end-of-transp ---------------------------------------- +c------------------------------------------------------------------------ + end +c------------------------------------------------------------------------ + subroutine getl (n,a,ja,ia,ao,jao,iao) + integer n, ia(*), ja(*), iao(*), jao(*) + real*8 a(*), ao(*) +c------------------------------------------------------------------------ +c this subroutine extracts the lower triangular part of a matrix +c and writes the result ao, jao, iao. The routine is in place in +c that ao, jao, iao can be the same as a, ja, ia if desired. +c----------- +c on input: +c +c n = dimension of the matrix a. +c a, ja, +c ia = matrix stored in compressed sparse row format. +c On return: +c ao, jao, +c iao = lower triangular matrix (lower part of a) +c stored in a, ja, ia, format +c note: the diagonal element is the last element in each row. +c i.e. in a(ia(i+1)-1 ) +c ao, jao, iao may be the same as a, ja, ia on entry -- in which case +c getl will overwrite the result on a, ja, ia. +c +c------------------------------------------------------------------------ +c local variables + real*8 t + integer ko, kold, kdiag, k, i +c +c inititialize ko (pointer for output matrix) +c + ko = 0 + do 7 i=1, n + kold = ko + kdiag = 0 + do 71 k = ia(i), ia(i+1) -1 + if (ja(k) .gt. i) goto 71 + ko = ko+1 + ao(ko) = a(k) + jao(ko) = ja(k) + if (ja(k) .eq. i) kdiag = ko + 71 continue + if (kdiag .eq. 0 .or. kdiag .eq. ko) goto 72 +c +c exchange +c + t = ao(kdiag) + ao(kdiag) = ao(ko) + ao(ko) = t +c + k = jao(kdiag) + jao(kdiag) = jao(ko) + jao(ko) = k + 72 iao(i) = kold+1 + 7 continue +c redefine iao(n+1) + iao(n+1) = ko+1 + return +c----------end-of-getl ------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine getu (n,a,ja,ia,ao,jao,iao) + integer n, ia(*), ja(*), iao(*), jao(*) + real*8 a(*), ao(*) +c------------------------------------------------------------------------ +c this subroutine extracts the upper triangular part of a matrix +c and writes the result ao, jao, iao. The routine is in place in +c that ao, jao, iao can be the same as a, ja, ia if desired. +c----------- +c on input: +c +c n = dimension of the matrix a. +c a, ja, +c ia = matrix stored in a, ja, ia, format +c On return: +c ao, jao, +c iao = upper triangular matrix (upper part of a) +c stored in compressed sparse row format +c note: the diagonal element is the last element in each row. +c i.e. in a(ia(i+1)-1 ) +c ao, jao, iao may be the same as a, ja, ia on entry -- in which case +c getu will overwrite the result on a, ja, ia. +c +c------------------------------------------------------------------------ +c local variables + real*8 t + integer ko, k, i, kdiag, kfirst + ko = 0 + do 7 i=1, n + kfirst = ko+1 + kdiag = 0 + do 71 k = ia(i), ia(i+1) -1 + if (ja(k) .lt. i) goto 71 + ko = ko+1 + ao(ko) = a(k) + jao(ko) = ja(k) + if (ja(k) .eq. i) kdiag = ko + 71 continue + if (kdiag .eq. 0 .or. kdiag .eq. kfirst) goto 72 +c exchange + t = ao(kdiag) + ao(kdiag) = ao(kfirst) + ao(kfirst) = t +c + k = jao(kdiag) + jao(kdiag) = jao(kfirst) + jao(kfirst) = k + 72 iao(i) = kfirst + 7 continue +c redefine iao(n+1) + iao(n+1) = ko+1 + return +c----------end-of-getu ------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine levels (n, jal, ial, nlev, lev, ilev, levnum) + integer jal(*),ial(*), levnum(*), ilev(*), lev(*) +c----------------------------------------------------------------------- +c levels gets the level structure of a lower triangular matrix +c for level scheduling in the parallel solution of triangular systems +c strict lower matrices (e.g. unit) as well matrices with their main +c diagonal are accepted. +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = integer. The row dimension of the matrix +c jal, ial = +c +c on return: +c----------- +c nlev = integer. number of levels found +c lev = integer array of length n containing the level +c scheduling permutation. +c ilev = integer array. pointer to beginning of levels in lev. +c the numbers lev(i) to lev(i+1)-1 contain the row numbers +c that belong to level number i, in the level scheduling +c ordering. The equations of the same level can be solved +c in parallel, once those of all the previous levels have +c been solved. +c work arrays: +c------------- +c levnum = integer array of length n (containing the level numbers +c of each unknown on return) +c----------------------------------------------------------------------- + do 10 i = 1, n + levnum(i) = 0 + 10 continue +c +c compute level of each node -- +c + nlev = 0 + do 20 i = 1, n + levi = 0 + do 15 j = ial(i), ial(i+1) - 1 + levi = max (levi, levnum(jal(j))) + 15 continue + levi = levi+1 + levnum(i) = levi + nlev = max(nlev,levi) + 20 continue +c-------------set data structure -------------------------------------- + do 21 j=1, nlev+1 + ilev(j) = 0 + 21 continue +c------count number of elements in each level ----------------------- + do 22 j=1, n + i = levnum(j)+1 + ilev(i) = ilev(i)+1 + 22 continue +c---- set up pointer for each level ---------------------------------- + ilev(1) = 1 + do 23 j=1, nlev + ilev(j+1) = ilev(j)+ilev(j+1) + 23 continue +c-----determine elements of each level -------------------------------- + do 30 j=1,n + i = levnum(j) + lev(ilev(i)) = j + ilev(i) = ilev(i)+1 + 30 continue +c reset pointers backwards + do 35 j=nlev, 1, -1 + ilev(j+1) = ilev(j) + 35 continue + ilev(1) = 1 + return +c----------end-of-levels------------------------------------------------ +C----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine amask (nrow,ncol,a,ja,ia,jmask,imask, + * c,jc,ic,iw,nzmax,ierr) +c--------------------------------------------------------------------- + real*8 a(*),c(*) + integer ia(nrow+1),ja(*),jc(*),ic(nrow+1),jmask(*),imask(nrow+1) + logical iw(ncol) +c----------------------------------------------------------------------- +c This subroutine builds a sparse matrix from an input matrix by +c extracting only elements in positions defined by the mask jmask, imask +c----------------------------------------------------------------------- +c On entry: +c--------- +c nrow = integer. row dimension of input matrix +c ncol = integer. Column dimension of input matrix. +c +c a, +c ja, +c ia = matrix in Compressed Sparse Row format +c +c jmask, +c imask = matrix defining mask (pattern only) stored in compressed +c sparse row format. +c +c nzmax = length of arrays c and jc. see ierr. +c +c On return: +c----------- +c +c a, ja, ia and jmask, imask are unchanged. +c +c c +c jc, +c ic = the output matrix in Compressed Sparse Row format. +c +c ierr = integer. serving as error message.c +c ierr = 1 means normal return +c ierr .gt. 1 means that amask stopped when processing +c row number ierr, because there was not enough space in +c c, jc according to the value of nzmax. +c +c work arrays: +c------------- +c iw = logical work array of length ncol. +c +c note: +c------ the algorithm is in place: c, jc, ic can be the same as +c a, ja, ia in which cas the code will overwrite the matrix c +c on a, ja, ia +c +c----------------------------------------------------------------------- + ierr = 0 + len = 0 + do 1 j=1, ncol + iw(j) = .false. + 1 continue +c unpack the mask for row ii in iw + do 100 ii=1, nrow +c save pointer in order to be able to do things in place + do 2 k=imask(ii), imask(ii+1)-1 + iw(jmask(k)) = .true. + 2 continue +c add umasked elemnts of row ii + k1 = ia(ii) + k2 = ia(ii+1)-1 + ic(ii) = len+1 + do 200 k=k1,k2 + j = ja(k) + if (iw(j)) then + len = len+1 + if (len .gt. nzmax) then + ierr = ii + return + endif + jc(len) = j + c(len) = a(k) + endif + 200 continue +c + do 3 k=imask(ii), imask(ii+1)-1 + iw(jmask(k)) = .false. + 3 continue + 100 continue + ic(nrow+1)=len+1 +c + return +c-----end-of-amask ----------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine rperm (nrow,a,ja,ia,ao,jao,iao,perm,job) + integer nrow,ja(*),ia(nrow+1),jao(*),iao(nrow+1),perm(nrow),job + real*8 a(*),ao(*) +c----------------------------------------------------------------------- +c this subroutine permutes the rows of a matrix in CSR format. +c rperm computes B = P A where P is a permutation matrix. +c the permutation P is defined through the array perm: for each j, +c perm(j) represents the destination row number of row number j. +c Youcef Saad -- recoded Jan 28, 1991. +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = dimension of the matrix +c a, ja, ia = input matrix in csr format +c perm = integer array of length nrow containing the permutation arrays +c for the rows: perm(i) is the destination of row i in the +c permuted matrix. +c ---> a(i,j) in the original matrix becomes a(perm(i),j) +c in the output matrix. +c +c job = integer indicating the work to be done: +c job = 1 permute a, ja, ia into ao, jao, iao +c (including the copying of real values ao and +c the array iao). +c job .ne. 1 : ignore real values. +c (in which case arrays a and ao are not needed nor +c used). +c +c------------ +c on return: +c------------ +c ao, jao, iao = input matrix in a, ja, ia format +c note : +c if (job.ne.1) then the arrays a and ao are not used. +c----------------------------------------------------------------------c +c Y. Saad, May 2, 1990 c +c----------------------------------------------------------------------c + logical values + values = (job .eq. 1) +c +c determine pointers for output matix. +c + do 50 j=1,nrow + i = perm(j) + iao(i+1) = ia(j+1) - ia(j) + 50 continue +c +c get pointers from lengths +c + iao(1) = 1 + do 51 j=1,nrow + iao(j+1)=iao(j+1)+iao(j) + 51 continue +c +c copying +c + do 100 ii=1,nrow +c +c old row = ii -- new row = iperm(ii) -- ko = new pointer +c + ko = iao(perm(ii)) + do 60 k=ia(ii), ia(ii+1)-1 + jao(ko) = ja(k) + if (values) ao(ko) = a(k) + ko = ko+1 + 60 continue + 100 continue +c + return +c---------end-of-rperm ------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine cperm (nrow,a,ja,ia,ao,jao,iao,perm,job) + integer nrow,ja(*),ia(nrow+1),jao(*),iao(nrow+1),perm(*), job + real*8 a(*), ao(*) +c----------------------------------------------------------------------- +c this subroutine permutes the columns of a matrix a, ja, ia. +c the result is written in the output matrix ao, jao, iao. +c cperm computes B = A P, where P is a permutation matrix +c that maps column j into column perm(j), i.e., on return +c a(i,j) becomes a(i,perm(j)) in new matrix +c Y. Saad, May 2, 1990 / modified Jan. 28, 1991. +c----------------------------------------------------------------------- +c on entry: +c---------- +c nrow = row dimension of the matrix +c +c a, ja, ia = input matrix in csr format. +c +c perm = integer array of length ncol (number of columns of A +c containing the permutation array the columns: +c a(i,j) in the original matrix becomes a(i,perm(j)) +c in the output matrix. +c +c job = integer indicating the work to be done: +c job = 1 permute a, ja, ia into ao, jao, iao +c (including the copying of real values ao and +c the array iao). +c job .ne. 1 : ignore real values ao and ignore iao. +c +c------------ +c on return: +c------------ +c ao, jao, iao = input matrix in a, ja, ia format (array ao not needed) +c +c Notes: +c------- +c 1. if job=1 then ao, iao are not used. +c 2. This routine is in place: ja, jao can be the same. +c 3. If the matrix is initially sorted (by increasing column number) +c then ao,jao,iao may not be on return. +c +c----------------------------------------------------------------------c +c local parameters: + integer k, i, nnz +c + nnz = ia(nrow+1)-1 + do 100 k=1,nnz + jao(k) = perm(ja(k)) + 100 continue +c +c done with ja array. return if no need to touch values. +c + if (job .ne. 1) return +c +c else get new pointers -- and copy values too. +c + do 1 i=1, nrow+1 + iao(i) = ia(i) + 1 continue +c + do 2 k=1, nnz + ao(k) = a(k) + 2 continue +c + return +c---------end-of-cperm-------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine dperm (nrow,a,ja,ia,ao,jao,iao,perm,qperm,job) + integer nrow,ja(*),ia(nrow+1),jao(*),iao(nrow+1),perm(nrow), + + qperm(*),job + real*8 a(*),ao(*) +c----------------------------------------------------------------------- +c This routine permutes the rows and columns of a matrix stored in CSR +c format. i.e., it computes P A Q, where P, Q are permutation matrices. +c P maps row i into row perm(i) and Q maps column j into column qperm(j): +c a(i,j) becomes a(perm(i),qperm(j)) in new matrix +c In the particular case where Q is the transpose of P (symmetric +c permutation of A) then qperm is not needed. +c note that qperm should be of length ncol (number of columns) but this +c is not checked. +c----------------------------------------------------------------------- +c Y. Saad, Sep. 21 1989 / recoded Jan. 28 1991. +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = dimension of the matrix +c a, ja, +c ia = input matrix in a, ja, ia format +c perm = integer array of length n containing the permutation arrays +c for the rows: perm(i) is the destination of row i in the +c permuted matrix -- also the destination of column i in case +c permutation is symmetric (job .le. 2) +c +c qperm = same thing for the columns. This should be provided only +c if job=3 or job=4, i.e., only in the case of a nonsymmetric +c permutation of rows and columns. Otherwise qperm is a dummy +c +c job = integer indicating the work to be done: +c * job = 1,2 permutation is symmetric Ao :== P * A * transp(P) +c job = 1 permute a, ja, ia into ao, jao, iao +c job = 2 permute matrix ignoring real values. +c * job = 3,4 permutation is non-symmetric Ao :== P * A * Q +c job = 3 permute a, ja, ia into ao, jao, iao +c job = 4 permute matrix ignoring real values. +c +c on return: +c----------- +c ao, jao, iao = input matrix in a, ja, ia format +c +c in case job .eq. 2 or job .eq. 4, a and ao are never referred to +c and can be dummy arguments. +c Notes: +c------- +c 1) algorithm is in place +c 2) column indices may not be sorted on return even though they may be +c on entry. +c----------------------------------------------------------------------c +c local variables + integer locjob, mod +c +c locjob indicates whether or not real values must be copied. +c + locjob = mod(job,2) +c +c permute rows first +c + call rperm (nrow,a,ja,ia,ao,jao,iao,perm,locjob) +c +c then permute columns +c + locjob = 0 +c + if (job .le. 2) then + call cperm (nrow,ao,jao,iao,ao,jao,iao,perm,locjob) + else + call cperm (nrow,ao,jao,iao,ao,jao,iao,qperm,locjob) + endif +c + return +c-------end-of-dperm---------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine dperm1 (i1,i2,a,ja,ia,b,jb,ib,perm,ipos,job) + integer i1,i2,job,ja(*),ia(*),jb(*),ib(*),perm(*) + real*8 a(*),b(*) +c----------------------------------------------------------------------- +c general submatrix extraction routine. +c----------------------------------------------------------------------- +c extracts rows perm(i1), perm(i1+1), ..., perm(i2) (in this order) +c from a matrix (doing nothing in the column indices.) The resulting +c submatrix is constructed in b, jb, ib. A pointer ipos to the +c beginning of arrays b,jb,is also allowed (i.e., nonzero elements +c are accumulated starting in position ipos of b, jb). +c----------------------------------------------------------------------- +c Y. Saad,Sep. 21 1989 / recoded Jan. 28 1991 / modified for PSPARSLIB +c Sept. 1997.. +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = dimension of the matrix +c a,ja, +c ia = input matrix in CSR format +c perm = integer array of length n containing the indices of the rows +c to be extracted. +c +c job = job indicator. if (job .ne.1) values are not copied (i.e., +c only pattern is copied). +c +c on return: +c----------- +c b,ja, +c ib = matrix in csr format. b(ipos:ipos+nnz-1),jb(ipos:ipos+nnz-1) +c contain the value and column indices respectively of the nnz +c nonzero elements of the permuted matrix. thus ib(1)=ipos. +c +c Notes: +c------- +c algorithm is NOT in place +c----------------------------------------------------------------------- +c local variables +c + integer ko,irow,k + logical values +c----------------------------------------------------------------------- + values = (job .eq. 1) + ko = ipos + ib(1) = ko + do 900 i=i1,i2 + irow = perm(i) + do 800 k=ia(irow),ia(irow+1)-1 + if (values) b(ko) = a(k) + jb(ko) = ja(k) + ko=ko+1 + 800 continue + ib(i-i1+2) = ko + 900 continue + return +c--------end-of-dperm1-------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine dperm2 (i1,i2,a,ja,ia,b,jb,ib,cperm,rperm,istart, + * ipos,job) + integer i1,i2,job,istart,ja(*),ia(*),jb(*),ib(*),cperm(*),rperm(*) + real*8 a(*),b(*) +c----------------------------------------------------------------------- +c general submatrix permutation/ extraction routine. +c----------------------------------------------------------------------- +c extracts rows rperm(i1), rperm(i1+1), ..., rperm(i2) and does an +c associated column permutation (using array cperm). The resulting +c submatrix is constructed in b, jb, ib. For added flexibility, the +c extracted elements are put in sequence starting from row 'istart' +c of B. In addition a pointer ipos to the beginning of arrays b,jb, +c is also allowed (i.e., nonzero elements are accumulated starting in +c position ipos of b, jb). In most applications istart and ipos are +c equal to one. However, the generality adds substantial flexiblity. +c EXPLE: (1) to permute msr to msr (excluding diagonals) +c call dperm2 (1,n,a,ja,ja,b,jb,jb,rperm,rperm,1,n+2) +c (2) To extract rows 1 to 10: define rperm and cperm to be +c identity permutations (rperm(i)=i, i=1,n) and then +c call dperm2 (1,10,a,ja,ia,b,jb,ib,rperm,rperm,1,1) +c (3) to achieve a symmetric permutation as defined by perm: +c call dperm2 (1,10,a,ja,ia,b,jb,ib,perm,perm,1,1) +c (4) to get a symmetric permutation of A and append the +c resulting data structure to A's data structure (useful!) +c call dperm2 (1,10,a,ja,ia,a,ja,ia(n+1),perm,perm,1,ia(n+1)) +c----------------------------------------------------------------------- +c Y. Saad,Sep. 21 1989 / recoded Jan. 28 1991. +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = dimension of the matrix +c i1,i2 = extract rows rperm(i1) to rperm(i2) of A, with i1 0 : Row number i is a zero row. +c Notes: +c------- +c 1) The column dimension of A is not needed. +c 2) algorithm in place (B can take the place of A). +c----------------------------------------------------------------- + call rnrms (nrow,nrm,a,ja,ia,diag) + ierr = 0 + do 1 j=1, nrow + if (diag(j) .eq. 0.0d0) then + ierr = j + return + else + diag(j) = 1.0d0/diag(j) + endif + 1 continue + call diamua(nrow,job,a,ja,ia,diag,b,jb,ib) + return +c-------end-of-roscal--------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine coscal(nrow,job,nrm,a,ja,ia,diag,b,jb,ib,ierr) +c----------------------------------------------------------------------- + real*8 a(*),b(*),diag(nrow) + integer nrow,job,ja(*),jb(*),ia(nrow+1),ib(nrow+1),ierr +c----------------------------------------------------------------------- +c scales the columns of A such that their norms are one on return +c result matrix written on b, or overwritten on A. +c 3 choices of norms: 1-norm, 2-norm, max-norm. in place. +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrow = integer. The row dimension of A +c +c job = integer. job indicator. Job=0 means get array b only +c job = 1 means get b, and the integer arrays ib, jb. +c +c nrm = integer. norm indicator. nrm = 1, means 1-norm, nrm =2 +c means the 2-nrm, nrm = 0 means max norm +c +c a, +c ja, +c ia = Matrix A in compressed sparse row format. +c +c on return: +c---------- +c +c diag = diagonal matrix stored as a vector containing the matrix +c by which the columns have been scaled, i.e., on return +c we have B = A * Diag +c +c b, +c jb, +c ib = resulting matrix B in compressed sparse row sparse format. +c +c ierr = error message. ierr=0 : Normal return +c ierr=i > 0 : Column number i is a zero row. +c Notes: +c------- +c 1) The column dimension of A is not needed. +c 2) algorithm in place (B can take the place of A). +c----------------------------------------------------------------- + call cnrms (nrow,nrm,a,ja,ia,diag) + ierr = 0 + do 1 j=1, nrow + if (diag(j) .eq. 0.0) then + ierr = j + return + else + diag(j) = 1.0d0/diag(j) + endif + 1 continue + call amudia (nrow,job,a,ja,ia,diag,b,jb,ib) + return +c--------end-of-coscal-------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine addblk(nrowa, ncola, a, ja, ia, ipos, jpos, job, + & nrowb, ncolb, b, jb, ib, nrowc, ncolc, c, jc, ic, nzmx, ierr) +c implicit none + integer nrowa, nrowb, nrowc, ncola, ncolb, ncolc, ipos, jpos + integer nzmx, ierr, job + integer ja(1:*), ia(1:*), jb(1:*), ib(1:*), jc(1:*), ic(1:*) + real*8 a(1:*), b(1:*), c(1:*) +c----------------------------------------------------------------------- +c This subroutine adds a matrix B into a submatrix of A whose +c (1,1) element is located in the starting position (ipos, jpos). +c The resulting matrix is allowed to be larger than A (and B), +c and the resulting dimensions nrowc, ncolc will be redefined +c accordingly upon return. +c The input matrices are assumed to be sorted, i.e. in each row +c the column indices appear in ascending order in the CSR format. +c----------------------------------------------------------------------- +c on entry: +c --------- +c nrowa = number of rows in A. +c bcola = number of columns in A. +c a,ja,ia = Matrix A in compressed sparse row format with entries sorted +c nrowb = number of rows in B. +c ncolb = number of columns in B. +c b,jb,ib = Matrix B in compressed sparse row format with entries sorted +c +c nzmax = integer. The length of the arrays c and jc. addblk will +c stop if the number of nonzero elements in the matrix C +c exceeds nzmax. See ierr. +c +c on return: +c---------- +c nrowc = number of rows in C. +c ncolc = number of columns in C. +c c,jc,ic = resulting matrix C in compressed sparse row sparse format +c with entries sorted ascendly in each row. +c +c ierr = integer. serving as error message. +c ierr = 0 means normal return, +c ierr .gt. 0 means that addblk stopped while computing the +c i-th row of C with i=ierr, because the number +c of elements in C exceeds nzmax. +c +c Notes: +c------- +c this will not work if any of the two input matrices is not sorted +c----------------------------------------------------------------------- + logical values + integer i,j1,j2,ka,kb,kc,kamax,kbmax + values = (job .ne. 0) + ierr = 0 + nrowc = max(nrowa, nrowb+ipos-1) + ncolc = max(ncola, ncolb+jpos-1) + kc = 1 + kbmax = 0 + ic(1) = kc +c + do 10 i=1, nrowc + if (i.le.nrowa) then + ka = ia(i) + kamax = ia(i+1)-1 + else + ka = ia(nrowa+1) + end if + if ((i.ge.ipos).and.((i-ipos).le.nrowb)) then + kb = ib(i-ipos+1) + kbmax = ib(i-ipos+2)-1 + else + kb = ib(nrowb+1) + end if +c +c a do-while type loop -- goes through all the elements in a row. +c + 20 continue + if (ka .le. kamax) then + j1 = ja(ka) + else + j1 = ncolc+1 + endif + if (kb .le. kbmax) then + j2 = jb(kb) + jpos - 1 + else + j2 = ncolc+1 + endif +c +c if there are more elements to be added. +c + if ((ka .le. kamax .or. kb .le. kbmax) .and. + & (j1 .le. ncolc .or. j2 .le. ncolc)) then +c +c three cases +c + if (j1 .eq. j2) then + if (values) c(kc) = a(ka)+b(kb) + jc(kc) = j1 + ka = ka+1 + kb = kb+1 + kc = kc+1 + else if (j1 .lt. j2) then + jc(kc) = j1 + if (values) c(kc) = a(ka) + ka = ka+1 + kc = kc+1 + else if (j1 .gt. j2) then + jc(kc) = j2 + if (values) c(kc) = b(kb) + kb = kb+1 + kc = kc+1 + endif + if (kc .gt. nzmx) goto 999 + goto 20 + end if + ic(i+1) = kc + 10 continue + return + 999 ierr = i + return +c---------end-of-addblk------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine get1up (n,ja,ia,ju) + integer n, ja(*),ia(*),ju(*) +c---------------------------------------------------------------------- +c obtains the first element of each row of the upper triangular part +c of a matrix. Assumes that the matrix is already sorted. +c----------------------------------------------------------------------- +c parameters +c input +c ----- +c ja = integer array containing the column indices of aij +c ia = pointer array. ia(j) contains the position of the +c beginning of row j in ja +c +c output +c ------ +c ju = integer array of length n. ju(i) is the address in ja +c of the first element of the uper triangular part of +c of A (including rthe diagonal. Thus if row i does have +c a nonzero diagonal element then ju(i) will point to it. +c This is a more general version of diapos. +c----------------------------------------------------------------------- +c local vAriables + integer i, k +c + do 5 i=1, n + ju(i) = 0 + k = ia(i) +c + 1 continue + if (ja(k) .ge. i) then + ju(i) = k + goto 5 + elseif (k .lt. ia(i+1) -1) then + k=k+1 +c +c go try next element in row +c + goto 1 + endif + 5 continue + return +c-----end-of-get1up----------------------------------------------------- + end +c---------------------------------------------------------------------- + subroutine xtrows (i1,i2,a,ja,ia,ao,jao,iao,iperm,job) + integer i1,i2,ja(*),ia(*),jao(*),iao(*),iperm(*),job + real*8 a(*),ao(*) +c----------------------------------------------------------------------- +c this subroutine extracts given rows from a matrix in CSR format. +c Specifically, rows number iperm(i1), iperm(i1+1), ...., iperm(i2) +c are extracted and put in the output matrix ao, jao, iao, in CSR +c format. NOT in place. +c Youcef Saad -- coded Feb 15, 1992. +c----------------------------------------------------------------------- +c on entry: +c---------- +c i1,i2 = two integers indicating the rows to be extracted. +c xtrows will extract rows iperm(i1), iperm(i1+1),..,iperm(i2), +c from original matrix and stack them in output matrix +c ao, jao, iao in csr format +c +c a, ja, ia = input matrix in csr format +c +c iperm = integer array of length nrow containing the reverse permutation +c array for the rows. row number iperm(j) in permuted matrix PA +c used to be row number j in unpermuted matrix. +c ---> a(i,j) in the permuted matrix was a(iperm(i),j) +c in the inout matrix. +c +c job = integer indicating the work to be done: +c job .ne. 1 : get structure only of output matrix,, +c i.e., ignore real values. (in which case arrays a +c and ao are not used nor accessed). +c job = 1 get complete data structure of output matrix. +c (i.e., including arrays ao and iao). +c------------ +c on return: +c------------ +c ao, jao, iao = input matrix in a, ja, ia format +c note : +c if (job.ne.1) then the arrays a and ao are not used. +c----------------------------------------------------------------------c +c Y. Saad, revised May 2, 1990 c +c----------------------------------------------------------------------c + logical values + values = (job .eq. 1) +c +c copying +c + ko = 1 + iao(1) = ko + do 100 j=i1,i2 +c +c ii=iperm(j) is the index of old row to be copied. +c + ii = iperm(j) + do 60 k=ia(ii), ia(ii+1)-1 + jao(ko) = ja(k) + if (values) ao(ko) = a(k) + ko = ko+1 + 60 continue + iao(j-i1+2) = ko + 100 continue +c + return +c---------end-of-xtrows------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine csrkvstr(n, ia, ja, nr, kvstr) +c----------------------------------------------------------------------- + integer n, ia(n+1), ja(*), nr, kvstr(*) +c----------------------------------------------------------------------- +c Finds block row partitioning of matrix in CSR format. +c----------------------------------------------------------------------- +c On entry: +c-------------- +c n = number of matrix scalar rows +c ia,ja = input matrix sparsity structure in CSR format +c +c On return: +c--------------- +c nr = number of block rows +c kvstr = first row number for each block row +c +c Notes: +c----------- +c Assumes that the matrix is sorted by columns. +c This routine does not need any workspace. +c +c----------------------------------------------------------------------- +c local variables + integer i, j, jdiff +c----------------------------------------------------------------------- + nr = 1 + kvstr(1) = 1 +c--------------------------------- + do i = 2, n + jdiff = ia(i+1)-ia(i) + if (jdiff .eq. ia(i)-ia(i-1)) then + do j = ia(i), ia(i+1)-1 + if (ja(j) .ne. ja(j-jdiff)) then + nr = nr + 1 + kvstr(nr) = i + goto 299 + endif + enddo + 299 continue + else + 300 nr = nr + 1 + kvstr(nr) = i + endif + enddo + kvstr(nr+1) = n+1 +c--------------------------------- + return + end +c----------------------------------------------------------------------- +c------------------------end-of-csrkvstr-------------------------------- + subroutine csrkvstc(n, ia, ja, nc, kvstc, iwk) +c----------------------------------------------------------------------- + integer n, ia(n+1), ja(*), nc, kvstc(*), iwk(*) +c----------------------------------------------------------------------- +c Finds block column partitioning of matrix in CSR format. +c----------------------------------------------------------------------- +c On entry: +c-------------- +c n = number of matrix scalar rows +c ia,ja = input matrix sparsity structure in CSR format +c +c On return: +c--------------- +c nc = number of block columns +c kvstc = first column number for each block column +c +c Work space: +c---------------- +c iwk(*) of size equal to the number of scalar columns plus one. +c Assumed initialized to 0, and left initialized on return. +c +c Notes: +c----------- +c Assumes that the matrix is sorted by columns. +c +c----------------------------------------------------------------------- +c local variables + integer i, j, k, ncol +c +c----------------------------------------------------------------------- +c-----use ncol to find maximum scalar column number + ncol = 0 +c-----mark the beginning position of the blocks in iwk + do i = 1, n + if (ia(i) .lt. ia(i+1)) then + j = ja(ia(i)) + iwk(j) = 1 + do k = ia(i)+1, ia(i+1)-1 + j = ja(k) + if (ja(k-1).ne.j-1) then + iwk(j) = 1 + iwk(ja(k-1)+1) = 1 + endif + enddo + iwk(j+1) = 1 + ncol = max0(ncol, j) + endif + enddo +c--------------------------------- + nc = 1 + kvstc(1) = 1 + do i = 2, ncol+1 + if (iwk(i).ne.0) then + nc = nc + 1 + kvstc(nc) = i + iwk(i) = 0 + endif + enddo + nc = nc - 1 +c--------------------------------- + return + end +c----------------------------------------------------------------------- +c------------------------end-of-csrkvstc-------------------------------- +c----------------------------------------------------------------------- + subroutine kvstmerge(nr, kvstr, nc, kvstc, n, kvst) +c----------------------------------------------------------------------- + integer nr, kvstr(nr+1), nc, kvstc(nc+1), n, kvst(*) +c----------------------------------------------------------------------- +c Merges block partitionings, for conformal row/col pattern. +c----------------------------------------------------------------------- +c On entry: +c-------------- +c nr,nc = matrix block row and block column dimension +c kvstr = first row number for each block row +c kvstc = first column number for each block column +c +c On return: +c--------------- +c n = conformal row/col matrix block dimension +c kvst = conformal row/col block partitioning +c +c Notes: +c----------- +c If matrix is not square, this routine returns without warning. +c +c----------------------------------------------------------------------- +c-----local variables + integer i,j +c--------------------------------- + if (kvstr(nr+1) .ne. kvstc(nc+1)) return + i = 1 + j = 1 + n = 1 + 200 if (i .gt. nr+1) then + kvst(n) = kvstc(j) + j = j + 1 + elseif (j .gt. nc+1) then + kvst(n) = kvstr(i) + i = i + 1 + elseif (kvstc(j) .eq. kvstr(i)) then + kvst(n) = kvstc(j) + j = j + 1 + i = i + 1 + elseif (kvstc(j) .lt. kvstr(i)) then + kvst(n) = kvstc(j) + j = j + 1 + else + kvst(n) = kvstr(i) + i = i + 1 + endif + n = n + 1 + if (i.le.nr+1 .or. j.le.nc+1) goto 200 + n = n - 2 +c--------------------------------- + return +c------------------------end-of-kvstmerge------------------------------- + end diff --git a/INFO/README b/INFO/README new file mode 100644 index 0000000..05dff92 --- /dev/null +++ b/INFO/README @@ -0,0 +1,66 @@ +c------------------------------------------------------------------------------c +c INFO MODULE c +c------------------------------------------------------------------------------c +c The INFO module provides some elementary information on a sparse c +c matrix. Geared towards a matrix in Harwell-Boeing format. c +c There is also a short main program that will read a Harwell-Boeing c +c matrix and produce the information on the standard output. See below. c +c c +c------------------------------------------------------------------------------c +c infofun.f contains subroutines: c +c------------------------------------------------------------------------------c +c bandwidth : computes the lower, upper, maximum, and average bandwidths. c +c nonz : computes maximum numbers of nonzero elements per column/row, c +c minimum numbers of nonzero elements per column/row, and c +c numbers of zero columns/rows. c +c diag_domi : computes the percentage of weakly diagonally dominant c +c rows/columns. c +c frobnorm : computes the Frobenius norm of A. c +c ansym : computes the Frobenius norm of the symmetric and non-symmetricc +c parts of A, computes number of matching elements in symmetry c +c and relative symmetry match. c +c distaij : computes the average distance of a(i,j) from diag and standardc +c deviation for this average. c +c skyline : computes the number of nonzeros in the skyline storage. c +c distdiag : computes the numbers of elements in each diagonal. c +c bandpart : computes the bandwidth of the banded matrix, which contains c +c 'nper' percent of the original matrix. c +c n_imp_diag: computes the most important diagonals. c +c nonz_lud : computes the number of nonzero elements in strict lower part, c +c strict upper part, and main diagonal. c +c avnz_col : computes average number of nonzero elements/column and std c +c deviation for this average. c +c vbrinfo : Print info on matrix in variable block row format c +c------------------------------------------------------------------------------c +c rinfo1.f : contains the main program to produce an executable c +c rinfoC.f : same thing in C -- info1.ex is made by makeC makefile c +c------------------------------------------------------------------------------c +c dinfo13.f : contains the main subroutine called by rinfo1.f c +c------------------------------------------------------------------------------c +c makefile: contains the make file to produce info1.ex c +c makeC: contains the make file to produce info1.ex from rinfoC.c c +c------------------------------------------------------------------------------c +c saylr1 : contains the Harwell-Boeing matrix saylr1 for testing purposes. c +c------------------------------------------------------------------------------c +c info.saylr1 : contains a sample output (see below) for the matrix saylr1. c +c------------------------------------------------------------------------------c +c------------------------------------------------------------------------------c +c Notes: c +c------------------------------------------------------------------------------c +c The makefile will actually create an executable tool called info1.ex c +c which will provide some information on a Harwell/Boeing matrix. c +c c +c Once you have made the executable info1 using the makefile, c +c you can execute for a matrix stored in the Harwell-Boeing c +c format. You will need to have a matrix in the harwell/boeing c +c format and type c +c c +c info1.ex < HB_file c +c c +c This will dump the info on the standard output/ c +c c +c for example typing info1.ex < saylr1 > info.saylr1 c +c c +c produces the file info.saylr1. [info.saylr1 is included in this directory c +c to check whether you get the same answers]. c +c------------------------------------------------------------------------------c diff --git a/INFO/dinfo13.f b/INFO/dinfo13.f new file mode 100644 index 0000000..156c052 --- /dev/null +++ b/INFO/dinfo13.f @@ -0,0 +1,394 @@ + subroutine dinfo1(n,iout,a,ja,ia,valued, + * title,key,type,ao,jao,iao) + implicit real*8 (a-h,o-z) + real*8 a(*),ao(*) + integer ja(*),ia(n+1),jao(*),iao(n+1),nzdiag + character title*72,key*8,type*3 + logical valued +c----------------------------------------------------------------------c +c SPARSKIT: ELEMENTARY INFORMATION ROUTINE. c +c----------------------------------------------------------------------c +c info1 obtains a number of statistics on a sparse matrix and writes c +c it into the output unit iout. The matrix is assumed c +c to be stored in the compressed sparse COLUMN format sparse a, ja, ia c +c----------------------------------------------------------------------c +c Modified Nov 1, 1989. 1) Assumes A is stored in column +c format. 2) Takes symmetry into account, i.e., handles Harwell-Boeing +c matrices correctly. +c *** (Because of the recent modification the words row and +c column may be mixed-up at occasions... to be checked... +c +c bug-fix July 25: 'upper' 'lower' mixed up in formats 108-107. +c +c On entry : +c----------- +c n = integer. column dimension of matrix +c iout = integer. unit number where the information it to be output. +c a = real array containing the nonzero elements of the matrix +c the elements are stored by columns in order +c (i.e. column i comes before column i+1, but the elements +c within each column can be disordered). +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c +c valued= logical equal to .true. if values are provided and .false. +c if only the pattern of the matrix is provided. (in that +c case a(*) and ao(*) are dummy arrays. +c +c title = a 72-character title describing the matrix +c NOTE: The first character in title is ignored (it is often +c a one). +c +c key = an 8-character key for the matrix +c type = a 3-character string to describe the type of the matrix. +c see harwell/Boeing documentation for more details on the +c above three parameters. +c +c on return +c---------- +c 1) elementary statistics on the matrix is written on output unit +c iout. See below for detailed explanation of typical output. +c 2) the entries of a, ja, ia are sorted. +c +c---------- +c +c ao = real*8 array of length nnz used as work array. +c jao = integer work array of length max(2*n+1,nnz) +c iao = integer work array of length n+1 +c +c Note : title, key, type are the same paramaters as those +c used for Harwell-Bowing matrices. +c +c----------------------------------------------------------------------- +c Output description: +c-------------------- +c *** The following info needs to be updated. +c +c + A header containing the Title, key, type of the matrix and, if values +c are not provided a message to that effect. +c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +c * SYMMETRIC STRUCTURE MEDIEVAL RUSSIAN TOWNS +c * Key = RUSSIANT , Type = SSA +c * No values provided - Information of pattern only +c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +c +c + dimension n, number of nonzero elements nnz, average number of +c nonzero elements per column, standard deviation for this average. +c + if the matrix is upper or lower triangular a message to that effect +c is printed. Also the number of nonzeros in the strict upper +c (lower) parts and the main diagonal are printed. +c + weight of longest column. This is the largest number of nonzero +c elements in a column encountered. Similarly for weight of +c largest/smallest row. +c + lower dandwidth as defined by +c ml = max ( i-j, / all a(i,j).ne. 0 ) +c + upper bandwidth as defined by +c mu = max ( j-i, / all a(i,j).ne. 0 ) +c NOTE that ml or mu can be negative. ml .lt. 0 would mean +c that A is confined to the strict upper part above the diagonal +c number -ml. Similarly for mu. +c +c + maximun bandwidth as defined by +c Max ( Max [ j ; a(i,j) .ne. 0 ] - Min [ j ; a(i,j) .ne. 0 ] ) +c i +c + average bandwidth = average over all columns of the widths each column. +c +c + If there are zero columns /or rows a message is printed +c giving the number of such columns/rows. +c +c + matching elements in A and transp(A) :this counts the number of +c positions (i,j) such that if a(i,j) .ne. 0 then a(j,i) .ne. 0. +c if this number is equal to nnz then the matrix is symmetric. +c + Relative symmetry match : this is the ratio of the previous integer +c over nnz. If this ratio is equal to one then the matrix has a +c symmetric structure. +c +c + average distance of a given element from the diagonal, standard dev. +c the distance of a(i,j) is defined as iabs(j-i). +c +c + Frobenius norm of A +c Frobenius norm of 0.5*(A + transp(A)) +c Frobenius norm of 0.5*(A - transp(A)) +c these numbers provide information on the degree of symmetry +c of the matrix. If the norm of the nonsymmetric part is +c zero then the matrix is symmetric. +c +c + 90% of matrix is in the band of width k, means that +c by moving away and in a symmetric manner from the main +c diagonal you would have to include exactly k diagonals +c (k is always odd), in order to include 90% of the nonzero +c elements of A. The same thing is then for 80%. +c +c + The total number of nonvoid diagonals, i.e., among the +c 2n-1 diagonals of the matrix which have at least one nonxero +c element. +c +c + Most important diagonals. The code selects a number of k +c (k .le. 10) diagonals that are the most important ones, i.e. +c that have the largest number of nonzero elements. Any diagonal +c that has fewer than 1% of the nonzero elements of A is dropped. +c the numbers printed are the offsets with respect to the +c main diagonal, going from left tp right. +c Thus 0 means the main diagonal -1 means the subdiagonal, and +c +10 means the 10th upper diagonal. +c + The accumulated percentages in the next line represent the +c percentage of the nonzero elements represented by the diagonals +c up the current one put together. +c Thus: +c * The 10 most important diagonals are (offsets) : * +c * 0 1 2 24 21 4 23 22 20 19 * +c * The accumulated percentages they represent are : * +c * 40.4 68.1 77.7 80.9 84.0 86.2 87.2 88.3 89.4 90.4 * +c *-----------------------------------------------------------------* +c shows the offsets of the most important diagonals and +c 40.4 represent ratio of the number of nonzero elements in the +c diagonal zero (main diagonal) over the total number of nonzero +c elements. the second number indicates that the diagonal 0 and the +c diagonal 1 together hold 68.1% of the matrix, etc.. +c +c + Block structure: +c if the matrix has a block structure then the block size is found +c and printed. Otherwise the info1 will say that the matrix +c does not have a block structure. Note that block struture has +c a very specific meaning here. the matrix has a block structure +c if it consists of square blocks that are dense. even if there +c are zero elements in the blocks they should be represented +c otherwise it would be possible to determine the block size. +c +c----------------------------------------------------------------------- + real*8 dcount(20),amx + integer ioff(20) + character*61 tmpst + logical sym +c----------------------------------------------------------------------- + data ipar1 /1/ + write (iout,99) + write (iout,97) title(2:72), key, type + 97 format(2x,' * ',a71,' *'/, + * 2x,' *',20x,'Key = ',a8,' , Type = ',a3,25x,' *') + if (.not. valued) write (iout,98) + 98 format(2x,' * No values provided - Information on pattern only', + * 23x,' *') +c--------------------------------------------------------------------- + nnz = ia(n+1)-ia(1) + sym = ((type(2:2) .eq. 'S') .or. (type(2:2) .eq. 'Z') + * .or. (type(2:2) .eq. 's') .or. (type(2:2) .eq. 'z')) +c + write (iout, 99) + write(iout, 100) n, nnz + job = 0 + if (valued) job = 1 + ipos = 1 + call csrcsc(n, job, ipos, a, ja, ia, ao, jao, iao) + call csrcsc(n, job, ipos, ao, jao, iao, a, ja, ia) +c------------------------------------------------------------------- +c computing max bandwith, max number of nonzero elements per column +c min nonzero elements per column/row, row/column diagonal dominance +c occurences, average distance of an element from diagonal, number of +c elemnts in lower and upper parts, ... +c------------------------------------------------------------------ +c jao will be modified later, so we call skyline here + call skyline(n,sym,ja,ia,jao,iao,nsky) + call nonz_lud(n,ja,ia,nlower, nupper, ndiag) + call avnz_col(n,ja,ia,iao, ndiag, av, st) +c------ write out info ---------------------------------------------- + if (sym) nupper = nlower + write(iout, 101) av, st + if (nlower .eq. 0 ) write(iout, 105) + 1 if (nupper .eq. 0) write(iout, 106) + write(iout, 107) nlower + write(iout, 108) nupper + write(iout, 109) ndiag +c + call nonz(n,sym, ja, ia, iao, nzmaxc, nzminc, + * nzmaxr, nzminr, nzcol, nzrow) + write(iout, 1020) nzmaxc, nzminc +c + if (.not. sym) write(iout, 1021) nzmaxr, nzminr +c + if (nzcol .ne. 0) write(iout,116) nzcol + if (nzrow .ne. 0) write(iout,115) nzrow +c + call diag_domi(n,sym,valued,a, ja,ia,ao, jao, iao, + * ddomc, ddomr) +c----------------------------------------------------------------------- +c symmetry and near symmetry - Frobenius norms +c----------------------------------------------------------------------- + call frobnorm(n,sym,a,ja,ia,Fnorm) + call ansym(n,sym,a,ja,ia,ao,jao,iao,imatch,av,fas,fan) + call distaij(n,nnz,sym,ja,ia,dist, std) + amx = 0.0d0 + do 40 k=1, nnz + amx = max(amx, abs(a(k)) ) + 40 continue + write (iout,103) imatch, av, dist, std + write(iout,96) + if (valued) then + write(iout,104) Fnorm, fas, fan, amx, ddomr, ddomc + write (iout,96) + endif +c----------------------------------------------------------------------- +c--------------------bandedness- main diagonals ----------------------- - +c----------------------------------------------------------------------- + n2 = n+n-1 + do 8 i=1, n2 + jao(i) = 0 + 8 continue + do 9 i=1, n + k1 = ia(i) + k2 = ia(i+1) -1 + do 91 k=k1, k2 + j = ja(k) + jao(n+i-j) = jao(n+i-j) +1 + 91 continue + 9 continue +c + call bandwidth(n,ja, ia, ml, mu, iband, bndav) +c +c write bandwidth information . +c + write(iout,117) ml, mu, iband, bndav +c + write(iout,1175) nsky +c +c call percentage_matrix(n,nnz,ja,ia,jao,90,jb2) +c call percentage_matrix(n,nnz,ja,ia,jao,80,jb1) + nrow = n + ncol = n + call distdiag(nrow,ncol,ja,ia,jao) + call bandpart(n,ja,ia,jao,90,jb2) + call bandpart(n,ja,ia,jao,80,jb1) + write (iout,112) 2*jb2+1, 2*jb1+1 +c----------------------------------------------------------------- + nzdiag = 0 + n2 = n+n-1 + do 42 i=1, n2 + if (jao(i) .ne. 0) nzdiag=nzdiag+1 + 42 continue + call n_imp_diag(n,nnz,jao,ipar1, ndiag,ioff,dcount) + write (iout,118) nzdiag + write (tmpst,'(10i6)') (ioff(j),j=1,ndiag) + write (iout,110) ndiag,tmpst + write (tmpst,'(10f6.1)')(dcount(j), j=1,ndiag) + write (iout,111) tmpst + write (iout, 96) +c jump to next page -- optional // +c write (iout,'(1h1)') +c----------------------------------------------------------------------- +c determine block size if matrix is a block matrix.. +c----------------------------------------------------------------------- + call blkfnd(n, ja, ia, nblk) + if (nblk .le. 1) then + write(iout,113) + else + write(iout,114) nblk + endif + write (iout,96) +c +c---------- done. Next define all the formats -------------------------- +c + 99 format (2x,38(2h *)) + 96 format (6x,' *',65(1h-),'*') +c----------------------------------------------------------------------- + 100 format( + * 6x,' * Dimension N = ', + * i10,' *'/ + * 6x,' * Number of nonzero elements = ', + * i10,' *') + 101 format( + * 6x,' * Average number of nonzero elements/Column = ', + * f10.4,' *'/ + * 6x,' * Standard deviation for above average = ', + * f10.4,' *') +c----------------------------------------------------------------------- + 1020 format( + * 6x,' * Weight of longest column = ', + * i10,' *'/ + * 6x,' * Weight of shortest column = ', + * i10,' *') + 1021 format( + * 6x,' * Weight of longest row = ', + * i10,' *'/ + * 6x,' * Weight of shortest row = ', + * i10,' *') + 117 format( + * 6x,' * Lower bandwidth (max: i-j, a(i,j) .ne. 0) = ', + * i10,' *'/ + * 6x,' * Upper bandwidth (max: j-i, a(i,j) .ne. 0) = ', + * i10,' *'/ + * 6x,' * Maximum Bandwidth = ', + * i10,' *'/ + * 6x,' * Average Bandwidth = ', + * e10.3,' *') + 1175 format( + * 6x,' * Number of nonzeros in skyline storage = ', + * i10,' *') + 103 format( + * 6x,' * Matching elements in symmetry = ', + * i10,' *'/ + * 6x,' * Relative Symmetry Match (symmetry=1) = ', + * f10.4,' *'/ + * 6x,' * Average distance of a(i,j) from diag. = ', + * e10.3,' *'/ + * 6x,' * Standard deviation for above average = ', + * e10.3,' *') + 104 format( + * 6x,' * Frobenius norm of A = ', + * e10.3,' *'/ + * 6x,' * Frobenius norm of symmetric part = ', + * e10.3,' *'/ + * 6x,' * Frobenius norm of nonsymmetric part = ', + * e10.3,' *'/ + * 6x,' * Maximum element in A = ', + * e10.3,' *'/ + * 6x,' * Percentage of weakly diagonally dominant rows = ', + * e10.3,' *'/ + * 6x,' * Percentage of weakly diagonally dominant columns = ', + * e10.3,' *') + 105 format( + * 6x,' * The matrix is lower triangular ... ',21x,' *') + 106 format( + * 6x,' * The matrix is upper triangular ... ',21x,' *') + 107 format( + * 6x,' * Nonzero elements in strict lower part = ', + * i10,' *') + 108 format( + * 6x,' * Nonzero elements in strict upper part = ', + * i10,' *') + 109 format( + * 6x,' * Nonzero elements in main diagonal = ', + * i10,' *') + 110 format(6x,' * The ', i2, ' most important', + * ' diagonals are (offsets) : ',10x,' *',/, + * 6x,' *',a61,3x,' *') + 111 format(6x,' * The accumulated percentages they represent are ', + * ' : ', 10x,' *',/, + * 6x,' *',a61,3x,' *') +c 111 format( +c * 6x,' * They constitute the following % of A = ', +c * f8.1,' % *') + 112 format( + * 6x,' * 90% of matrix is in the band of width = ', + * i10,' *',/, + * 6x,' * 80% of matrix is in the band of width = ', + * i10,' *') + 113 format( + * 6x,' * The matrix does not have a block structure ',19x, + * ' *') + 114 format( + * 6x,' * Block structure found with block size = ', + * i10,' *') + 115 format( + * 6x,' * There are zero rows. Number of such rows = ', + * i10,' *') + 116 format( + * 6x,' * There are zero columns. Number of such columns = ', + * i10,' *') + 118 format( + * 6x,' * The total number of nonvoid diagonals is = ', + * i10,' *') +c-------------------------- end of dinfo -------------------------- + return + end diff --git a/INFO/info.saylr1 b/INFO/info.saylr1 new file mode 100644 index 0000000..5f301b0 --- /dev/null +++ b/INFO/info.saylr1 @@ -0,0 +1,42 @@ + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * unsymmetric matrix of paul saylor - 14 by 17 2d grid may, 1983 * + * Key = saylr1 , Type = rua * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Dimension N = 238 * + * Number of nonzero elements = 1128 * + * Average number of nonzero elements/Column = 4.7395 * + * Standard deviation for above average = 0.4757 * + * Nonzero elements in strict lower part = 445 * + * Nonzero elements in strict upper part = 445 * + * Nonzero elements in main diagonal = 238 * + * Weight of longest column = 5 * + * Weight of shortest column = 3 * + * Weight of longest row = 5 * + * Weight of shortest row = 3 * + * Matching elements in symmetry = 1128 * + * Relative Symmetry Match (symmetry=1) = 1.0000 * + * Average distance of a(i,j) from diag. = 0.595E+01 * + * Standard deviation for above average = 0.654E+01 * + *-----------------------------------------------------------------* + * Frobenius norm of A = 0.886E+09 * + * Frobenius norm of symmetric part = 0.991E+09 * + * Frobenius norm of nonsymmetric part = 0.443E+09 * + * Maximum element in A = 0.306E+09 * + * Percentage of weakly diagonally dominant rows = 0.761E+00 * + * Percentage of weakly diagonally dominant columns = 0.744E+00 * + *-----------------------------------------------------------------* + * Lower bandwidth (max: i-j, a(i,j) .ne. 0) = 14 * + * Upper bandwidth (max: j-i, a(i,j) .ne. 0) = 14 * + * Maximum Bandwidth = 29 * + * Average Bandwidth = 0.275E+02 * + * Number of nonzeros in skyline storage = 6536 * + * 90% of matrix is in the band of width = 27 * + * 80% of matrix is in the band of width = 27 * + * The total number of nonvoid diagonals is = 5 * + * The 5 most important diagonals are (offsets) : * + * 0 14 -14 1 -1 * + * The accumulated percentages they represent are : * + * 21.1 41.0 60.8 80.4 100.0 * + *-----------------------------------------------------------------* + * The matrix does not have a block structure * + *-----------------------------------------------------------------* diff --git a/INFO/infofun.f b/INFO/infofun.f new file mode 100644 index 0000000..85b4c7f --- /dev/null +++ b/INFO/infofun.f @@ -0,0 +1,800 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c INFORMATION ROUTINES. INFO MODULE c +c----------------------------------------------------------------------c +c bandwidth : Computes ml = lower_bandwidth(A) c +c mu = upper_bandwidth(A) c +c iband = max_bandwidth(A) c +c bndav = average_bandwidth(A) c +c nonz : Computes nzmaxc = max_column_length(A) c +c nzminc = min_column_length(A) c +c nzmaxr = max_row_length(A) c +c nzminr = min_row_length(A) c +c nzcol = zero_column_number(A) c +c nzrow = zero_row_number(A) c +c diag_domi : Computes ddomc = diag_domi_column_percentage(A) c +c ddomr = diag_domi_row_percentage(A) c +c frobnorm : Computes Fnorm = Frobenius_norm(A) c +c ansym : Computes fas = sym_part_Frobenius_norm(A) c +c fan = nonsym_part_Frobenius_norm(A) c +c imatch = matching_elements_number(A) c +c av = relative_sym_match(A) c +c distaij : Computes dist = average_dist_of_a(i,j)(A) c +c std = standard_deviation(A) c +c skyline : Computes nsky = nonzero_number_in_skyline(A) c +c distdiag : Computes dist = element_number_in_eachdiag(A) c +c bandpart : Computes band = bandwidth_width(A) c +c n_imp_diag: Computes ndiag = important_diag_number(A) c +c nonz_lud : Computes nlower = nonzero_number_of_lower_part(A) c +c nupper = nonzero_number_of_upper_part(A) c +c ndiag = nonzero_number_of_maindiag(A) c +c avnz_col : Computes av = average_nonzero_number_in_column(A) c +c st = standard_deviation(A) c +c vbrinfo : Print info on matrix in variable block row format c +c----------------------------------------------------------------------c + subroutine bandwidth(n,ja, ia, ml, mu, iband, bndav) + implicit none + integer n, ml, mu, iband + integer ja(*), ia(n+1) + real*8 bndav +c----------------------------------------------------------------------- +c this routine computes the lower, upper, maximum, and average +c bandwidths. revised -- July 12, 2001 -- bug fix -- YS. +c----------------------------------------------------------------------- +c On Entry: +c---------- +c n = integer. column dimension of matrix +c a = real array containing the nonzero elements of the matrix +c the elements are stored by columns in order +c (i.e. column i comes before column i+1, but the elements +c within each column can be disordered). +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c +c on return +c---------- +c ml = lower bandwidth as defined by +c ml = max(i-j | all a(i,j).ne. 0) +c mu = upper bandwidth as defined by +c mu = max ( j-i | all a(i,j).ne. 0 ) +c iband = maximum bandwidth as defined by +c iband = Max ( Max [ j | a(i,j) .ne. 0 ] - +c Min [ j | a(i,j) .ne. 0 ] ) +c bndav = Average Bandwidth +c----------------------------------------------------------------------- +c locals + integer max + integer j0, j1, jminc, jmaxc, i +c----------------------------------------------------------------------- + ml = -n + mu = -n + bndav = 0.0d0 + iband = 0 + do 10 i=1,n + j0 = ia(i) + j1 = ia(i+1) - 1 + jminc = ja(j0) + jmaxc = ja(j1) + ml = max(ml,i-jminc) + mu = max(mu,jmaxc-i) + iband = max(iband,jmaxc-jminc+1) + bndav = bndav+real( jmaxc-jminc+1) + 10 continue + bndav = bndav/real(n) + return +c-----end-of-bandwidth-------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine nonz(n,sym, ja, ia, iao, nzmaxc, nzminc, + * nzmaxr, nzminr, nzcol, nzrow) + implicit none + integer n , nzmaxc, nzminc, nzmaxr, nzminr, nzcol, nzrow + integer ja(*), ia(n+1), iao(n+1) + logical sym +c---------------------------------------------------------------------- +c this routine computes maximum numbers of nonzero elements +c per column/row, minimum numbers of nonzero elements per column/row, +c and numbers of zero columns/rows. +c---------------------------------------------------------------------- +c On Entry: +c---------- +c n = integer column dimension of matrix +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c iao = similar array for the transpose of the matrix. +c sym = logical variable indicating whether or not the matrix is +c stored in symmetric mode. +c on return +c---------- +c nzmaxc = max length of columns +c nzminc = min length of columns +c nzmaxr = max length of rows +c nzminr = min length of rows +c nzcol = number of zero columns +c nzrow = number of zero rows +c----------------------------------------------------------------------- + integer i, j0, j0r, j1r, indiag, k, j1, lenc, lenr +c + nzmaxc = 0 + nzminc = n + nzmaxr = 0 + nzminr = n + nzcol = 0 + nzrow = 0 +c----------------------------------------------------------------------- + do 10 i = 1, n + j0 = ia(i) + j1 = ia(i+1) + j0r = iao(i) + j1r = iao(i+1) + indiag = 0 + do 20 k=j0, j1-1 + if (ja(k) .eq. i) indiag = 1 + 20 continue +c + lenc = j1-j0 + lenr = j1r-j0r +c + if (sym) lenc = lenc + lenr - indiag + if (lenc .le. 0) nzcol = nzcol +1 + nzmaxc = max0(nzmaxc,lenc) + nzminc = min0(nzminc,lenc) + if (lenr .le. 0) nzrow = nzrow+1 + nzmaxr = max0(nzmaxr,lenr) + nzminr = min0(nzminr,lenr) + 10 continue + return + end +c----------------------------------------------------------------------- + subroutine diag_domi(n,sym,valued,a, ja,ia,ao,jao, iao, + * ddomc, ddomr) + implicit none + real*8 a(*), ao(*), ddomc, ddomr + integer n, ja(*), ia(n+1), jao(*), iao(n+1) + logical sym, valued +c----------------------------------------------------------------- +c this routine computes the percentage of weakly diagonally +c dominant rows/columns +c----------------------------------------------------------------- +c on entry: +c --------- +c n = integer column dimension of matrix +c a = real array containing the nonzero elements of the matrix +c the elements are stored by columns in order +c (i.e. column i comes before column i+1, but the elements +c within each column can be disordered). +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c ao = real array containing the nonzero elements of the matrix +c the elements are stored by rows in order +c (i.e. row i comes before row i+1, but the elements +c within each row can be disordered). +c ao,jao, iao, +c structure for transpose of a +c sym = logical variable indicating whether or not the matrix is +c symmetric. +c valued= logical equal to .true. if values are provided and .false. +c if only the pattern of the matrix is provided. (in that +c case a(*) and ao(*) are dummy arrays. +c +c ON RETURN +c---------- +c ddomc = percentage of weakly diagonally dominant columns +c ddomr = percentage of weakly diagonally dominant rows +c------------------------------------------------------------------- +c locals + integer i, j0, j1, k, j + real*8 aii, dsumr, dsumc +c number of diagonally dominant columns +c real arithmetic used to avoid problems.. YS. 03/27/01 + ddomc = 0.0 +c number of diagonally dominant rows + ddomr = 0.0 + do 10 i = 1, n + j0 = ia(i) + j1 = ia(i+1) - 1 + if (valued) then + aii = 0.0d0 + dsumc = 0.0d0 + do 20 k=j0,j1 + j = ja(k) + if (j .eq. i) then + aii = abs(a(k)) + else + dsumc = dsumc + abs(a(k)) + endif + 20 continue + dsumr = 0.0d0 + if (.not. sym) then + do 30 k=iao(i), iao(i+1)-1 + if (jao(k) .ne. i) dsumr = dsumr+abs(ao(k)) + 30 continue + else + dsumr = dsumc + endif + if (dsumc .le. aii) ddomc = ddomc + 1.0 + if (dsumr .le. aii) ddomr = ddomr + 1.0 + endif + 10 continue + ddomr = ddomr / real(n) + ddomc = ddomc / real(n) + return +c----------------------------------------------------------------------- +c--------end-of-diag_moni----------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine frobnorm(n,sym,a,ja,ia,Fnorm) + implicit none + integer n + real*8 a(*),Fnorm + integer ja(*),ia(n+1) + logical sym +c-------------------------------------------------------------------------- +c this routine computes the Frobenius norm of A. +c-------------------------------------------------------------------------- +c on entry: +c----------- +c n = integer colum dimension of matrix +c a = real array containing the nonzero elements of the matrix +c the elements are stored by columns in order +c (i.e. column i comes before column i+1, but the elements +c within each column can be disordered). +c ja = integer array containing the row indices of elements in a. +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and +c ja. It is assumed that ia(*)= 1 and ia(n+1) = nnz +1. +c sym = logical variable indicating whether or not the matrix is +c symmetric. +c +c on return +c----------- +c Fnorm = Frobenius norm of A. +c-------------------------------------------------------------------------- + real*8 Fdiag + integer i, k + Fdiag = 0.0 + Fnorm = 0.0 + do i =1,n + do k = ia(i), ia(i+1)-1 + if (ja(k) .eq. i) then + Fdiag = Fdiag + a(k)**2 + else + Fnorm = Fnorm + a(k)**2 + endif + enddo + enddo + if (sym) then + Fnorm = 2*Fnorm +Fdiag + else + Fnorm = Fnorm + Fdiag + endif + Fnorm = sqrt(Fnorm) + return + end +c---------------------------------------------------------------------- + subroutine ansym(n,sym,a,ja,ia,ao,jao,iao,imatch, + * av,fas,fan) +c--------------------------------------------------------------------- +c this routine computes the Frobenius norm of the symmetric and +c non-symmetric parts of A, computes number of matching elements +c in symmetry and relative symmetry match. +c--------------------------------------------------------------------- +c on entry: +c---------- +c n = integer column dimension of matrix +c a = real array containing the nonzero elements of the matrix +c the elements are stored by columns in order +c (i.e. column i comes before column i+1, but the elements +c within each column can be disordered). +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c sym = logical variable indicating whether or not the matrix is +c symmetric. +c on return +c---------- +c fas = Frobenius norm of symmetric part +c fan = Frobenius norm of non-symmetric part +c imatch = number of matching elements in symmetry +c av = relative symmetry match (symmetry = 1) +c ao,jao,iao = transpose of A just as a, ja, ia contains +c information of A. +c----------------------------------------------------------------------- + implicit real*8 (a-h, o-z) + real*8 a(*),ao(*),fas,fan,av, Fnorm, st + integer n, ja(*), ia(n+1), jao(*), iao(n+1),imatch + logical sym +c----------------------------------------------------------------------- + nnz = ia(n+1)-ia(1) + call csrcsc(n,1,1,a,ja,ia,ao,jao,iao) + if (sym) goto 7 + st = 0.0d0 + fas = 0.0d0 + fan = 0.0d0 + imatch = 0 + do 6 i=1,n + k1 = ia(i) + k2 = iao(i) + k1max = ia(i+1) - 1 + k2max = iao(i+1) - 1 +c + 5 if (k1 .gt. k1max .or. k2 .gt. k2max) goto 6 +c + j1 = ja(k1) + j2 = jao(k2) + if (j1 .ne. j2 ) goto 51 + fas = fas + (a(k1)+ao(k2))**2 + fan = fan + (a(k1)-ao(k2))**2 + st = st + a(k1)**2 + imatch = imatch + 1 + 51 k1 = k1+1 + k2 = k2+1 + if (j1 .lt. j2) k2 = k2 - 1 + if (j1 .gt. j2) k1 = k1 - 1 + goto 5 + 6 continue + fas = 0.25D0 * fas + fan = 0.25D0 * fan + 7 call frobnorm(n,sym,ao,jao,iao,Fnorm) + if (sym) then + imatch = nnz + fas = Fnorm + fan = 0.0d0 + else + if (imatch.eq.nnz) then + st = 0.0D0 + else + st = 0.5D0 * (Fnorm**2 - st) + if (st.lt.0.0D0) st = 0.0D0 + endif + fas = sqrt(fas + st) + fan = sqrt(fan + st) + endif + av = real(imatch)/real(nnz) + return + end +c------end-of-ansym----------------------------------------------------- +c----------------------------------------------------------------------- + subroutine distaij(n,nnz,sym,ja,ia,dist, std) + implicit real*8 (a-h, o-z) + real*8 dist, std + integer ja(*), ia(n+1) +c----------------------------------------------------------------------- +c this routine computes the average distance of a(i,j) from diag and +c standard deviation for this average. +c----------------------------------------------------------------------- +c On entry : +c----------- +c n = integer. column dimension of matrix +c nnz = number of nonzero elements of matrix +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c sym = logical variable indicating whether or not the matrix is +c symmetric. +c on return +c---------- +c dist = average distance of a(i,j) from diag. +c std = standard deviation for above average. +c----------------------------------------------------------------------- +c +c distance of an element from diagonal. +c + dist = 0.0 + std = 0.0 + do 3 i=1,n + j0 = ia(i) + j1 = ia(i+1) - 1 + do 31 k=j0, j1 + j=ja(k) + dist = dist + real(iabs(j-i) ) + 31 continue + 3 continue + dist = dist/real(nnz) + do 6 i = 1, n + do 61 k=ia(i), ia(i+1) - 1 + std=std+(dist-real(iabs(ja(k)-i)))**2 + 61 continue + 6 continue + std = sqrt(std/ real(nnz)) + return + end +c----------------------------------------------------------------------- + subroutine skyline(n,sym,ja,ia,jao,iao,nsky) + implicit real*8 (a-h, o-z) + integer n, ja(*), ia(n+1), jao(*), iao(n+1) + integer nskyl, nskyu, nsky + logical sym +c------------------------------------------------------------------- +c this routine computes the number of nonzeros in the skyline storage. +c------------------------------------------------------------------- +c +c On entry : +c----------- +c n = integer. column dimension of matrix +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c iao = integer array containing of length n+1 containing the +c pointers to the beginning of the rows in arrays ao and jao. +c It is assumed that iao(*) = 1 and iao(n+1) = nzz+1. +c jao = integer array containing the column indices of elements in ao. +c sym = logical variable indicating whether or not the matrix is +c symmetric. +c on return +c---------- +c nsky = number of nonzeros in skyline storage +c------------------------------------------------------------------- +c +c nskyu = skyline storage for upper part + nskyu = 0 +c nskyl = skyline storage for lower part + nskyl = 0 + do 10 i=1,n + j0 = ia(i) + j0r = iao(i) + + jminc = ja(j0) + jminr = jao(j0r) + if (sym) jminc = jminr + + nskyl = nskyl + i-jminr + 1 + nskyu = nskyu + i-jminc + 1 + + 10 continue + nsky = nskyl+nskyu-n + if (sym) nsky = nskyl + return + end +c----------------------------------------------------------------------- + subroutine distdiag(nrow,ncol,ja,ia,dist) + implicit real*8 (a-h, o-z) + integer nrow,ncol,ja(*), ia(nrow+1),dist(*) +c---------------------------------------------------------------------- +c this routine computes the numbers of elements in each diagonal. +c---------------------------------------------------------------------- +c On entry : +c----------- +c nrow = integer. row dimension of matrix +c ncol = integer. column dimension of matrix +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c on return +c---------- +c dist = integer array containing the numbers of elements in each of +c the nrow+ncol-1 diagonals of A. dist(k) contains the +c number of elements in diagonal '-nrow+k'. k ranges from +c 1 to (nrow+ncol-1). +c---------------------------------------------------------------------- + nnz = ia(nrow+1)-ia(1) + n2 = nrow+ncol-1 + do 8 i=1, n2 + dist(i) = 0 + 8 continue + do 9 i=1, nrow + k1 = ia(i) + k2 = ia(i+1) -1 + do 91 k=k1, k2 + j = ja(k) + dist(nrow+j-i) = dist(nrow+j-i) +1 + 91 continue + 9 continue + return + end +c----------------------------------------------------------------------- + subroutine bandpart(n,ja,ia,dist,nper,band) + implicit real*8 (a-h, o-z) + integer n,ja(*), ia(n+1),dist(*) + integer nper,band +c------------------------------------------------------------------------- +c this routine computes the bandwidth of the banded matrix, which contains +c 'nper' percent of the original matrix. +c------------------------------------------------------------------------- +c On entry : +c----------- +c n = integer. column dimension of matrix +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c dist = integer array containing the numbers of elements in the +c matrix with different distance of row indices and column +c indices. +c nper = percentage of matrix within the bandwidth +c on return +c---------- +c band = the width of the bandwidth +c---------------------------------------------------------------------- + nnz = ia(n+1)-ia(1) + iacc = dist(n) + band = 0 + j = 0 + 10 j = j+1 + iacc = iacc + dist(n+j) +dist(n-j) + if (iacc*100 .le. nnz*nper) then + band = band +1 + goto 10 + endif + return + end +c----------------------------------------------------------------------- + subroutine n_imp_diag(n,nnz,dist, ipar1,ndiag,ioff,dcount) + implicit real*8 (a-h, o-z) + real*8 dcount(*) + integer n,nnz, dist(*), ndiag, ioff(*), ipar1 +c----------------------------------------------------------------------- +c this routine computes the most important diagonals. +c----------------------------------------------------------------------- +c +c On entry : +c----------- +c n = integer. column dimension of matrix +c nnz = number of nonzero elements of matrix +c dist = integer array containing the numbers of elements in the +c matrix with different distance of row indices and column +c indices. ipar1 = percentage of nonzero elements of A that +c a diagonal should have in order to be an important diagonal +c on return +c---------- +c ndiag = number of the most important diagonals +c ioff = the offsets with respect to the main diagonal +c dcount= the accumulated percentages +c----------------------------------------------------------------------- + n2 = n+n-1 + ndiag = 10 + ndiag = min0(n2,ndiag) + itot = 0 + ii = 0 + idiag = 0 +c sort diagonals by decreasing order of weights. + 40 jmax = 0 + i = 1 + do 41 k=1, n2 + j = dist(k) + if (j .lt. jmax) goto 41 + i = k + jmax = j + 41 continue +c permute ---- +c save offsets and accumulated count if diagonal is acceptable +c (if it has at least ipar1*nnz/100 nonzero elements) +c quite if no more acceptable diagonals -- +c + if (jmax*100 .lt. ipar1*nnz) goto 4 + ii = ii+1 + ioff(ii) = i-n + dist(i) = - jmax + itot = itot + jmax + dcount(ii) = real(100*itot)/real(nnz) + if (ii .lt. ndiag) goto 40 + 4 continue + ndiag = ii + return +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine nonz_lud(n,ja,ia,nlower, nupper, ndiag) + implicit real*8 (a-h, o-z) + integer n, ja(*), ia(n+1) + integer nlower, nupper, ndiag +c----------------------------------------------------------------------- +c this routine computes the number of nonzero elements in strict lower +c part, strict upper part, and main diagonal. +c----------------------------------------------------------------------- +c +c On entry : +c----------- +c n = integer. column dimension of matrix +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c on return +c---------- +c nlower= number of nonzero elements in strict lower part +c nupper= number of nonzero elements in strict upper part +c ndiag = number of nonzero elements in main diagonal +c------------------------------------------------------------------- +c +c number of nonzero elements in upper part +c + nupper = 0 + ndiag = 0 + + do 3 i=1,n +c indiag = nonzero diagonal element indicator + do 31 k=ia(i), ia(i+1)-1 + j=ja(k) + if (j .lt. i) nupper = nupper+1 + if (j .eq. i) ndiag = ndiag + 1 + 31 continue + 3 continue + nlower = ia(n+1)-1-nupper-ndiag + return + end +c----------------------------------------------------------------------- + subroutine avnz_col(n,ja,ia,iao, ndiag, av, st) + implicit real*8 (a-h, o-z) + real*8 av, st + integer n, ja(*), ia(n+1), iao(n+1) +c--------------------------------------------------------------------- +c this routine computes average number of nonzero elements/column and +c standard deviation for this average +c--------------------------------------------------------------------- +c +c On entry : +c----------- +c n = integer. column dimension of matrix +c ja = integer array containing the row indices of elements in a +c ia = integer array containing of length n+1 containing the +c pointers to the beginning of the columns in arrays a and ja. +c It is assumed that ia(*) = 1 and ia(n+1) = nzz+1. +c ndiag = number of the most important diagonals +c On return +c---------- +c av = average number of nonzero elements/column +c st = standard deviation for this average +c Notes +c--------- +c standard deviation will not be correct for symmetric storage. +c---------------------------------------------------------------------- +c standard deviatioan for the average + st = 0.0d0 +c average and standard deviation +c + av = real(ia(n+1)-1)/real(n) +c +c will be corrected later. +c + do 3 i=1,n + j0 = ia(i) + j1 = ia(i+1) - 1 +c indiag = nonzero diagonal element indicator + do 31 k=j0, j1 + j=ja(k) + 31 continue + lenc = j1+1-j0 + st = st + (real(lenc) - av)**2 + 3 continue +c + st = sqrt( st / real(n) ) + return + end +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- + subroutine vbrinfo(nr, nc, kvstr, kvstc, ia, ja, ka, iwk, iout) +c----------------------------------------------------------------------- + integer nr, nc, kvstr(nr+1), kvstc(nc+1), ia(nr+1), ja(*), ka(*) + integer iwk(nr+nc+2+nr), iout +c----------------------------------------------------------------------- +c Print info on matrix in variable block row format. +c----------------------------------------------------------------------- +c On entry: +c-------------- +c nr,nc = matrix block row and block column dimension +c kvstr = first row number for each block row +c kvstc = first column number for each block column +c ia,ja,ka,a = input matrix in VBR format +c iout = unit number for printed output +c +c On return: +c--------------- +c Printed output to unit number specified in iout. If a non-square +c matrix is provided, the analysis will be performed on the block +c rows, otherwise a row/column conformal partitioning will be used. +c +c Work space: +c---------------- +c iwk(1:nb+1) = conformal block partitioning +c (nb is unknown at start but is no more than nr+nc) +c iwk(nb+2:nb+2+nr) = frequency of each blocksize +c The workspace is not assumed to be initialized to zero, nor is it +c left that way. +c +c----------------------------------------------------------------------- +c-----local variables + integer n, nb, nnz, nnzb, i, j, neq, max, num + character*101 tmpst + integer bsiz(10), freq(10) +c----------------------------------------------------------------------- + n = kvstr(nr+1)-1 + nnz = ka(ia(nr+1)) - ka(1) + nnzb = ia(nr+1) - ia(1) + write (iout, 96) + write (iout, 100) n, nnz, real(nnz)/real(n) + write (iout, 101) nr, nnzb, real(nnzb)/real(nr) +c-----if non-square matrix, do analysis on block rows, +c else do analysis on conformal partitioning + if (kvstr(nr+1) .ne. kvstc(nc+1)) then + write (iout, 103) + do i = 1, nr+1 + iwk(i) = kvstr(i) + enddo + nb = nr + else + call kvstmerge(nr, kvstr, nc, kvstc, nb, iwk) + if ((nr .ne. nc) .or. (nc .ne. nb)) write (iout, 104) nb + endif +c-----accumulate frequencies of each blocksize + max = 1 + iwk(1+nb+2) = 0 + do i = 1, nb + neq = iwk(i+1) - iwk(i) + if (neq .gt. max) then + do j = max+1, neq + iwk(j+nb+2) = 0 + enddo + max = neq + endif + iwk(neq+nb+2) = iwk(neq+nb+2) + 1 + enddo +c-----store largest 10 of these blocksizes + num = 0 + do i = max, 1, -1 + if ((iwk(i+nb+2) .ne. 0) .and. (num .lt. 10)) then + num = num + 1 + bsiz(num) = i + freq(num) = iwk(i+nb+2) + endif + enddo +c-----print information about blocksizes + write (iout, 109) num + write (tmpst,'(10i6)') (bsiz(j),j=1,num) + write (iout,110) num,tmpst + write (tmpst,'(10i6)') (freq(j),j=1,num) + write (iout,111) tmpst + write (iout, 96) +c----------------------------------------------------------------------- + 99 format (2x,38(2h *)) + 96 format (6x,' *',65(1h-),'*') + 100 format( + * 6x,' * Number of rows = ', + * i10,' *'/ + * 6x,' * Number of nonzero elements = ', + * i10,' *'/ + * 6x,' * Average number of nonzero elements/Row = ', + * f10.4,' *') + 101 format( + * 6x,' * Number of block rows = ', + * i10,' *'/ + * 6x,' * Number of nonzero blocks = ', + * i10,' *'/ + * 6x,' * Average number of nonzero blocks/Block row = ', + * f10.4,' *') + 103 format( + * 6x,' * Non-square matrix. ', + * ' *'/ + * 6x,' * Performing analysis on block rows. ', + * ' *') + 104 format( + * 6x,' * Non row-column conformal partitioning supplied. ', + * ' *'/ + * 6x,' * Using conformal partitioning. Number of bl rows = ', + * i10,' *') + 109 format( + * 6x,' * Number of different blocksizes = ', + * i10,' *') + 110 format(6x,' * The ', i2, ' largest dimension nodes', + * ' have dimension : ',10x,' *',/, + * 6x,' *',a61,3x,' *') + 111 format(6x,' * The frequency of nodes these ', + * 'dimensions are : ',10x,' *',/, + * 6x,' *',a61,3x,' *') +c--------------------------------- + return + end +c----------------------------------------------------------------------- +c-----------------------end-of-vbrinfo---------------------------------- diff --git a/INFO/makefile b/INFO/makefile new file mode 100644 index 0000000..8e1acac --- /dev/null +++ b/INFO/makefile @@ -0,0 +1,18 @@ +# +F77 = f77 +#F77 = cf77 +FFLAGS = -g -Wall + +FILES = rinfo1.o dinfo13.o +## needs library libskit.a in whatever machine version -- + +LIB = -L/project/darpa/lib/PC -lskit +##LIB = -L/project/darpa/lib/solaris -lskit + +info1.ex: $(FILES) + $(F77) -o info1.ex $(FILES) $(LIB) + +clean: + rm -f *.o *.ex core *.trace *~ + +.f.o : ; $(F77) $(FFLAGS) -c $*.f -o $*.o \ No newline at end of file diff --git a/INFO/rinfo1.f b/INFO/rinfo1.f new file mode 100644 index 0000000..9ebbc82 --- /dev/null +++ b/INFO/rinfo1.f @@ -0,0 +1,39 @@ + program info1 +c---------------------------------------------------------------------- +c usage info1.ex < HB_file +c +c where info1 is the executable generated by makefile, HB_file is a +c file containing a matrix stored in Harwell-Boeing matrices. +c Info1 will then dump the information into the standard output. +c +c To use with larger matrices, increase nmax and nzmax. +c---------------------------------------------------------------------- + implicit none + integer nmax, nzmax + parameter (nmax = 30000, nzmax = 800000) + integer ia(nmax+1),ia1(nmax+1),ja(nzmax),ja1(nzmax) + real*8 a(nzmax),a1(nzmax),rhs(1) + character title*72, type*3, key*8, guesol*2 + logical valued +c + integer job, iin, nrow,ncol,nnz,ierr, nrhs, iout +c-------------- + data iin /5/, iout/6/ +c-------------- + job = 2 + nrhs = 0 + call readmt (nmax,nzmax,job,iin,a,ja,ia, rhs, nrhs, + * guesol,nrow,ncol,nnz,title,key,type,ierr) +c---- if not readable return + if (ierr .ne. 0) then + write (iout,100) ierr + 100 format(' **ERROR: Unable to read matrix',/, + * ' Message returned fom readmt was ierr =',i3) + stop + endif + valued = (job .ge. 2) +c------- + call dinfo1(ncol,iout,a,ja,ia,valued,title,key,type,a1,ja1,ia1) +c--------------------end------------------------------------------------ +c----------------------------------------------------------------------- + end diff --git a/INFO/rinfoC.c b/INFO/rinfoC.c new file mode 100644 index 0000000..65253a4 --- /dev/null +++ b/INFO/rinfoC.c @@ -0,0 +1,104 @@ +#include +#include +#include + +#define readmtc readmtc_ +#define dinfo1 dinfo1_ + +#define max(a,b) (((a)>(b))?(a):(b)) + +void errexit( char *f_str, ... ) +{ + va_list argp; + char out1[256], out2[256]; + + va_start(argp, f_str); + vsprintf(out1, f_str, argp); + va_end(argp); + + sprintf(out2, "Error! %s\n", out1); + + fprintf(stdout, out2); + fflush(stdout); + + exit( -1 ); +} + +void *Malloc( int nbytes, char *msg ) +{ + void *ptr; + + if (nbytes == 0) + return NULL; + + ptr = (void *)malloc(nbytes); + if (ptr == NULL) + errexit( "Not enough mem for %s. Requested size: %d bytes", msg, nbytes ); + + return ptr; +} + +int main( int argc, char **argv ) +{ +/*---------------------------------------------------------------------- + * usage info1.ex HB_file + * + * where info1 is the executable generated by makefile, HB_file is a + * file containing a matrix stored in Harwell-Boeing matrices. + * Info1 will then dump the information into the standard output. + *--------------------------------------------------------------------*/ + int job, ncol, nrow, nnz, nrhs, ierr, valued = 0; + char guesol[3], title[73], key[9], type[4]; + int *ia = NULL, *ja = NULL, *ia1 = NULL, *ja1 = NULL; + double *a = NULL, *a1 = NULL, *rhs = NULL; + int tmp1, tmp2, maxnnz; + int iout = 6; + + if( argc < 2 ) { + printf( "usage: info1.ex HB_file\n" ); + return 0; + } + +/* find out size of Harwell-Boeing matrix ---------------------------*/ + job = 0; + tmp1 = tmp2 = 1; + readmtc( &tmp1, &tmp2, &job, argv[1], a, ja, ia, rhs, &nrhs, + guesol, &nrow, &ncol, &nnz, title, key, type, &ierr ); + if( ierr != 0 ) { + fprintf( stderr, "readhb: err in read matrix header = %d\n", ierr ); + exit(-1); + } +/* allocate space ---------------------------------------------------*/ + maxnnz = max( nnz, 2*ncol+1 ); + ia = (int *)Malloc( sizeof(int)*(ncol+1), "readhb" ); + ja = (int *)Malloc( sizeof(int)*nnz, "readhb" ); + a = (double *)Malloc( sizeof(double)*nnz, "readhb" ); + ia1 = (int *)Malloc( sizeof(int)*(ncol+1), "readhb" ); + ja1 = (int *)Malloc( sizeof(int)*maxnnz, "readhb" ); + a1 = (double *)Malloc( sizeof(double)*nnz, "readhb" ); +/* read matrix ------------------------------------------------------*/ + job = 2; + nrhs = 0; + tmp1 = ncol+1; + tmp2 = nnz; + readmtc( &tmp1, &tmp2, &job, argv[1], a, ja, ia, rhs, &nrhs, + guesol, &nrow, &ncol, &nnz, title, key, type, &ierr ); + if( ierr != 0 ) { + fprintf( stderr, "readhb: err in read matrix data = %d\n", ierr ); + exit(-1); + } + + if( job >= 2 ) valued = 1; + + dinfo1( &ncol, &iout, a, ja, ia, &valued, title, key, type, + a1, ja1, ia1 ); + + free( ia ); + free( ja ); + free( a ); + free( ia1 ); + free( ja1 ); + free( a1 ); + + return 0; +} diff --git a/INFO/saylr1 b/INFO/saylr1 new file mode 100644 index 0000000..0ed933c --- /dev/null +++ b/INFO/saylr1 @@ -0,0 +1,368 @@ +1unsymmetric matrix of paul saylor - 14 by 17 2d grid may, 1983 saylr1 + 363 24 113 226 0 +rua 238 238 1128 0 +(10i8) (10i8) (5e16.8) + 1 4 8 12 16 20 24 28 32 36 + 40 44 48 52 55 59 64 69 74 79 + 84 89 94 99 104 109 114 119 123 127 + 132 137 142 147 152 157 162 167 172 177 + 182 187 191 195 200 205 210 215 220 225 + 230 235 240 245 250 255 259 263 268 273 + 278 283 288 293 298 303 308 313 318 323 + 327 331 336 341 346 351 356 361 366 371 + 376 381 386 391 395 399 404 409 414 419 + 424 429 434 439 444 449 454 459 463 467 + 472 477 482 487 492 497 502 507 512 517 + 522 527 531 535 540 545 550 555 560 565 + 570 575 580 585 590 595 599 603 608 613 + 618 623 628 633 638 643 648 653 658 663 + 667 671 676 681 686 691 696 701 706 711 + 716 721 726 731 735 739 744 749 754 759 + 764 769 774 779 784 789 794 799 803 807 + 812 817 822 827 832 837 842 847 852 857 + 862 867 871 875 880 885 890 895 900 905 + 910 915 920 925 930 935 939 943 948 953 + 958 963 968 973 978 983 988 993 998 1003 + 1007 1011 1016 1021 1026 1031 1036 1041 1046 1051 + 1056 1061 1066 1071 1075 1078 1082 1086 1090 1094 + 1098 1102 1106 1110 1114 1118 1122 1126 1129 + 1 2 15 1 2 3 16 2 3 4 + 17 3 4 5 18 4 5 6 19 5 + 6 7 20 6 7 8 21 7 8 9 + 22 8 9 10 23 9 10 11 24 10 + 11 12 25 11 12 13 26 12 13 14 + 27 13 14 28 1 15 16 29 2 15 + 16 17 30 3 16 17 18 31 4 17 + 18 19 32 5 18 19 20 33 6 19 + 20 21 34 7 20 21 22 35 8 21 + 22 23 36 9 22 23 24 37 10 23 + 24 25 38 11 24 25 26 39 12 25 + 26 27 40 13 26 27 28 41 14 27 + 28 42 15 29 30 43 16 29 30 31 + 44 17 30 31 32 45 18 31 32 33 + 46 19 32 33 34 47 20 33 34 35 + 48 21 34 35 36 49 22 35 36 37 + 50 23 36 37 38 51 24 37 38 39 + 52 25 38 39 40 53 26 39 40 41 + 54 27 40 41 42 55 28 41 42 56 + 29 43 44 57 30 43 44 45 58 31 + 44 45 46 59 32 45 46 47 60 33 + 46 47 48 61 34 47 48 49 62 35 + 48 49 50 63 36 49 50 51 64 37 + 50 51 52 65 38 51 52 53 66 39 + 52 53 54 67 40 53 54 55 68 41 + 54 55 56 69 42 55 56 70 43 57 + 58 71 44 57 58 59 72 45 58 59 + 60 73 46 59 60 61 74 47 60 61 + 62 75 48 61 62 63 76 49 62 63 + 64 77 50 63 64 65 78 51 64 65 + 66 79 52 65 66 67 80 53 66 67 + 68 81 54 67 68 69 82 55 68 69 + 70 83 56 69 70 84 57 71 72 85 + 58 71 72 73 86 59 72 73 74 87 + 60 73 74 75 88 61 74 75 76 89 + 62 75 76 77 90 63 76 77 78 91 + 64 77 78 79 92 65 78 79 80 93 + 66 79 80 81 94 67 80 81 82 95 + 68 81 82 83 96 69 82 83 84 97 + 70 83 84 98 71 85 86 99 72 85 + 86 87 100 73 86 87 88 101 74 87 + 88 89 102 75 88 89 90 103 76 89 + 90 91 104 77 90 91 92 105 78 91 + 92 93 106 79 92 93 94 107 80 93 + 94 95 108 81 94 95 96 109 82 95 + 96 97 110 83 96 97 98 111 84 97 + 98 112 85 99 100 113 86 99 100 101 + 114 87 100 101 102 115 88 101 102 103 + 116 89 102 103 104 117 90 103 104 105 + 118 91 104 105 106 119 92 105 106 107 + 120 93 106 107 108 121 94 107 108 109 + 122 95 108 109 110 123 96 109 110 111 + 124 97 110 111 112 125 98 111 112 126 + 99 113 114 127 100 113 114 115 128 101 + 114 115 116 129 102 115 116 117 130 103 + 116 117 118 131 104 117 118 119 132 105 + 118 119 120 133 106 119 120 121 134 107 + 120 121 122 135 108 121 122 123 136 109 + 122 123 124 137 110 123 124 125 138 111 + 124 125 126 139 112 125 126 140 113 127 + 128 141 114 127 128 129 142 115 128 129 + 130 143 116 129 130 131 144 117 130 131 + 132 145 118 131 132 133 146 119 132 133 + 134 147 120 133 134 135 148 121 134 135 + 136 149 122 135 136 137 150 123 136 137 + 138 151 124 137 138 139 152 125 138 139 + 140 153 126 139 140 154 127 141 142 155 + 128 141 142 143 156 129 142 143 144 157 + 130 143 144 145 158 131 144 145 146 159 + 132 145 146 147 160 133 146 147 148 161 + 134 147 148 149 162 135 148 149 150 163 + 136 149 150 151 164 137 150 151 152 165 + 138 151 152 153 166 139 152 153 154 167 + 140 153 154 168 141 155 156 169 142 155 + 156 157 170 143 156 157 158 171 144 157 + 158 159 172 145 158 159 160 173 146 159 + 160 161 174 147 160 161 162 175 148 161 + 162 163 176 149 162 163 164 177 150 163 + 164 165 178 151 164 165 166 179 152 165 + 166 167 180 153 166 167 168 181 154 167 + 168 182 155 169 170 183 156 169 170 171 + 184 157 170 171 172 185 158 171 172 173 + 186 159 172 173 174 187 160 173 174 175 + 188 161 174 175 176 189 162 175 176 177 + 190 163 176 177 178 191 164 177 178 179 + 192 165 178 179 180 193 166 179 180 181 + 194 167 180 181 182 195 168 181 182 196 + 169 183 184 197 170 183 184 185 198 171 + 184 185 186 199 172 185 186 187 200 173 + 186 187 188 201 174 187 188 189 202 175 + 188 189 190 203 176 189 190 191 204 177 + 190 191 192 205 178 191 192 193 206 179 + 192 193 194 207 180 193 194 195 208 181 + 194 195 196 209 182 195 196 210 183 197 + 198 211 184 197 198 199 212 185 198 199 + 200 213 186 199 200 201 214 187 200 201 + 202 215 188 201 202 203 216 189 202 203 + 204 217 190 203 204 205 218 191 204 205 + 206 219 192 205 206 207 220 193 206 207 + 208 221 194 207 208 209 222 195 208 209 + 210 223 196 209 210 224 197 211 212 225 + 198 211 212 213 226 199 212 213 214 227 + 200 213 214 215 228 201 214 215 216 229 + 202 215 216 217 230 203 216 217 218 231 + 204 217 218 219 232 205 218 219 220 233 + 206 219 220 221 234 207 220 221 222 235 + 208 221 222 223 236 209 222 223 224 237 + 210 223 224 238 211 225 226 212 225 226 + 227 213 226 227 228 214 227 228 229 215 + 228 229 230 216 229 230 231 217 230 231 + 232 218 231 232 233 219 232 233 234 220 + 233 234 235 221 234 235 236 222 235 236 + 237 223 236 237 238 224 237 238 + -0.19315001E+02 0.19311001E+02 0.44227000E-02 0.19311001E+02 -0.38639999E+02 + 0.19311001E+02 0.17690999E-01 0.19311001E+02 -0.38693001E+02 0.19311001E+02 + 0.70762999E-01 0.19311001E+02 -0.38904999E+02 0.19311001E+02 0.28305000E+00 + 0.19311001E+02 -0.39755001E+02 0.19311001E+02 0.11322000E+01 0.19311001E+02 + -0.43155998E+02 0.19311001E+02 0.45289001E+01 0.19311001E+02 -0.56756001E+02 + 0.19311001E+02 0.18115000E+02 0.19311001E+02 -0.11116000E+03 0.19311001E+02 + 0.72461998E+02 0.19311001E+02 -0.32876999E+03 0.19311001E+02 0.28985001E+03 + 0.19311001E+02 -0.11992000E+04 0.19309999E+02 0.11593000E+04 0.19309999E+02 + -0.46805000E+04 0.19309000E+02 0.46370000E+04 0.19309000E+02 -0.18586000E+05 + 0.11061000E+02 0.18536000E+05 0.11060000E+02 -0.75788000E+05 0.19722000E+02 + 0.75689000E+05 0.19698999E+02 -0.41574000E+08 0.41579000E+08 0.44227000E-02 + -0.10241000E+04 0.10230000E+04 0.11876000E+01 0.17690999E-01 0.10230000E+04 + -0.20507000E+04 0.10230000E+04 0.47505999E+01 0.70762999E-01 0.10230000E+04 + -0.20650000E+04 0.10230000E+04 0.19002001E+02 0.28305000E+00 0.10230000E+04 + -0.21222000E+04 0.10230000E+04 0.76009003E+02 0.11322000E+01 0.10230000E+04 + -0.23511001E+04 0.10230000E+04 0.30404001E+03 0.45288000E+01 0.10230000E+04 + -0.32666001E+04 0.10230000E+04 0.12161000E+04 0.18115000E+02 0.10230000E+04 + -0.69286001E+04 0.10229000E+04 0.48646001E+04 0.72460999E+02 0.10229000E+04 + -0.21577000E+05 0.10230000E+04 0.19458000E+05 0.28984000E+03 0.10230000E+04 + -0.80170000E+05 0.10229000E+04 0.77833000E+05 0.11593000E+04 0.10229000E+04 + -0.31474000E+06 0.10229000E+04 0.31153000E+06 0.46368999E+04 0.10229000E+04 + -0.12527000E+07 0.10229000E+04 0.12460000E+07 0.18536000E+05 0.10229000E+04 + -0.50005000E+07 0.34723999E+03 0.49805000E+07 0.75682000E+05 0.34710001E+03 + -0.27150000E+08 0.13908000E+04 0.27075000E+08 0.41574000E+08 0.13891000E+04 + -0.90850000E+08 0.49273000E+08 0.11876000E+01 -0.19842000E+03 0.19612000E+03 + 0.11083000E+01 0.47505002E+01 0.19612000E+03 -0.40142999E+03 0.19612000E+03 + 0.44330001E+01 0.19002001E+02 0.19612000E+03 -0.42898001E+03 0.19612000E+03 + 0.17732000E+02 0.76008003E+02 0.19612000E+03 -0.53917999E+03 0.19612000E+03 + 0.70928001E+02 0.30403000E+03 0.19612000E+03 -0.97998999E+03 0.19612000E+03 + 0.28370999E+03 0.12161000E+04 0.19612000E+03 -0.27432000E+04 0.19612000E+03 + 0.11348000E+04 0.48645000E+04 0.19612000E+03 -0.97962002E+04 0.19612000E+03 + 0.45393999E+04 0.19458000E+05 0.19612000E+03 -0.38008000E+05 0.19612000E+03 + 0.18158000E+05 0.77832000E+05 0.19612000E+03 -0.15086000E+06 0.19612000E+03 + 0.72630000E+05 0.31152000E+06 0.19612000E+03 -0.60243000E+06 0.19612000E+03 + 0.29051000E+06 0.12460000E+07 0.19612000E+03 -0.24083000E+07 0.19611000E+03 + 0.11619000E+07 0.49805000E+07 0.19610001E+03 -0.96025000E+07 0.19986000E+03 + 0.46215000E+07 0.27072000E+08 0.19977000E+03 -0.52340000E+08 0.26682999E+03 + 0.25265000E+08 0.49269000E+08 0.26651001E+03 -0.20234000E+09 0.15307000E+09 + 0.11082000E+01 -0.61428001E+02 0.59667999E+02 0.65183997E+00 0.44330001E+01 + 0.59667999E+02 -0.12638000E+03 0.59667000E+02 0.26073999E+01 0.17732000E+02 + 0.59667000E+02 -0.14750000E+03 0.59667000E+02 0.10429000E+02 0.70928001E+02 + 0.59667000E+02 -0.23198000E+03 0.59667000E+02 0.41717999E+02 0.28370999E+03 + 0.59667000E+02 -0.56991998E+03 0.59667000E+02 0.16687000E+03 0.11348000E+04 + 0.59667000E+02 -0.19217000E+04 0.59667999E+02 0.66747998E+03 0.45393999E+04 + 0.59667999E+02 -0.73287002E+04 0.59667000E+02 0.26698999E+04 0.18158000E+05 + 0.59667000E+02 -0.28957000E+05 0.59667999E+02 0.10680000E+05 0.72630000E+05 + 0.59667999E+02 -0.11547000E+06 0.59667000E+02 0.42719000E+05 0.29051000E+06 + 0.59667000E+02 -0.46144000E+06 0.59645000E+02 0.17081000E+06 0.11619000E+07 + 0.59645000E+02 -0.18448000E+07 0.59602001E+02 0.68272000E+06 0.46215000E+07 + 0.59601002E+02 -0.73360000E+07 0.60827999E+02 0.27143000E+07 0.25264000E+08 + 0.60799999E+02 -0.40130000E+08 0.81210999E+02 0.14866000E+08 0.15306000E+09 + 0.81112999E+02 -0.30614000E+09 0.15307000E+09 0.65183997E+00 -0.60994999E+02 + 0.59561001E+02 0.78232998E+00 0.26073000E+01 0.59561001E+02 -0.12486000E+03 + 0.59561001E+02 0.31293001E+01 0.10429000E+02 0.59561001E+02 -0.14207001E+03 + 0.59561001E+02 0.12517000E+02 0.41717999E+02 0.59561001E+02 -0.21091000E+03 + 0.59561001E+02 0.50069000E+02 0.16687000E+03 0.59561001E+02 -0.48626999E+03 + 0.59561001E+02 0.20028000E+03 0.66747998E+03 0.59561001E+02 -0.15877000E+04 + 0.59561001E+02 0.80109998E+03 0.26698999E+04 0.59561001E+02 -0.59935000E+04 + 0.59561001E+02 0.32043999E+04 0.10680000E+05 0.59561001E+02 -0.23616000E+05 + 0.59561001E+02 0.12818000E+05 0.42719000E+05 0.59561001E+02 -0.94109000E+05 + 0.59561001E+02 0.51271000E+05 0.17081000E+06 0.59561001E+02 -0.37593000E+06 + 0.59539001E+02 0.20500000E+06 0.68272000E+06 0.59539001E+02 -0.15022000E+07 + 0.59495998E+02 0.81940000E+06 0.27143000E+07 0.59494999E+02 -0.59721000E+07 + 0.60830002E+02 0.32577000E+07 0.14865000E+08 0.60801998E+02 -0.32739000E+08 + 0.81213997E+02 0.17875000E+08 0.15307000E+09 0.81115997E+02 -0.21674000E+09 + 0.63673000E+08 0.78232002E+00 -0.66882001E+03 0.66802002E+03 0.10723000E-01 + 0.31293001E+01 0.66802002E+03 -0.13392000E+04 0.66802002E+03 0.42892002E-01 + 0.12517000E+02 0.66802002E+03 -0.13487000E+04 0.66802002E+03 0.17157000E+00 + 0.50069000E+02 0.66802002E+03 -0.13868000E+04 0.66802002E+03 0.68627000E+00 + 0.20027000E+03 0.66802002E+03 -0.15391000E+04 0.66802002E+03 0.27451000E+01 + 0.80109998E+03 0.66802002E+03 -0.21482000E+04 0.66803003E+03 0.10980000E+02 + 0.32043999E+04 0.66803003E+03 -0.45843999E+04 0.66802002E+03 0.43921001E+02 + 0.12818000E+05 0.66802002E+03 -0.14330000E+05 0.66803003E+03 0.17569000E+03 + 0.51270000E+05 0.66803003E+03 -0.53311000E+05 0.66802002E+03 0.70273999E+03 + 0.20500000E+06 0.66802002E+03 -0.20915000E+06 0.66777002E+03 0.28098999E+04 + 0.81939000E+06 0.66777002E+03 -0.83198000E+06 0.66728998E+03 0.11231000E+05 + 0.32577000E+07 0.66728998E+03 -0.33028000E+07 0.68526001E+03 0.43718000E+05 + 0.17873000E+08 0.68491998E+03 -0.18122000E+08 0.91488000E+03 0.24607000E+06 + 0.63668000E+08 0.91378998E+03 -0.11417000E+09 0.50497000E+08 0.10723000E-01 + -0.73415001E+02 0.73396004E+02 0.79712998E-02 0.42892002E-01 0.73396004E+02 + -0.14687000E+03 0.73396004E+02 0.31885002E-01 0.17157000E+00 0.73396004E+02 + -0.14709000E+03 0.73396004E+02 0.12754001E+00 0.68625998E+00 0.73396004E+02 + -0.14799001E+03 0.73396004E+02 0.51016003E+00 0.27451000E+01 0.73396004E+02 + -0.15158000E+03 0.73396004E+02 0.20406001E+01 0.10980000E+02 0.73396004E+02 + -0.16594000E+03 0.73396004E+02 0.81625996E+01 0.43921001E+02 0.73396004E+02 + -0.22339999E+03 0.73394997E+02 0.32650002E+02 0.17567999E+03 0.73394997E+02 + -0.45320999E+03 0.73396004E+02 0.13060001E+03 0.70272998E+03 0.73396004E+02 + -0.13725000E+04 0.73396004E+02 0.52240002E+03 0.28098999E+04 0.73396004E+02 + -0.50431001E+04 0.73213997E+02 0.20845000E+04 0.11231000E+05 0.73213997E+02 + -0.19682000E+05 0.72862000E+02 0.82962998E+04 0.43717000E+05 0.72861000E+02 + -0.75025000E+05 0.76553001E+02 0.31124000E+05 0.24605000E+06 0.76514000E+02 + -0.43229000E+06 0.10220000E+03 0.18599000E+06 0.50492000E+08 0.10208000E+03 + -0.14275000E+09 0.92259000E+08 0.79712002E-02 -0.18212000E+02 0.18188000E+02 + 0.16022000E-01 0.31885002E-01 0.18188000E+02 -0.36471001E+02 0.18188000E+02 + 0.64087003E-01 0.12754001E+00 0.18188000E+02 -0.36758999E+02 0.18188000E+02 + 0.25635001E+00 0.51016003E+00 0.18188000E+02 -0.37910999E+02 0.18188000E+02 + 0.10254000E+01 0.20406001E+01 0.18188000E+02 -0.42518002E+02 0.18188000E+02 + 0.41016002E+01 0.81625004E+01 0.18188000E+02 -0.60946999E+02 0.18188000E+02 + 0.16406000E+02 0.32650002E+02 0.18188000E+02 -0.13466000E+03 0.18187000E+02 + 0.65625000E+02 0.13060001E+03 0.18187000E+02 -0.42953000E+03 0.18188000E+02 + 0.26250000E+03 0.52240002E+03 0.18188000E+02 -0.16090000E+04 0.18188000E+02 + 0.10500000E+04 0.20845000E+04 0.18188000E+02 -0.63057002E+04 0.17983000E+02 + 0.41842998E+04 0.82962998E+04 0.17983000E+02 -0.24946000E+05 0.17992001E+02 + 0.16611000E+05 0.31123000E+05 0.17992001E+02 -0.91145000E+05 0.19391001E+02 + 0.59971000E+05 0.18598000E+06 0.19379999E+02 -0.56810000E+06 0.25884001E+02 + 0.38205000E+06 0.92255000E+08 0.25853001E+02 -0.23912000E+09 0.14687000E+09 + 0.16022000E-01 -0.17169001E+02 0.17139000E+02 0.13402000E-01 0.64087003E-01 + 0.17139000E+02 -0.34396000E+02 0.17139000E+02 0.53610001E-01 0.25635001E+00 + 0.17139000E+02 -0.34750000E+02 0.17139000E+02 0.21444000E+00 0.10254000E+01 + 0.17139000E+02 -0.36161999E+02 0.17139000E+02 0.85776001E+00 0.41015000E+01 + 0.17139000E+02 -0.41812000E+02 0.17139000E+02 0.34310000E+01 0.16406000E+02 + 0.17139000E+02 -0.64412003E+02 0.17139000E+02 0.13724000E+02 0.65625000E+02 + 0.17139000E+02 -0.15481000E+03 0.17139000E+02 0.54896999E+02 0.26250000E+03 + 0.17139000E+02 -0.51640997E+03 0.17139000E+02 0.21959000E+03 0.10500000E+04 + 0.17139000E+02 -0.19628000E+04 0.17139000E+02 0.87834998E+03 0.41842002E+04 + 0.17139000E+02 -0.77191001E+04 0.16943001E+02 0.35000000E+04 0.16611000E+05 + 0.16943001E+02 -0.29996000E+05 0.16965000E+02 0.13348000E+05 0.59971000E+05 + 0.16965000E+02 -0.10824000E+06 0.18620001E+02 0.48224000E+05 0.38204000E+06 + 0.18610001E+02 -0.70770000E+06 0.24850000E+02 0.32559000E+06 0.14686000E+09 + 0.24820000E+02 -0.27202000E+09 0.12516000E+09 0.13402000E-01 -0.23312000E+02 + 0.23288000E+02 0.10209000E-01 0.53610001E-01 0.23288000E+02 -0.46669998E+02 + 0.23288000E+02 0.40837999E-01 0.21444000E+00 0.23288000E+02 -0.46953999E+02 + 0.23288000E+02 0.16335000E+00 0.85776001E+00 0.23288000E+02 -0.48087002E+02 + 0.23288000E+02 0.65341002E+00 0.34310000E+01 0.23288000E+02 -0.52622002E+02 + 0.23288000E+02 0.26136000E+01 0.13724000E+02 0.23288000E+02 -0.70759003E+02 + 0.23288000E+02 0.10454000E+02 0.54896000E+02 0.23288000E+02 -0.14331000E+03 + 0.23288000E+02 0.41818001E+02 0.21959000E+03 0.23288000E+02 -0.43350000E+03 + 0.23288000E+02 0.16727000E+03 0.87834003E+03 0.23288000E+02 -0.15943000E+04 + 0.23289000E+02 0.66909003E+03 0.35000000E+04 0.23289000E+02 -0.62015000E+04 + 0.22726999E+02 0.26543000E+04 0.13348000E+05 0.22726999E+02 -0.23849000E+05 + 0.22785999E+02 0.10451000E+05 0.48224000E+05 0.22785999E+02 -0.82693000E+05 + 0.26002001E+02 0.34403000E+05 0.32558000E+06 0.25988001E+02 -0.58040000E+06 + 0.34688000E+02 0.25473000E+06 0.12516000E+09 0.34646000E+02 -0.22308000E+09 + 0.97921000E+08 0.10209000E-01 -0.26198999E+02 0.26172001E+02 0.17565999E-01 + 0.40837999E-01 0.26172001E+02 -0.52453999E+02 0.26171000E+02 0.70262000E-01 + 0.16335000E+00 0.26171000E+02 -0.52786999E+02 0.26171000E+02 0.28105000E+00 + 0.65340000E+00 0.26171000E+02 -0.54120998E+02 0.26172001E+02 0.11242000E+01 + 0.26136000E+01 0.26172001E+02 -0.59455002E+02 0.26171000E+02 0.44967999E+01 + 0.10454000E+02 0.26171000E+02 -0.80790001E+02 0.26172001E+02 0.17987000E+02 + 0.41818001E+02 0.26172001E+02 -0.16613000E+03 0.26171000E+02 0.71948997E+02 + 0.16727000E+03 0.26171000E+02 -0.50748999E+03 0.26172001E+02 0.28779001E+03 + 0.66908002E+03 0.26172001E+02 -0.18729000E+04 0.26173000E+02 0.11512000E+04 + 0.26543000E+04 0.26173000E+02 -0.72782998E+04 0.25355000E+02 0.45712002E+04 + 0.10451000E+05 0.25355000E+02 -0.28384000E+05 0.25518000E+02 0.17877000E+05 + 0.34402000E+05 0.25518000E+02 -0.91977000E+05 0.31083000E+02 0.57497000E+05 + 0.25472000E+06 0.31065001E+02 -0.72041000E+06 0.41421001E+02 0.46560000E+06 + 0.97916000E+08 0.41370998E+02 -0.18360000E+09 0.85686000E+08 0.17565999E-01 + -0.20525000E+03 0.20514000E+03 0.10188000E+00 0.70262000E-01 0.20514000E+03 + -0.41075000E+03 0.20513000E+03 0.40752000E+00 0.28105000E+00 0.20513000E+03 + -0.41217999E+03 0.20513000E+03 0.16301000E+01 0.11242000E+01 0.20513000E+03 + -0.41791000E+03 0.20513000E+03 0.65202999E+01 0.44967999E+01 0.20513000E+03 + -0.44085001E+03 0.20513000E+03 0.26080999E+02 0.17987000E+02 0.20513000E+03 + -0.53259003E+03 0.20514000E+03 0.10433000E+03 0.71947998E+02 0.20514000E+03 + -0.89954999E+03 0.20513000E+03 0.41729999E+03 0.28779001E+03 0.20513000E+03 + -0.23673999E+04 0.20514000E+03 0.16692000E+04 0.11512000E+04 0.20514000E+03 + -0.82387998E+04 0.20519000E+03 0.66767998E+04 0.45711001E+04 0.20519000E+03 + -0.31292000E+05 0.19413000E+03 0.26319000E+05 0.17877000E+05 0.19413000E+03 + -0.11990000E+06 0.20783000E+03 0.10161000E+06 0.57497000E+05 0.20783000E+03 + -0.62841000E+06 0.27437000E+03 0.57044000E+06 0.46557000E+06 0.27420999E+03 + -0.34580000E+07 0.35998999E+03 0.29918000E+07 0.85682000E+08 0.35954999E+03 + -0.16566000E+09 0.79979000E+08 0.10188000E+00 -0.64082999E+01 0.62616000E+01 + 0.44813000E-01 0.40752000E+00 0.62616000E+01 -0.13110000E+02 0.62616000E+01 + 0.17925000E+00 0.16301000E+01 0.62616000E+01 -0.14870000E+02 0.62616000E+01 + 0.71701002E+00 0.65202999E+01 0.62616000E+01 -0.21912001E+02 0.62616000E+01 + 0.28680999E+01 0.26080999E+02 0.62616000E+01 -0.50077000E+02 0.62616000E+01 + 0.11472000E+02 0.10432000E+03 0.62616000E+01 -0.16274001E+03 0.62617002E+01 + 0.45889000E+02 0.41729999E+03 0.62617002E+01 -0.61339001E+03 0.62616000E+01 + 0.18356000E+03 0.16692000E+04 0.62616000E+01 -0.24160000E+04 0.62617002E+01 + 0.73421997E+03 0.66767998E+04 0.62617002E+01 -0.96262998E+04 0.62676001E+01 + 0.29368999E+04 0.26319000E+05 0.62676001E+01 -0.38082000E+05 0.57582002E+01 + 0.11750000E+05 0.10161000E+06 0.57582002E+01 -0.14865000E+06 0.98239002E+01 + 0.47020000E+05 0.57041000E+06 0.98231001E+01 -0.82070000E+06 0.13079000E+02 + 0.25026000E+06 0.29917000E+07 0.13071000E+02 -0.39935000E+07 0.13096000E+02 + 0.10017000E+07 0.79974000E+08 0.13080000E+02 -0.13032000E+09 0.50342000E+08 + 0.44810999E-01 -0.15302000E+03 0.15298000E+03 0.17261000E-02 0.17924000E+00 + 0.15298000E+03 -0.30614001E+03 0.15298000E+03 0.69044000E-02 0.71697003E+00 + 0.15298000E+03 -0.30670001E+03 0.15298000E+03 0.27618000E-01 0.28678999E+01 + 0.15298000E+03 -0.30892999E+03 0.15298000E+03 0.11047000E+00 0.11472000E+02 + 0.15298000E+03 -0.31787000E+03 0.15298000E+03 0.44187999E+00 0.45886002E+02 + 0.15298000E+03 -0.35362000E+03 0.15298000E+03 0.17675000E+01 0.18353999E+03 + 0.15298000E+03 -0.49660001E+03 0.15298000E+03 0.70700998E+01 0.73417999E+03 + 0.15298000E+03 -0.10685000E+04 0.15298000E+03 0.28280001E+02 0.29367000E+04 + 0.15298000E+03 -0.33563000E+04 0.15298000E+03 0.11312000E+03 0.11749000E+05 + 0.15298000E+03 -0.12510000E+05 0.15298000E+03 0.45248999E+03 0.47017000E+05 + 0.15298000E+03 -0.49142000E+05 0.15300000E+03 0.18100000E+04 0.25023000E+06 + 0.15298000E+03 -0.25783000E+06 0.15310001E+03 0.72407998E+04 0.10016000E+07 + 0.15300999E+03 -0.10311000E+07 0.15331000E+03 0.28983000E+05 0.50337000E+08 + 0.15312000E+03 -0.87166000E+08 0.36828000E+08 0.17259000E-02 -0.27385000E+02 + 0.27382000E+02 0.12300001E-02 0.69034998E-02 0.27382000E+02 -0.54775002E+02 + 0.27382000E+02 0.49200999E-02 0.27613999E-01 0.27382000E+02 -0.54811001E+02 + 0.27382000E+02 0.19680001E-01 0.11046000E+00 0.27382000E+02 -0.54952999E+02 + 0.27382000E+02 0.78722000E-01 0.44183001E+00 0.27382000E+02 -0.55521000E+02 + 0.27382000E+02 0.31489000E+00 0.17673000E+01 0.27382000E+02 -0.57793999E+02 + 0.27382000E+02 0.12595000E+01 0.70692000E+01 0.27382000E+02 -0.66887001E+02 + 0.27381001E+02 0.50381999E+01 0.28277000E+02 0.27381001E+02 -0.10326000E+03 + 0.27382000E+02 0.20153000E+02 0.11311000E+03 0.27382000E+02 -0.24875000E+03 + 0.27382000E+02 0.80611000E+02 0.45242999E+03 0.27381001E+02 -0.83071997E+03 + 0.27382000E+02 0.32245001E+03 0.18098000E+04 0.27382000E+02 -0.31587000E+04 + 0.27385000E+02 0.12898000E+04 0.72398999E+04 0.27382000E+02 -0.12472000E+05 + 0.27403000E+02 0.51597998E+04 0.28980000E+05 0.27386999E+02 -0.49758000E+05 + 0.27440001E+02 0.20654000E+05 0.36824000E+08 0.27407000E+02 -0.87893000E+08 + 0.51069000E+08 0.12299001E-02 -0.11818000E+02 0.11816000E+02 0.71976997E-03 + 0.49196999E-02 0.11816000E+02 -0.23639000E+02 0.11816000E+02 0.28790999E-02 + 0.19679001E-01 0.11816000E+02 -0.23662001E+02 0.11816000E+02 0.11516000E-01 + 0.78713998E-01 0.11816000E+02 -0.23756001E+02 0.11816000E+02 0.46064999E-01 + 0.31485999E+00 0.11816000E+02 -0.24131001E+02 0.11816000E+02 0.18426000E+00 + 0.12594000E+01 0.11816000E+02 -0.25629999E+02 0.11816000E+02 0.73703998E+00 + 0.50377002E+01 0.11816000E+02 -0.31624001E+02 0.11816000E+02 0.29482000E+01 + 0.20150999E+02 0.11816000E+02 -0.55603001E+02 0.11816000E+02 0.11793000E+02 + 0.80603996E+02 0.11816000E+02 -0.15152000E+03 0.11816000E+02 0.47171001E+02 + 0.32242001E+03 0.11816000E+02 -0.53519000E+03 0.11816000E+02 0.18867999E+03 + 0.12897000E+04 0.11816000E+02 -0.20698999E+04 0.11817000E+02 0.75475000E+03 + 0.51593999E+04 0.11816000E+02 -0.82095996E+04 0.11825000E+02 0.30193000E+04 + 0.20652000E+05 0.11818000E+02 -0.32791000E+05 0.11841000E+02 0.12086000E+05 + 0.51064000E+08 0.11827000E+02 -0.80948000E+08 0.29884000E+08 0.71965001E-03 + -0.55196999E+02 0.55195999E+02 0.28786000E-02 0.55195999E+02 -0.11039000E+03 + 0.55195999E+02 0.11514000E-01 0.55195999E+02 -0.11040000E+03 0.55195999E+02 + 0.46057999E-01 0.55195999E+02 -0.11044000E+03 0.55195999E+02 0.18423000E+00 + 0.55195999E+02 -0.11058000E+03 0.55195999E+02 0.73693001E+00 0.55195999E+02 + -0.11114000E+03 0.55195999E+02 0.29477000E+01 0.55195999E+02 -0.11337000E+03 + 0.55195000E+02 0.11791000E+02 0.55195000E+02 -0.12232000E+03 0.55195999E+02 + 0.47162998E+02 0.55195999E+02 -0.15809000E+03 0.55195999E+02 0.18864999E+03 + 0.55195000E+02 -0.30120001E+03 0.55196999E+02 0.75463000E+03 0.55195999E+02 + -0.87365002E+03 0.55202999E+02 0.30188999E+04 0.55196999E+02 -0.31638000E+04 + 0.55240002E+02 0.12084000E+05 0.55206001E+02 -0.12333000E+05 0.55314999E+02 + 0.29879000E+08 0.55248001E+02 -0.29912000E+08 + diff --git a/INOUT/README b/INOUT/README new file mode 100644 index 0000000..e104ff3 --- /dev/null +++ b/INOUT/README @@ -0,0 +1,23 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +C INPUT-OUTPUT MODULE c +c----------------------------------------------------------------------c +c contents: c +c---------- c +c readmt : reads matrices in the Boeing/Harwell format. c +c prtmt : prints matrices in the Boeing/Harwell format. c +c dump : outputs matrix rows in a simple format (debugging purposes)c +c pspltm : generates a post-script plot of the non-zero pattern of A c +c pltmt : produces a 'pic' file for plotting a sparse matrix c +c smms : write the matrx in a format used in SMMS package c +c readsm : reads matrics in coordinate format (as in SMMS package) c +c readsk : reads matrices in CSR format (simplified H/B formate). c +c skit : writes matrics to a file, format same as above. c +c prtunf : writes matrics (in CSR format) unformatted c +c readunf: reads unformatted data of matrics (in CSR format) c +c----------------------------------------------------------------------c + +To visualize a Harwell-Boeing matrix on a Unix workstation, it is easiest +to convert it to a postscript file and then view it with ghostview or gs. +The program hb2ps.ex may be used for the former purpose. diff --git a/INOUT/chkio.f b/INOUT/chkio.f new file mode 100644 index 0000000..0d66deb --- /dev/null +++ b/INOUT/chkio.f @@ -0,0 +1,100 @@ + program chkio +c------------------------------------------------------------------c +c test suite for Part I : I/O routines. c +c tests the following : gen5pt.f, prtmt, readmt, amd pltmt. c +c 1) generates a 100 x 100 5pt matrix, c +c 2) prints it with a given format in file 'first.mat' c +c 3) reads the matrix from 'first.mat' using readmat c +c 4) prints it again in file 'second.mat' in a different format c +c 5) makes 4 pic files to show the different options of pltmt. c +c these are in job0.pic, job01.pic, job10.pic, job11.pic c +c coded by Y. Saad, RIACS, 08/31/1989. c +c------------------------------------------------------------------c + parameter (nxmax = 20, nmx = nxmax*nxmax) + implicit real*8 (a-h,o-z) + integer ia(nmx),ja(7*nmx),iau(nmx) + real*8 a(7*nmx),rhs(3*nmx),al(6) + character title*72, key*8, type*3, guesol*2 +c----- open statements ---------------- + open (unit=7,file='first.mat') + open (unit=8,file='second.mat') + open (unit=20,file='job00.pic') + open (unit=21,file='job01.pic') + open (unit=22,file='job10.pic') + open (unit=23,file='job11.pic') +c +c---- dimension of grid +c + nx = 10 + ny = 10 + nz = 1 + al(1) = 1.0D0 + al(2) = 0.0D0 + al(3) = 2.3D1 + al(4) = 0.4D0 + al(5) = 0.0D0 + al(6) = 8.2D-2 +c +c---- generate grid problem. +c + call gen57pt (nx,ny,nz,al,0,n,a,ja,ia,iau,rhs) +c +c---- create the Harwell-Boeing matrix. Start by defining title, +c and type. them define format and print it. +c + write (title,9) nx, ny + 9 format('Five-point matrix on a square region', + * ' using a ',I2,' by ',I2,' grid *SPARSKIT*') + key = 'Fivept10' + type= 'RSA' + ifmt = 5 + job = 3 + guesol = 'GX' +c +c define a right hand side of ones, an initial guess of two's +c and an exact solution of three's. +c + do 2 k=1, 3*n + rhs(k) = real( 1 + (k-1)/n ) + 2 continue +c + call prtmt (n,n,a,ja,ia,rhs,guesol,title,key,type, + 1 ifmt,job,7) +c---- read it again in same matrix a, ja, ia + nmax = nmx + nzmax = 7*nmx + do 3 k=1, 3*n + rhs(k) = 0.0 + 3 continue + job = 3 +c + rewind 7 +c + nrhs = 3*n +c + call readmt (nmax,nzmax,job,7,a,ja,ia,rhs,nrhs,guesol, + 1 nrow,ncol,nnz,title,key,type,ierr) + print *, ' ierr = ', ierr, ' nrhs ' , nrhs +c +c matrix read. print it again in a different format +c + ifmt = 102 + ncol = nrow + job = 3 +c + call prtmt (nrow,ncol,a,ja,ia,rhs,guesol,title,key,type, + 1 ifmt,job,8) +c +c---- print four pic files +c + mode = 0 + do 10 i=1, 2 + do 11 j=1, 2 + job = (i-1)*10 +j-1 + iout = 20+(i-1)*2+j-1 + call pltmt (nrow,ncol,mode,ja,ia,title,key,type,job,iout) + 11 continue + 10 continue +c-------- + stop + end diff --git a/INOUT/hb2pic.f b/INOUT/hb2pic.f new file mode 100644 index 0000000..358ff5c --- /dev/null +++ b/INOUT/hb2pic.f @@ -0,0 +1,35 @@ + program hb2pic +c------------------------------------------------------------------c +c +c reads a harwell-Boeing matrix and creates a pic file for pattern. +c +c------------------------------------------------------------------c + implicit real*8 (a-h,o-z) + parameter (nmax = 5000, nzmax = 70000) + integer ia(nmax+1), ja(nzmax) + real*8 a(nzmax), rhs(1) + character title*72, key*8, guesol*2 + logical valued +c-------------- + data iin /5/, iout/6/ +c-------------- + job = 2 + nrhs = 0 + call readmt (nmax,nzmax,job,iin,a,ja,ia, rhs, nrhs, + * guesol,nrow,ncol,nnz,title,key,type,ierr) +c---- if not readable return + if (ierr .ne. 0) then + write (iout,100) ierr + 100 format(' **ERROR: Unable to read matrix',/, + * ' Message returned fom readmt was ierr =',i3) + stop + endif + valued = (job .ge. 2) +c------- + mode = 1 + iounit = 6 + job = 11 + call pltmt (nrow,ncol,mode,ja,ia,title,key,type,job,iout) +c----------------------------------------------------------------------- + stop + end diff --git a/INOUT/hb2ps.f b/INOUT/hb2ps.f new file mode 100644 index 0000000..83d0b1f --- /dev/null +++ b/INOUT/hb2ps.f @@ -0,0 +1,42 @@ + program hb2ps +c---------------------------------------------------------------------- +c translates a harwell - boeing file into a post-script file. Usage: +c hb2ps < HB_file > Postscript_file +c where hb2ps is the executable generated from this program, +c HB_file is a file containing a matrix stored in Harwell-Boeing +c format and Postscript_file is a file to contain the post-script file. +c---------------------------------------------------------------------- + parameter (nmax = 10000, nzmax = 100000) + integer ia(nmax+1),ja(nzmax), idummy(1), ptitle + real*8 a(1),rhs(1) + real size + character title*72, key*8, guesol*2, munt*2 + data iin /5/, iout/6/, size/5.0/, nlines/0/, ptitle/0/,mode/0/ + data munt/'in'/ +c----------------------------------------------------------------------- + job = 1 + nrhs = 0 +c +c read matrix in Harwell-Boeing format +c + call readmt (nmax,nzmax,job,iin,a,ja,ia, rhs, nrhs, + * guesol,nrow,ncol,nnz,title,key,type,ierr) +c +c if not readable return +c + if (ierr .ne. 0) then + write (iout,100) ierr + stop + endif +c +c call post script generator +c + call pspltm(nrow,ncol,mode,ja,ia,title,ptitle,size,munt, + * nlines,idummy,iout) +c + 100 format(' **ERROR: Unable to read matrix',/, + * ' Message returned fom readmt was ierr =',i3) +c----------------------------------------------------------------------- + stop + end + diff --git a/INOUT/inout.f b/INOUT/inout.f new file mode 100644 index 0000000..820c548 --- /dev/null +++ b/INOUT/inout.f @@ -0,0 +1,1504 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +C INPUT-OUTPUT MODULE c +c----------------------------------------------------------------------c +c contents: c +c---------- c +c readmt : reads matrices in the Boeing/Harwell format. c +c prtmt : prints matrices in the Boeing/Harwell format. c +c dump : outputs matrix rows in a simple format (debugging purposes)c +c pspltm : generates a post-script plot of the non-zero pattern of A c +c pltmt : produces a 'pic' file for plotting a sparse matrix c +c smms : write the matrx in a format used in SMMS package c +c readsm : reads matrics in coordinate format (as in SMMS package) c +c readsk : reads matrices in CSR format (simplified H/B formate). c +c skit : writes matrics to a file, format same as above. c +c prtunf : writes matrics (in CSR format) unformatted c +c readunf: reads unformatted data of matrics (in CSR format) c +c----------------------------------------------------------------------c + subroutine readmt (nmax,nzmax,job,iounit,a,ja,ia,rhs,nrhs, + * guesol,nrow,ncol,nnz,title,key,type,ierr) +c----------------------------------------------------------------------- +c this subroutine reads a boeing/harwell matrix. handles right hand +c sides in full format only (no sparse right hand sides). +c Also the matrix must be in assembled forms. +c Author: Youcef Saad - Date: Sept., 1989 +c updated Oct 31, 1989. +c----------------------------------------------------------------------- +c on entry: +c--------- +c nmax = max column dimension allowed for matrix. The array ia should +c be of length at least ncol+1 (see below) if job.gt.0 +c nzmax = max number of nonzeros elements allowed. the arrays a, +c and ja should be of length equal to nnz (see below) if these +c arrays are to be read (see job). +c +c job = integer to indicate what is to be read. (note: job is an +c input and output parameter, it can be modified on return) +c job = 0 read the values of ncol, nrow, nnz, title, key, +c type and return. matrix is not read and arrays +c a, ja, ia, rhs are not touched. +c job = 1 read srtucture only, i.e., the arrays ja and ia. +c job = 2 read matrix including values, i.e., a, ja, ia +c job = 3 read matrix and right hand sides: a,ja,ia,rhs. +c rhs may contain initial guesses and exact +c solutions appended to the actual right hand sides. +c this will be indicated by the output parameter +c guesol [see below]. +c +c nrhs = integer. nrhs is an input as well as ouput parameter. +c at input nrhs contains the total length of the array rhs. +c See also ierr and nrhs in output parameters. +c +c iounit = logical unit number where to read the matrix from. +c +c on return: +c---------- +c job = on return job may be modified to the highest job it could +c do: if job=2 on entry but no matrix values are available it +c is reset to job=1 on return. Similarly of job=3 but no rhs +c is provided then it is rest to job=2 or job=1 depending on +c whether or not matrix values are provided. +c Note that no error message is triggered (i.e. ierr = 0 +c on return in these cases. It is therefore important to +c compare the values of job on entry and return ). +c +c a = the a matrix in the a, ia, ja (column) storage format +c ja = row number of element a(i,j) in array a. +c ia = pointer array. ia(i) points to the beginning of column i. +c +c rhs = real array of size nrow + 1 if available (see job) +c +c nrhs = integer containing the number of right-hand sides found +c each right hand side may be accompanied with an intial guess +c and also the exact solution. +c +c guesol = a 2-character string indicating whether an initial guess +c (1-st character) and / or the exact solution (2-nd +c character) is provided with the right hand side. +c if the first character of guesol is 'G' it means that an +c an intial guess is provided for each right-hand side. +c These are appended to the right hand-sides in the array rhs. +c if the second character of guesol is 'X' it means that an +c exact solution is provided for each right-hand side. +c These are appended to the right hand-sides +c and the initial guesses (if any) in the array rhs. +c +c nrow = number of rows in matrix +c ncol = number of columns in matrix +c nnz = number of nonzero elements in A. This info is returned +c even if there is not enough space in a, ja, ia, in order +c to determine the minimum storage needed. +c +c title = character*72 = title of matrix test ( character a*72). +c key = character*8 = key of matrix +c type = charatcer*3 = type of matrix. +c for meaning of title, key and type refer to documentation +c Harwell/Boeing matrices. +c +c ierr = integer used for error messages +c * ierr = 0 means that the matrix has been read normally. +c * ierr = 1 means that the array matrix could not be read +c because ncol+1 .gt. nmax +c * ierr = 2 means that the array matrix could not be read +c because nnz .gt. nzmax +c * ierr = 3 means that the array matrix could not be read +c because both (ncol+1 .gt. nmax) and (nnz .gt. nzmax ) +c * ierr = 4 means that the right hand side (s) initial +c guesse (s) and exact solution (s) could not be +c read because they are stored in sparse format (not handled +c by this routine ...) +c * ierr = 5 means that the right-hand-sides, initial guesses +c and exact solutions could not be read because the length of +c rhs as specified by the input value of nrhs is not +c sufficient to store them. The rest of the matrix may have +c been read normally. +c +c Notes: +c------- +c 1) The file inout must be open (and possibly rewound if necessary) +c prior to calling readmt. +c 2) Refer to the documentation on the Harwell-Boeing formats +c for details on the format assumed by readmt. +c We summarize the format here for convenience. +c +c a) all lines in inout are assumed to be 80 character long. +c b) the file consists of a header followed by the block of the +c column start pointers followed by the block of the +c row indices, followed by the block of the real values and +c finally the numerical values of the right-hand-side if a +c right hand side is supplied. +c c) the file starts by a header which contains four lines if no +c right hand side is supplied and five lines otherwise. +c * first line contains the title (72 characters long) followed by +c the 8-character identifier (name of the matrix, called key) +c [ A72,A8 ] +c * second line contains the number of lines for each +c of the following data blocks (4 of them) and the total number +c of lines excluding the header. +c [5i4] +c * the third line contains a three character string identifying +c the type of matrices as they are referenced in the Harwell +c Boeing documentation [e.g., rua, rsa,..] and the number of +c rows, columns, nonzero entries. +c [A3,11X,4I14] +c * The fourth line contains the variable fortran format +c for the following data blocks. +c [2A16,2A20] +c * The fifth line is only present if right-hand-sides are +c supplied. It consists of three one character-strings containing +c the storage format for the right-hand-sides +c ('F'= full,'M'=sparse=same as matrix), an initial guess +c indicator ('G' for yes), an exact solution indicator +c ('X' for yes), followed by the number of right-hand-sides +c and then the number of row indices. +c [A3,11X,2I14] +c d) The three following blocks follow the header as described +c above. +c e) In case the right hand-side are in sparse formats then +c the fourth block uses the same storage format as for the matrix +c to describe the NRHS right hand sides provided, with a column +c being replaced by a right hand side. +c----------------------------------------------------------------------- + character title*72, key*8, type*3, ptrfmt*16, indfmt*16, + 1 valfmt*20, rhsfmt*20, rhstyp*3, guesol*2 + integer totcrd, ptrcrd, indcrd, valcrd, rhscrd, nrow, ncol, + 1 nnz, neltvl, nrhs, nmax, nzmax, nrwindx + integer ia (nmax+1), ja (nzmax) + real*8 a(nzmax), rhs(*) +c----------------------------------------------------------------------- + ierr = 0 + lenrhs = nrhs +c + read (iounit,10) title, key, totcrd, ptrcrd, indcrd, valcrd, + 1 rhscrd, type, nrow, ncol, nnz, neltvl, ptrfmt, indfmt, + 2 valfmt, rhsfmt + 10 format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20) +c + if (rhscrd .gt. 0) read (iounit,11) rhstyp, nrhs, nrwindx + 11 format (a3,11x,i14,i14) +c +c anything else to read ? +c + if (job .le. 0) return +c ---- check whether matrix is readable ------ + n = ncol + if (ncol .gt. nmax) ierr = 1 + if (nnz .gt. nzmax) ierr = ierr + 2 + if (ierr .ne. 0) return +c ---- read pointer and row numbers ---------- + read (iounit,ptrfmt) (ia (i), i = 1, n+1) + read (iounit,indfmt) (ja (i), i = 1, nnz) +c --- reading values of matrix if required.... + if (job .le. 1) return +c --- and if available ----------------------- + if (valcrd .le. 0) then + job = 1 + return + endif + read (iounit,valfmt) (a(i), i = 1, nnz) +c --- reading rhs if required ---------------- + if (job .le. 2) return +c --- and if available ----------------------- + if ( rhscrd .le. 0) then + job = 2 + nrhs = 0 + return + endif +c +c --- read right-hand-side.-------------------- +c + if (rhstyp(1:1) .eq. 'M') then + ierr = 4 + return + endif +c + guesol = rhstyp(2:3) +c + nvec = 1 + if (guesol(1:1) .eq. 'G' .or. guesol(1:1) .eq. 'g') nvec=nvec+1 + if (guesol(2:2) .eq. 'X' .or. guesol(2:2) .eq. 'x') nvec=nvec+1 +c + len = nrhs*nrow +c + if (len*nvec .gt. lenrhs) then + ierr = 5 + return + endif +c +c read right-hand-sides +c + next = 1 + iend = len + read(iounit,rhsfmt) (rhs(i), i = next, iend) +c +c read initial guesses if available +c + if (guesol(1:1) .eq. 'G' .or. guesol(1:1) .eq. 'g') then + next = next+len + iend = iend+ len + read(iounit,valfmt) (rhs(i), i = next, iend) + endif +c +c read exact solutions if available +c + if (guesol(2:2) .eq. 'X' .or. guesol(2:2) .eq. 'x') then + next = next+len + iend = iend+ len + read(iounit,valfmt) (rhs(i), i = next, iend) + endif +c + return +c--------- end of readmt ----------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine prtmt (nrow,ncol,a,ja,ia,rhs,guesol,title,key,type, + 1 ifmt,job,iounit) +c----------------------------------------------------------------------- +c writes a matrix in Harwell-Boeing format into a file. +c assumes that the matrix is stored in COMPRESSED SPARSE COLUMN FORMAT. +c some limited functionality for right hand sides. +c Author: Youcef Saad - Date: Sept., 1989 - updated Oct. 31, 1989 to +c cope with new format. +c----------------------------------------------------------------------- +c on entry: +c--------- +c nrow = number of rows in matrix +c ncol = number of columns in matrix +c a = real*8 array containing the values of the matrix stored +c columnwise +c ja = integer array of the same length as a containing the column +c indices of the corresponding matrix elements of array a. +c ia = integer array of containing the pointers to the beginning of +c the row in arrays a and ja. +c rhs = real array containing the right-hand-side (s) and optionally +c the associated initial guesses and/or exact solutions +c in this order. See also guesol for details. the vector rhs will +c be used only if job .gt. 2 (see below). Only full storage for +c the right hand sides is supported. +c +c guesol = a 2-character string indicating whether an initial guess +c (1-st character) and / or the exact solution (2-nd) +c character) is provided with the right hand side. +c if the first character of guesol is 'G' it means that an +c an intial guess is provided for each right-hand sides. +c These are assumed to be appended to the right hand-sides in +c the array rhs. +c if the second character of guesol is 'X' it means that an +c exact solution is provided for each right-hand side. +c These are assumed to be appended to the right hand-sides +c and the initial guesses (if any) in the array rhs. +c +c title = character*72 = title of matrix test ( character a*72 ). +c key = character*8 = key of matrix +c type = charatcer*3 = type of matrix. +c +c ifmt = integer specifying the format chosen for the real values +c to be output (i.e., for a, and for rhs-guess-sol if +c applicable). The meaning of ifmt is as follows. +c * if (ifmt .lt. 100) then the D descriptor is used, +c format Dd.m, in which the length (m) of the mantissa is +c precisely the integer ifmt (and d = ifmt+6) +c * if (ifmt .gt. 100) then prtmt will use the +c F- descriptor (format Fd.m) in which the length of the +c mantissa (m) is the integer mod(ifmt,100) and the length +c of the integer part is k=ifmt/100 (and d = k+m+2) +c Thus ifmt= 4 means D10.4 +.xxxxD+ee while +c ifmt=104 means F7.4 +x.xxxx +c ifmt=205 means F9.5 +xx.xxxxx +c Note: formats for ja, and ia are internally computed. +c +c job = integer to indicate whether matrix values and +c a right-hand-side is available to be written +c job = 1 write srtucture only, i.e., the arrays ja and ia. +c job = 2 write matrix including values, i.e., a, ja, ia +c job = 3 write matrix and one right hand side: a,ja,ia,rhs. +c job = nrhs+2 write matrix and nrhs successive right hand sides +c Note that there cannot be any right-hand-side if the matrix +c has no values. Also the initial guess and exact solutions when +c provided are for each right hand side. For example if nrhs=2 +c and guesol='GX' there are 6 vectors to write. +c +c +c iounit = logical unit number where to write the matrix into. +c +c on return: +c---------- +c the matrix a, ja, ia will be written in output unit iounit +c in the Harwell-Boeing format. None of the inputs is modofied. +c +c Notes: 1) This code attempts to pack as many elements as possible per +c 80-character line. +c 2) this code attempts to avoid as much as possible to put +c blanks in the formats that are written in the 4-line header +c (This is done for purely esthetical reasons since blanks +c are ignored in format descriptors.) +c 3) sparse formats for right hand sides and guesses are not +c supported. +c----------------------------------------------------------------------- + character title*72,key*8,type*3,ptrfmt*16,indfmt*16,valfmt*20, + 1 guesol*2, rhstyp*3 + integer totcrd, ptrcrd, indcrd, valcrd, rhscrd, nrow, ncol, + 1 nnz, nrhs, len, nperli, nrwindx + integer ja(*), ia(*) + real*8 a(*),rhs(*) +c-------------- +c compute pointer format +c-------------- + nnz = ia(ncol+1) -1 + if (nnz .eq. 0) then + return + endif + len = int ( alog10(0.1+real(nnz+1))) + 1 + nperli = 80/len + ptrcrd = ncol/nperli + 1 + if (len .gt. 9) then + assign 101 to ix + else + assign 100 to ix + endif + write (ptrfmt,ix) nperli,len + 100 format(1h(,i2,1HI,i1,1h) ) + 101 format(1h(,i2,1HI,i2,1h) ) +c---------------------------- +c compute ROW index format +c---------------------------- + len = int ( alog10(0.1+real(nrow) )) + 1 + nperli = min0(80/len,nnz) + indcrd = (nnz-1)/nperli+1 + write (indfmt,100) nperli,len +c--------------- +c compute values and rhs format (using the same for both) +c--------------- + valcrd = 0 + rhscrd = 0 +c quit this part if no values provided. + if (job .le. 1) goto 20 +c + if (ifmt .ge. 100) then + ihead = ifmt/100 + ifmt = ifmt-100*ihead + len = ihead+ifmt+2 + nperli = 80/len +c + if (len .le. 9 ) then + assign 102 to ix + elseif (ifmt .le. 9) then + assign 103 to ix + else + assign 104 to ix + endif +c + write(valfmt,ix) nperli,len,ifmt + 102 format(1h(,i2,1hF,i1,1h.,i1,1h) ) + 103 format(1h(,i2,1hF,i2,1h.,i1,1h) ) + 104 format(1h(,i2,1hF,i2,1h.,i2,1h) ) +C + else + len = ifmt + 6 + nperli = 80/len +c try to minimize the blanks in the format strings. + if (nperli .le. 9) then + if (len .le. 9 ) then + assign 105 to ix + elseif (ifmt .le. 9) then + assign 106 to ix + else + assign 107 to ix + endif + else + if (len .le. 9 ) then + assign 108 to ix + elseif (ifmt .le. 9) then + assign 109 to ix + else + assign 110 to ix + endif + endif +c----------- + write(valfmt,ix) nperli,len,ifmt + 105 format(1h(,i1,1hD,i1,1h.,i1,1h) ) + 106 format(1h(,i1,1hD,i2,1h.,i1,1h) ) + 107 format(1h(,i1,1hD,i2,1h.,i2,1h) ) + 108 format(1h(,i2,1hD,i1,1h.,i1,1h) ) + 109 format(1h(,i2,1hD,i2,1h.,i1,1h) ) + 110 format(1h(,i2,1hD,i2,1h.,i2,1h) ) +c + endif + valcrd = (nnz-1)/nperli+1 + nrhs = job -2 + if (nrhs .ge. 1) then + i = (nrhs*nrow-1)/nperli+1 + rhscrd = i + if (guesol(1:1) .eq. 'G' .or. guesol(1:1) .eq. 'g') + + rhscrd = rhscrd+i + if (guesol(2:2) .eq. 'X' .or. guesol(2:2) .eq. 'x') + + rhscrd = rhscrd+i + rhstyp = 'F'//guesol + endif + 20 continue +c + totcrd = ptrcrd+indcrd+valcrd+rhscrd +c write 4-line or five line header + write(iounit,10) title,key,totcrd,ptrcrd,indcrd,valcrd, + 1 rhscrd,type,nrow,ncol,nnz,nrhs,ptrfmt,indfmt,valfmt,valfmt +c----------------------------------------------------------------------- + nrwindx = 0 + if (nrhs .ge. 1) write (iounit,11) rhstyp, nrhs, nrwindx + 10 format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20) + 11 format(A3,11x,i14,i14) +c + write(iounit,ptrfmt) (ia (i), i = 1, ncol+1) + write(iounit,indfmt) (ja (i), i = 1, nnz) + if (job .le. 1) return + write(iounit,valfmt) (a(i), i = 1, nnz) + if (job .le. 2) return + len = nrow*nrhs + next = 1 + iend = len + write(iounit,valfmt) (rhs(i), i = next, iend) +c +c write initial guesses if available +c + if (guesol(1:1) .eq. 'G' .or. guesol(1:1) .eq. 'g') then + next = next+len + iend = iend+ len + write(iounit,valfmt) (rhs(i), i = next, iend) + endif +c +c write exact solutions if available +c + if (guesol(2:2) .eq. 'X' .or. guesol(2:2) .eq. 'x') then + next = next+len + iend = iend+ len + write(iounit,valfmt) (rhs(i), i = next, iend) + endif +c + return +c----------end of prtmt ------------------------------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine dump (i1,i2,values,a,ja,ia,iout) + integer i1, i2, ia(*), ja(*), iout + real*8 a(*) + logical values +c----------------------------------------------------------------------- +c outputs rows i1 through i2 of a sparse matrix stored in CSR format +c (or columns i1 through i2 of a matrix stored in CSC format) in a file, +c one (column) row at a time in a nice readable format. +c This is a simple routine which is useful for debugging. +c----------------------------------------------------------------------- +c on entry: +c--------- +c i1 = first row (column) to print out +c i2 = last row (column) to print out +c values= logical. indicates whether or not to print real values. +c if value = .false. only the pattern will be output. +c a, +c ja, +c ia = matrix in CSR format (or CSC format) +c iout = logical unit number for output. +c---------- +c the output file iout will have written in it the rows or columns +c of the matrix in one of two possible formats (depending on the max +c number of elements per row. The values are output with only +c two digits of accuracy (D9.2). ) +c----------------------------------------------------------------------- +c local variables + integer maxr, i, k1, k2 +c +c select mode horizontal or vertical +c + maxr = 0 + do 1 i=i1, i2 + maxr = max0(maxr,ia(i+1)-ia(i)) + 1 continue + + if (maxr .le. 8) then +c +c able to do one row acros line +c + do 2 i=i1, i2 + write(iout,100) i + k1=ia(i) + k2 = ia(i+1)-1 + write (iout,101) (ja(k),k=k1,k2) + if (values) write (iout,102) (a(k),k=k1,k2) + 2 continue + else +c +c unable to one row acros line. do three items at a time +c across a line + do 3 i=i1, i2 + if (values) then + write(iout,200) i + else + write(iout,203) i + endif + k1=ia(i) + k2 = ia(i+1)-1 + if (values) then + write (iout,201) (ja(k),a(k),k=k1,k2) + else + write (iout,202) (ja(k),k=k1,k2) + endif + 3 continue + endif +c +c formats : +c + 100 format (1h ,34(1h-),' row',i6,1x,34(1h-) ) + 101 format(' col:',8(i5,6h : )) + 102 format(' val:',8(D9.2,2h :) ) + 200 format (1h ,30(1h-),' row',i3,1x,30(1h-),/ + * 3(' columns : values * ') ) +c-------------xiiiiiihhhhhhddddddddd-*- + 201 format(3(1h ,i6,6h : ,D9.2,3h * ) ) + 202 format(6(1h ,i5,6h * ) ) + 203 format (1h ,30(1h-),' row',i3,1x,30(1h-),/ + * 3(' column : column *') ) + return +c----end-of-dump-------------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine pspltm(nrow,ncol,mode,ja,ia,title,ptitle,size,munt, + * nlines,lines,iunt) +c----------------------------------------------------------------------- + integer nrow,ncol,ptitle,mode,iunt, ja(*), ia(*), lines(nlines) + real size + character title*(*), munt*2 +c----------------------------------------------------------------------- +c PSPLTM - PostScript PLoTer of a (sparse) Matrix +c This version by loris renggli (renggli@masg1.epfl.ch), Dec 1991 +c and Youcef Saad +c------ +c Loris RENGGLI, Swiss Federal Institute of Technology, Math. Dept +c CH-1015 Lausanne (Switzerland) -- e-mail: renggli@masg1.epfl.ch +c Modified by Youcef Saad -- June 24, 1992 to add a few features: +c separation lines + acceptance of MSR format. +c----------------------------------------------------------------------- +c input arguments description : +c +c nrow = number of rows in matrix +c +c ncol = number of columns in matrix +c +c mode = integer indicating whether the matrix is stored in +c CSR mode (mode=0) or CSC mode (mode=1) or MSR mode (mode=2) +c +c ja = column indices of nonzero elements when matrix is +c stored rowise. Row indices if stores column-wise. +c ia = integer array of containing the pointers to the +c beginning of the columns in arrays a, ja. +c +c title = character*(*). a title of arbitrary length to be printed +c as a caption to the figure. Can be a blank character if no +c caption is desired. +c +c ptitle = position of title; 0 under the drawing, else above +c +c size = size of the drawing +c +c munt = units used for size : 'cm' or 'in' +c +c nlines = number of separation lines to draw for showing a partionning +c of the matrix. enter zero if no partition lines are wanted. +c +c lines = integer array of length nlines containing the coordinates of +c the desired partition lines . The partitioning is symmetric: +c a horizontal line across the matrix will be drawn in +c between rows lines(i) and lines(i)+1 for i=1, 2, ..., nlines +c an a vertical line will be similarly drawn between columns +c lines(i) and lines(i)+1 for i=1,2,...,nlines +c +c iunt = logical unit number where to write the matrix into. +c----------------------------------------------------------------------- +c additional note: use of 'cm' assumes european format for paper size +c (21cm wide) and use of 'in' assumes american format (8.5in wide). +c The correct centering of the figure depends on the proper choice. Y.S. +c----------------------------------------------------------------------- +c external + integer LENSTR + external LENSTR +c local variables --------------------------------------------------- + integer n,nr,nc,maxdim,istart,ilast,ii,k,ltit + real lrmrgn,botmrgn,xtit,ytit,ytitof,fnstit,siz + real xl,xr, yb,yt, scfct,u2dot,frlw,delt,paperx,conv,xx,yy + logical square +c change square to .true. if you prefer a square frame around +c a rectangular matrix + data haf /0.5/, zero/0.0/, conv/2.54/,square/.false./ +c----------------------------------------------------------------------- + siz = size + nr = nrow + nc = ncol + n = nc + if (mode .eq. 0) n = nr +c nnz = ia(n+1) - ia(1) + maxdim = max(nrow, ncol) + m = 1 + maxdim + nc = nc+1 + nr = nr+1 +c +c units (cm or in) to dot conversion factor and paper size +c + if (munt.eq.'cm' .or. munt.eq.'CM') then + u2dot = 72.0/conv + paperx = 21.0 + else + u2dot = 72.0 + paperx = 8.5*conv + siz = siz*conv + end if +c +c left and right margins (drawing is centered) +c + lrmrgn = (paperx-siz)/2.0 +c +c bottom margin : 2 cm +c + botmrgn = 2.0 +c scaling factor + scfct = siz*u2dot/m +c matrix frame line witdh + frlw = 0.25 +c font size for title (cm) + fnstit = 0.5 + ltit = LENSTR(title) +c position of title : centered horizontally +c at 1.0 cm vertically over the drawing + ytitof = 1.0 + xtit = paperx/2.0 + ytit = botmrgn+siz*nr/m + ytitof +c almost exact bounding box + xl = lrmrgn*u2dot - scfct*frlw/2 + xr = (lrmrgn+siz)*u2dot + scfct*frlw/2 + yb = botmrgn*u2dot - scfct*frlw/2 + yt = (botmrgn+siz*nr/m)*u2dot + scfct*frlw/2 + if (ltit.gt.0) then + yt = yt + (ytitof+fnstit*0.70)*u2dot + end if +c add some room to bounding box + delt = 10.0 + xl = xl-delt + xr = xr+delt + yb = yb-delt + yt = yt+delt +c +c correction for title under the drawing + if (ptitle.eq.0 .and. ltit.gt.0) then + ytit = botmrgn + fnstit*0.3 + botmrgn = botmrgn + ytitof + fnstit*0.7 + end if +c begin of output +c + write(iunt,10) '%!' + write(iunt,10) '%%Creator: PSPLTM routine' + write(iunt,12) '%%BoundingBox:',xl,yb,xr,yt + write(iunt,10) '%%EndComments' + write(iunt,10) '/cm {72 mul 2.54 div} def' + write(iunt,10) '/mc {72 div 2.54 mul} def' + write(iunt,10) '/pnum { 72 div 2.54 mul 20 string' + write(iunt,10) 'cvs print ( ) print} def' + write(iunt,10) + 1 '/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def' +c +c we leave margins etc. in cm so it is easy to modify them if +c needed by editing the output file + write(iunt,10) 'gsave' + if (ltit.gt.0) then + write(iunt,*) '/Helvetica findfont ',fnstit, + & ' cm scalefont setfont ' + write(iunt,*) xtit,' cm ',ytit,' cm moveto ' + write(iunt,'(3A)') '(',title(1:ltit),') Cshow' + end if + write(iunt,*) lrmrgn,' cm ',botmrgn,' cm translate' + write(iunt,*) siz,' cm ',m,' div dup scale ' +c------- +c draw a frame around the matrix + write(iunt,*) frlw,' setlinewidth' + write(iunt,10) 'newpath' + write(iunt,11) 0, 0, ' moveto' + if (square) then + write(iunt,11) m,0,' lineto' + write(iunt,11) m, m, ' lineto' + write(iunt,11) 0,m,' lineto' + else + write(iunt,11) nc,0,' lineto' + write(iunt,11) nc,nr,' lineto' + write(iunt,11) 0,nr,' lineto' + end if + write(iunt,10) 'closepath stroke' +c +c drawing the separation lines +c + write(iunt,*) ' 0.2 setlinewidth' + do 22 kol=1, nlines + isep = lines(kol) +c +c horizontal lines +c + yy = real(nrow-isep) + haf + xx = real(ncol+1) + write(iunt,13) zero, yy, ' moveto ' + write(iunt,13) xx, yy, ' lineto stroke ' +c +c vertical lines +c + xx = real(isep) + haf + yy = real(nrow+1) + write(iunt,13) xx, zero,' moveto ' + write(iunt,13) xx, yy, ' lineto stroke ' + 22 continue +c +c----------- plotting loop --------------------------------------------- +c + write(iunt,10) '1 1 translate' + write(iunt,10) '0.8 setlinewidth' + write(iunt,10) '/p {moveto 0 -.40 rmoveto ' + write(iunt,10) ' 0 .80 rlineto stroke} def' +c + do 1 ii=1, n + istart = ia(ii) + ilast = ia(ii+1)-1 + if (mode .eq. 1) then + do 2 k=istart, ilast + write(iunt,11) ii-1, nrow-ja(k), ' p' + 2 continue + else + do 3 k=istart, ilast + write(iunt,11) ja(k)-1, nrow-ii, ' p' + 3 continue +c add diagonal element if MSR mode. + if (mode .eq. 2) + * write(iunt,11) ii-1, nrow-ii, ' p' +c + endif + 1 continue +c----------------------------------------------------------------------- + write(iunt,10) 'showpage' + return +c + 10 format (A) + 11 format (2(I6,1x),A) + 12 format (A,4(1x,F9.2)) + 13 format (2(F9.2,1x),A) +c----------------------------------------------------------------------- + end +c + integer function lenstr(s) +c----------------------------------------------------------------------- +c return length of the string S +c----------------------------------------------------------------------- + character*(*) s + integer len + intrinsic len + integer n +c----------------------------------------------------------------------- + n = len(s) +10 continue + if (s(n:n).eq.' ') then + n = n-1 + if (n.gt.0) go to 10 + end if + lenstr = n +c + return +c--------end-of-pspltm-------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine pltmt (nrow,ncol,mode,ja,ia,title,key,type, + 1 job, iounit) +c----------------------------------------------------------------------- +c this subroutine creates a 'pic' file for plotting the pattern of +c a sparse matrix stored in general sparse format. it is not intended +c to be a means of plotting large matrices (it is very inefficient). +c It is however useful for small matrices and can be used for example +c for inserting matrix plots in a text. The size of the plot can be +c 7in x 7in or 5 in x 5in .. There is also an option for writing a +c 3-line header in troff (see description of parameter job). +c Author: Youcef Saad - Date: Sept., 1989 +c See SPARSKIT/UNSUPP/ for a version of this to produce a post-script +c file. +c----------------------------------------------------------------------- +c nrow = number of rows in matrix +c +c ncol = number of columns in matrix +c +c mode = integer indicating whether the matrix is stored +c row-wise (mode = 0) or column-wise (mode=1) +c +c ja = column indices of nonzero elements when matrix is +c stored rowise. Row indices if stores column-wise. +c ia = integer array of containing the pointers to the +c beginning of the columns in arrays a, ja. +c +c title = character*71 = title of matrix test ( character a*71 ). +c key = character*8 = key of matrix +c type = character*3 = type of matrix. +c +c job = this integer parameter allows to set a few minor +c options. First it tells pltmt whether or not to +c reduce the plot. The standard size of 7in is then +c replaced by a 5in plot. It also tells pltmt whether or +c not to append to the pic file a few 'troff' lines that +c produce a centered caption includingg the title, key and +c types as well as the size and number of nonzero elements. +c job = 0 : do not reduce and do not make caption. +c job = 1 : reduce and do not make caption. +c job = 10 : do not reduce and make caption +c job = 11 : reduce and make caption. +c (i.e. trailing digit for reduction, leading digit for caption) +c +c iounit = logical unit number where to write the matrix into. +c +c----------------------------------------------------------------------- +c example of usage . +c----------------- +c In the fortran code: +c a) read a Harwell/Boeing matrix +c call readmt (.....) +c iout = 13 +c b) generate pic file: +c call pltmt (nrow,ncol,mode,ja,ia,title,key,type,iout) +c stop +c --------- +c Then in a unix environment plot the matrix by the command +c +c pic FOR013.DAT | troff -me | lpr -Ppsx +c +c----------------------------------------------------------------------- +c notes: 1) Plots square as well as rectangular matrices. +c (however not as much tested with rectangular matrices.) +c 2) the dot-size is adapted according to the size of the +c matrix. +c 3) This is not meant at all as a way of plotting large +c matrices. The pic file generaled will have one line for +c each nonzero element. It is only meant for use in +c such things as document poreparations etc.. +c 4) The caption written will print the 71 character long +c title. This may not be centered correctly if the +c title has trailing blanks (a problem with Troff). +c if you want the title centered then you can center +c the string in title before calling pltmt. +c +c----------------------------------------------------------------------- + integer ja(*), ia(*) + character key*8,title*72,type*3 + real x, y +c------- + n = ncol + if (mode .eq. 0) n = nrow + nnz = ia(n+1) - ia(1) + maxdim = max0 (nrow, ncol) + xnrow = real(nrow) + ptsize = 0.08 + hscale = (7.0 -2.0*ptsize)/real(maxdim-1) + vscale = hscale + xwid = ptsize + real(ncol-1)*hscale + ptsize + xht = ptsize + real(nrow-1)*vscale + ptsize + xshift = (7.0-xwid)/2.0 + yshift = (7.0-xht)/2.0 +c------ + if (mod(job,10) .eq. 1) then + write (iounit,88) + else + write (iounit,89) + endif + 88 format('.PS 5in',/,'.po 1.8i') + 89 format('.PS',/,'.po 0.7i') + write(iounit,90) + 90 format('box invisible wid 7.0 ht 7.0 with .sw at (0.0,0.0) ') + write(iounit,91) xwid, xht, xshift, yshift + 91 format('box wid ',f5.2,' ht ',f5.2, + * ' with .sw at (',f5.2,',',f5.2,')' ) +c +c shift points slightly to account for size of dot , etc.. +c + tiny = 0.03 + if (mod(job,10) .eq. 1) tiny = 0.05 + xshift = xshift + ptsize - tiny + yshift = yshift + ptsize + tiny +c +c----------------------------------------------------------------------- +c + ips = 8 + if (maxdim .le. 500) ips = 10 + if (maxdim .le. 300) ips = 12 + if (maxdim .le. 100) ips = 16 + if (maxdim .lt. 50) ips = 24 + write(iounit,92) ips + 92 format ('.ps ',i2) +c +c-----------plottingloop --------------------------------------------- +c + do 1 ii=1, n + istart = ia(ii) + ilast = ia(ii+1)-1 + if (mode .ne. 0) then + x = real(ii-1) + do 2 k=istart, ilast + y = xnrow-real(ja(k)) + write(iounit,128) xshift+x*hscale, yshift+y*vscale + 2 continue + else + y = xnrow - real(ii) + do 3 k=istart, ilast + x = real(ja(k)-1) + write(iounit,128) xshift+x*hscale, yshift+y*vscale + 3 continue + endif + 1 continue +c----------------------------------------------------------------------- + 128 format(7h"." at ,f6.3,1h,,f6.3,8h ljust ) + write (iounit, 129) + 129 format('.PE') +c quit if caption not desired. + if ( (job/10) .ne. 1) return +c + write(iounit,127) key, type, title + write(iounit,130) nrow,ncol,nnz + 127 format('.sp 4'/'.ll 7i'/'.ps 12'/'.po 0.7i'/'.ce 3'/, + * 'Matrix: ',a8,', Type: ',a3,/,a72) + 130 format('Dimension: ',i4,' x ',i4,', Nonzero elements: ',i5) + return +c----------------end-of-pltmt ------------------------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine smms (n,first,last,mode,a,ja,ia,iout) + integer ia(*), ja(*), n, first, last, mode, iout + real*8 a(*) +c----------------------------------------------------------------------- +c writes a matrix in Coordinate (SMMS) format -- +c----------------------------------------------------------------------- +c on entry: +c--------- +c n = integer = size of matrix -- number of rows (columns if matrix +c is stored columnwise) +c first = first row (column) to be output. This routine will output +c rows (colums) first to last. +c last = last row (column) to be output. +c mode = integer giving some information about the storage of the +c matrix. A 3-digit decimal number. 'htu' +c * u = 0 means that matrix is stored row-wise +c * u = 1 means that matrix is stored column-wise +c * t = 0 indicates that the matrix is stored in CSR format +c * t = 1 indicates that the matrix is stored in MSR format. +c * h = ... to be added. +c a, +c ja, +c ia = matrix in CSR or MSR format (see mode) +c iout = output unit number. +c +c on return: +c---------- +c the output file iout will have written in it the matrix in smms +c (coordinate format) +c +c----------------------------------------------------------------------- + logical msr, csc +c +c determine mode ( msr or csr ) +c + msr = .false. + csc = .false. + if (mod(mode,10) .eq. 1) csc = .true. + if ( (mode/10) .eq. 1) msr = .true. + + write (iout,*) n + do 2 i=first, last + k1=ia(i) + k2 = ia(i+1)-1 +c write (iout,*) ' row ', i + if (msr) write(iout,'(2i6,e22.14)') i, i, a(i) + do 10 k=k1, k2 + if (csc) then + write(iout,'(2i6,e22.14)') ja(k), i, a(k) + else + write(iout,'(2i6,e22.14)') i, ja(k), a(k) + endif + 10 continue + 2 continue +c----end-of-smms-------------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine readsm (nmax,nzmax,n,nnz,ia,ja,a,iout,ierr) + integer nmax, nzmax, row, n, iout, i, j, k, ierr + integer ia(nmax+1), ja(nzmax) + real*8 a(nzmax), x +c----------------------------------------------------------------------- +c read a matrix in coordinate format as is used in the SMMS +c package (F. Alvarado), i.e. the row is in ascending order. +c Outputs the matrix in CSR format. +c----------------------------------------------------------------------- +c coded by Kesheng Wu on Oct 21, 1991 with the supervision of Y. Saad +c----------------------------------------------------------------------- +c on entry: +c--------- +c nmax = the maximum size of array +c nzmax = the maximum number of nonzeros +c iout = the I/O unit that has the data file +c +c on return: +c---------- +c n = integer = size of matrix +c nnz = number of non-zero entries in the matrix +c a, +c ja, +c ia = matrix in CSR format +c ierr = error code, +c 0 -- subroutine end with intended job done +c 1 -- error in I/O unit iout +c 2 -- end-of-file reached while reading n, i.e. a empty data file +c 3 -- n non-positive or too large +c 4 -- nnz is zero or larger than nzmax +c 5 -- data file is not orgnized in the order of ascending +c row indices +c +c in case of errors: +c n will be set to zero (0). In case the data file has more than nzmax +c number of entries, the first nzmax entries will be read, and are not +c cleared on return. The total number of entry is determined. +c Ierr is set. +c----------------------------------------------------------------------- +c + rewind(iout) + nnz = 0 + ia(1) = 1 + row = 1 +c + read (iout,*, err=1000, end=1010) n + if ((n.le.0) .or. (n.gt.nmax)) goto 1020 +c + 10 nnz = nnz + 1 + read (iout, *, err=1000, end=100) i, j, x + +c set the pointers when needed + if (i.gt.row) then + do 20 k = row+1, i + ia(k) = nnz + 20 continue + row = i + else if (i.lt.row) then + goto 1040 + endif + + ja(nnz) = j + a (nnz) = x + + if (nnz.lt.nzmax) then + goto 10 + else + goto 1030 + endif + +c normal return -- end of file reached + 100 ia(row+1) = nnz + nnz = nnz - 1 + if (nnz.eq.0) goto 1030 +c +c everything seems to be OK. +c + ierr = 0 + return +c +c error handling code +c +c error in reading data entries +c + 1000 ierr = 1 + goto 2000 +c +c empty file +c + 1010 ierr = 2 + goto 2000 +c +c problem with n +c + 1020 ierr = 3 + goto 2000 +c +c problem with nnz +c + 1030 ierr = 4 +c +c try to determine the real number of entries, in case needed +c + if (nnz.ge.nzmax) then + 200 read(iout, *, err=210, end=210) i, j, x + nnz = nnz + 1 + goto 200 + 210 continue + endif + goto 2000 +c +c data entries not ordered +c + 1040 ierr = 5 + 2000 n = 0 + return +c----end-of-readsm------------------------------------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine readsk (nmax,nzmax,n,nnz,a,ja,ia,iounit,ierr) + integer nmax, nzmax, iounit, n, nnz, i, ierr + integer ia(nmax+1), ja(nzmax) + real*8 a(nzmax) +c----------------------------------------------------------------------- +c Reads matrix in Compressed Saprse Row format. The data is supposed to +c appear in the following order -- n, ia, ja, a +c Only square matrices accepted. Format has following features +c (1) each number is separated by at least one space (or end-of-line), +c (2) each array starts with a new line. +c----------------------------------------------------------------------- +c coded by Kesheng Wu on Oct 21, 1991 with supervision of Y. Saad +c----------------------------------------------------------------------- +c on entry: +c--------- +c nmax = max column dimension allowed for matrix. +c nzmax = max number of nonzeros elements allowed. the arrays a, +c and ja should be of length equal to nnz (see below). +c iounit = logical unit number where to read the matrix from. +c +c on return: +c---------- +c ia, +c ja, +c a = matrx in CSR format +c n = number of rows(columns) in matrix +c nnz = number of nonzero elements in A. This info is returned +c even if there is not enough space in a, ja, ia, in order +c to determine the minimum storage needed. +c ierr = error code, +c 0 : OK; +c 1 : error when try to read the specified I/O unit. +c 2 : end-of-file reached during reading of data file. +c 3 : array size in data file is negtive or larger than nmax; +c 4 : nunmer of nonzeros in data file is negtive or larger than nzmax +c in case of errors: +c--------- +c n is set to 0 (zero), at the same time ierr is set. +c----------------------------------------------------------------------- +c +c read the size of the matrix +c + rewind(iounit) + read (iounit, *, err=1000, end=1010) n + if ((n.le.0).or.(n.gt.nmax)) goto 1020 +c +c read the pointer array ia(*) +c + read (iounit, *, err=1000, end=1010) (ia(i), i=1, n+1) +c +c Number of None-Zeros +c + nnz = ia(n+1) - 1 + if ((nnz.le.0).or.(nnz.gt.nzmax)) goto 1030 +c +c read the column indices array +c + read (iounit, *, err=1000, end=1010) (ja(i), i=1, nnz) +c +c read the matrix elements +c + read (iounit, *, err=1000, end=1010) (a(i), i=1, nnz) +c +c normal return +c + ierr = 0 + return +c +c error handling code +c +c error in reading I/O unit + 1000 ierr = 1 + goto 2000 +c +c EOF reached in reading + 1010 ierr =2 + goto 2000 +c +c n non-positive or too large + 1020 ierr = 3 + n = 0 + goto 2000 +c +c NNZ non-positive or too large + 1030 ierr = 4 +c +c the real return statement +c + 2000 n = 0 + return +c---------end of readsk ------------------------------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine skit (n, a, ja, ia, ifmt, iounit, ierr) +c----------------------------------------------------------------------- +c Writes a matrix in Compressed Sparse Row format to an I/O unit. +c It tryes to pack as many number as possible into lines of less than +c 80 characters. Space is inserted in between numbers for separation +c to avoid carrying a header in the data file. This can be viewed +c as a simplified Harwell-Boeing format. +c----------------------------------------------------------------------- +c Modified from subroutine prtmt written by Y. Saad +c----------------------------------------------------------------------- +c on entry: +c--------- +c n = number of rows(columns) in matrix +c a = real*8 array containing the values of the matrix stored +c columnwise +c ja = integer array of the same length as a containing the column +c indices of the corresponding matrix elements of array a. +c ia = integer array of containing the pointers to the beginning of +c the row in arrays a and ja. +c ifmt = integer specifying the format chosen for the real values +c to be output (i.e., for a, and for rhs-guess-sol if +c applicable). The meaning of ifmt is as follows. +c * if (ifmt .lt. 100) then the D descriptor is used, +c format Dd.m, in which the length (m) of the mantissa is +c precisely the integer ifmt (and d = ifmt+6) +c * if (ifmt .gt. 100) then prtmt will use the +c F- descriptor (format Fd.m) in which the length of the +c mantissa (m) is the integer mod(ifmt,100) and the length +c of the integer part is k=ifmt/100 (and d = k+m+2) +c Thus ifmt= 4 means D10.4 +.xxxxD+ee while +c ifmt=104 means F7.4 +x.xxxx +c ifmt=205 means F9.5 +xx.xxxxx +c Note: formats for ja, and ia are internally computed. +c +c iounit = logical unit number where to write the matrix into. +c +c on return: +c---------- +c ierr = error code, 0 for normal 1 for error in writing to iounit. +c +c on error: +c-------- +c If error is encontacted when writing the matrix, the whole matrix +c is written to the standard output. +c ierr is set to 1. +c----------------------------------------------------------------------- + character ptrfmt*16,indfmt*16,valfmt*20 + integer iounit, n, ifmt, len, nperli, nnz, i, ihead + integer ja(*), ia(*), ierr + real*8 a(*) +c-------------- +c compute pointer format +c-------------- + nnz = ia(n+1) + len = int ( alog10(0.1+real(nnz))) + 2 + nnz = nnz - 1 + nperli = 80/len + + print *, ' skit entries:', n, nnz, len, nperli + + if (len .gt. 9) then + assign 101 to ix + else + assign 100 to ix + endif + write (ptrfmt,ix) nperli,len + 100 format(1h(,i2,1HI,i1,1h) ) + 101 format(1h(,i2,1HI,i2,1h) ) +c---------------------------- +c compute ROW index format +c---------------------------- + len = int ( alog10(0.1+real(n) )) + 2 + nperli = min0(80/len,nnz) + write (indfmt,100) nperli,len +c--------------------------- +c compute value format +c--------------------------- + if (ifmt .ge. 100) then + ihead = ifmt/100 + ifmt = ifmt-100*ihead + len = ihead+ifmt+3 + nperli = 80/len +c + if (len .le. 9 ) then + assign 102 to ix + elseif (ifmt .le. 9) then + assign 103 to ix + else + assign 104 to ix + endif +c + write(valfmt,ix) nperli,len,ifmt + 102 format(1h(,i2,1hF,i1,1h.,i1,1h) ) + 103 format(1h(,i2,1hF,i2,1h.,i1,1h) ) + 104 format(1h(,i2,1hF,i2,1h.,i2,1h) ) +C + else + len = ifmt + 7 + nperli = 80/len +c try to minimize the blanks in the format strings. + if (nperli .le. 9) then + if (len .le. 9 ) then + assign 105 to ix + elseif (ifmt .le. 9) then + assign 106 to ix + else + assign 107 to ix + endif + else + if (len .le. 9 ) then + assign 108 to ix + elseif (ifmt .le. 9) then + assign 109 to ix + else + assign 110 to ix + endif + endif +c----------- + write(valfmt,ix) nperli,len,ifmt + 105 format(1h(,i1,1hD,i1,1h.,i1,1h) ) + 106 format(1h(,i1,1hD,i2,1h.,i1,1h) ) + 107 format(1h(,i1,1hD,i2,1h.,i2,1h) ) + 108 format(1h(,i2,1hD,i1,1h.,i1,1h) ) + 109 format(1h(,i2,1hD,i2,1h.,i1,1h) ) + 110 format(1h(,i2,1hD,i2,1h.,i2,1h) ) +c + endif +c +c output the data +c + write(iounit, *) n + write(iounit,ptrfmt,err=1000) (ia(i), i = 1, n+1) + write(iounit,indfmt,err=1000) (ja(i), i = 1, nnz) + write(iounit,valfmt,err=1000) ( a(i), i = 1, nnz) +c +c done, if no trouble is encounted in writing data +c + ierr = 0 + return +c +c if can't write the data to the I/O unit specified, should be able to +c write everything to standard output (unit 6) +c + 1000 write(0, *) 'Error, Can''t write data to sepcified unit',iounit + write(0, *) 'Write the matrix into standard output instead!' + ierr = 1 + write(6,*) n + write(6,ptrfmt) (ia(i), i=1, n+1) + write(6,indfmt) (ja(i), i=1, nnz) + write(6,valfmt) ( a(i), i=1, nnz) + return +c----------end of skit ------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine prtunf(n, a, ja, ia, iout, ierr) +c----------------------------------------------------------------------- +c This subroutine dumps the arrays used for storing sparse compressed row +c format in machine code, i.e. unformatted using standard FORTRAN term. +c----------------------------------------------------------------------- +c First coded by Kesheng Wu on Oct 21, 1991 under the instruction of +c Prof. Y. Saad +c----------------------------------------------------------------------- +c On entry: +c n: the size of the matrix (matrix is n X n) +c ia: integer array stores the stariting position of each row. +c ja: integer array stores the column indices of each entry. +c a: the non-zero entries of the matrix. +c iout: the unit number opened for storing the matrix. +c On return: +c ierr: a error, 0 if everything's OK, else 1 if error in writing data. +c On error: +c set ierr to 1. +c No redirection is made, since direct the machine code to the standard +c output may cause unpridictable consequences. +c----------------------------------------------------------------------- + integer iout, n, nnz, ierr, ia(*), ja(*) + real*8 a(*) + nnz = ia(n+1)-ia(1) +c + write(unit=iout, err=1000) n + write(unit=iout, err=1000) (ia(k),k=1,n+1) + if (nnz .gt. 0) then + write(unit=iout, err=1000) (ja(k),k=1,nnz) + write(unit=iout, err=1000) ( a(k),k=1,nnz) + endif +c + ierr = 0 + return +c + 1000 ierr = 1 + return + end +c---------end of prtunf ------------------------------------------------ +c +c----------------------------------------------------------------------- + subroutine readunf(nmax,nzmax,n,nnz,a,ja,ia,iounit,ierr) +c----------------------------------------------------------------------- +c This subroutine reads a matix store in machine code (FORTRAN +c unformatted form). The matrix is in CSR format. +c----------------------------------------------------------------------- +c First coded by Kesheng Wu on Oct 21, 1991 under the instruction of +c Prof. Y. Saad +c----------------------------------------------------------------------- +c On entry: +c nmax: the maximum value of matrix size. +c nzmax: the maximum number of non-zero entries. +c iounit: the I/O unit that opened for reading. +c On return: +c n: the actual size of array. +c nnz: the actual number of non-zero entries. +c ia,ja,a: the matrix in CSR format. +c ierr: a error code, it's same as that used in reaadsk +c 0 -- OK +c 1 -- error in reading iounit +c 2 -- end-of-file reached while reading data file +c 3 -- n is non-positive or too large +c 4 -- nnz is non-positive or too large +c On error: +c return with n set to 0 (zero). nnz is kept if it's set already, +c in case one want to use it to determine the size of array needed +c to hold the data. +c----------------------------------------------------------------------- +c + integer nmax, nzmax, n, iounit, nnz, k + integer ia(nmax+1), ja(nzmax) + real*8 a(nzmax) +c + rewind iounit +c + read (unit=iounit, err=1000, end=1010) n + if ((n.le.0) .or. (n.gt.nmax)) goto 1020 +c + read(unit=iounit, err=1000, end=1010) (ia(k),k=1,n+1) +c + nnz = ia(n+1) - 1 + if ((nnz.le.0) .or. (nnz.gt.nzmax)) goto 1030 +c + read(unit=iounit, err=1000, end=1010) (ja(k),k=1,nnz) + read(unit=iounit, err=1000, end=1010) (a(k),k=1,nnz) +c +c everything seems to be OK. +c + ierr = 0 + return +c +c error handling +c + 1000 ierr = 1 + goto 2000 + 1010 ierr = 2 + goto 2000 + 1020 ierr = 3 + goto 2000 + 1030 ierr = 4 + 2000 n = 0 + return + end +c---------end of readunf ---------------------------------------------- diff --git a/INOUT/makefile b/INOUT/makefile new file mode 100644 index 0000000..993582c --- /dev/null +++ b/INOUT/makefile @@ -0,0 +1,28 @@ +FFLAGS = +F77 = f77 + +#F77 = cf77 +#FFLAGS = -Wf"-dp" + +FILES1 = chkio.o +FILES2 = hb2ps.o +FILES3 = hb2pic.o + +chk.ex: $(FILES1) ../MATGEN/FDIF/functns.o ../libskit.a + $(F77) $(FFLAGS) -o chk.ex $(FILES1) ../MATGEN/FDIF/functns.o ../libskit.a + +hb2ps.ex: $(FILES2) ../libskit32.a + $(F77) $(FFLAGS) -o hb2ps.ex $(FILES2) ../libskit32.a + +hb2pic.ex: $(FILES3) ../libskit.a + $(F77) $(FFLAGS) -o hb2pic.ex $(FILES3) ../libskit.a + +clean: + rm -f *.o *.ex core *.trace *.pic *.mat *.ps + +../MATGEN/FDIF/functns.o: + (cd ../MATGEN/FDIF; $(F77) $(FFLAGS) -c functns.f) + +../libskit.a: + (cd ..; $(MAKE) $(MAKEFLAGS) libskit.a) + diff --git a/INOUT/semantic.cache b/INOUT/semantic.cache new file mode 100644 index 0000000..5676fe7 --- /dev/null +++ b/INOUT/semantic.cache @@ -0,0 +1,15 @@ +;; Object INOUT/ +;; SEMANTICDB Tags save file +(semanticdb-project-database-file "INOUT/" + :tables (list + (semanticdb-table "makefile" + :major-mode 'makefile-mode + :tags '(("FFLAGS" variable nil nil [1 11]) ("F77" variable (:default-value ("f77")) nil [11 21]) ("FILES1" variable (:default-value ("chkio.o")) nil [54 71]) ("FILES2" variable (:default-value ("hb2ps.o")) nil [71 89]) ("FILES3" variable (:default-value ("hb2pic.o")) nil [89 108]) ("chk.ex" function (:arguments ("$(FILES1)" "../MATGEN/FDIF/functns.o" "../libskit.a")) nil [109 242]) ("hb2ps.ex" function (:arguments ("$(FILES2)" "../libskit32.a")) nil [242 333]) ("hb2pic.ex" function (:arguments ("$(FILES3)" "../libskit.a")) nil [333 422]) ("clean" function nil nil [422 476]) ("../MATGEN/FDIF/functns.o" function nil nil [476 555]) ("../libskit.a" function nil nil [555 611])) + :file "makefile" + :pointmax 611 + ) + ) + :file "semantic.cache" + :semantic-tag-version "2.0pre3" + :semanticdb-version "2.0pre3" + ) diff --git a/ITSOL/README b/ITSOL/README new file mode 100644 index 0000000..e362ada --- /dev/null +++ b/ITSOL/README @@ -0,0 +1,63 @@ + + ----------------- + Current contents: + ----------------- + + Solvers + ------- + + iters.f : This file currently has several basic iterative linear system + solvers. They are: + CG -- Conjugate Gradient Method + CGNR -- Conjugate Gradient Method on Normal Residual equation + BCG -- Bi-Conjugate Gradient Method + BCGSTAB -- BCG stablized + TFQMR -- Transpose-Free Quasi-Minimum Residual method + GMRES -- Generalized Minimum RESidual method + FGMRES -- Flexible version of Generalized Minimum RESidual method + DQGMRES -- Direct verions of Quasi Generalized Minimum Residual + method + DBCG -- BCG with partial pivoting + + Preconditioners + --------------- + + ilut.f : ILUT + GMRES: a combination of a robust preconditioner + using dual thresholding for dropping strategy and + the GMRES algorithm. ILU0 and MILU0 are also provided + for comparison purposes. + large number of updates on Feb 10, 1992 Y.S. + ILUTP, or ILUT with partial pivoting is also provided. + + Drivers + ------- + + rilut.f : test program for GMRES/ILU*. + It tests three preconditioners ilu0, milu0 and ilut using + GMRES as the solver. + +riters.f : test program for ITERS -- the basic iterative solvers + with reverse communication. + The test matrix is generated with GEN57PT. + +riter2.f : test program for ITERS. It reads a Harwell/Boeing matrix + from the standard input. + + Other + ----- + + itaux.f : The file contains some of the auxiliary functions that is + required to run the test prgram rilut.f and riters.f It + includes the routine that drive the reverse-communincation + routines and the definitions of the partial differential + equations used to generate the matrix in rilut.f and + riters.f. + + executables + ----------- + + rilut.ex : generated by "make rilut.ex" from the driver rilut.f +riters.ex : generated by "make riters.ex" from the driver riters.f +riter2.ex : generated by "make riter2.ex" from the driver riter2.f + + see makefile for the details of the dependencies. diff --git a/ITSOL/ilut.f b/ITSOL/ilut.f new file mode 100644 index 0000000..5136347 --- /dev/null +++ b/ITSOL/ilut.f @@ -0,0 +1,2430 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c ITERATIVE SOLVERS MODULE c +c----------------------------------------------------------------------c +c This Version Dated: August 13, 1996. Warning: meaning of some c +c ============ arguments have changed w.r.t. earlier versions. Some c +c Calling sequences may also have changed c +c----------------------------------------------------------------------c +c Contents: c +c-------------------------preconditioners------------------------------c +c c +c ILUT : Incomplete LU factorization with dual truncation strategy c +c ILUTP : ILUT with column pivoting c +c ILUD : ILU with single dropping + diagonal compensation (~MILUT) c +c ILUDP : ILUD with column pivoting c +c ILUK : level-k ILU c +c ILU0 : simple ILU(0) preconditioning c +c MILU0 : MILU(0) preconditioning c +c c +c----------sample-accelerator-and-LU-solvers---------------------------c +c c +c PGMRES : preconditioned GMRES solver c +c LUSOL : forward followed by backward triangular solve (Precond.) c +c LUTSOL : solving v = (LU)^{-T} u (used for preconditioning) c +c c +c-------------------------utility-routine------------------------------c +c c +c QSPLIT : quick split routine used by ilut to sort out the k largest c +c elements in absolute value c +c c +c----------------------------------------------------------------------c +c c +c Note: all preconditioners are preprocessors to pgmres. c +c usage: call preconditioner then call pgmres c +c c +c----------------------------------------------------------------------c + subroutine ilut(n,a,ja,ia,lfil,droptol,alu,jlu,ju,iwk,w,jw,ierr) +c----------------------------------------------------------------------- + implicit none + integer n + real*8 a(*),alu(*),w(n+1),droptol + integer ja(*),ia(n+1),jlu(*),ju(n),jw(2*n),lfil,iwk,ierr +c----------------------------------------------------------------------* +c *** ILUT preconditioner *** * +c incomplete LU factorization with dual truncation mechanism * +c----------------------------------------------------------------------* +c Author: Yousef Saad *May, 5, 1990, Latest revision, August 1996 * +c----------------------------------------------------------------------* +c PARAMETERS +c----------- +c +c on entry: +c========== +c n = integer. The row dimension of the matrix A. The matrix +c +c a,ja,ia = matrix stored in Compressed Sparse Row format. +c +c lfil = integer. The fill-in parameter. Each row of L and each row +c of U will have a maximum of lfil elements (excluding the +c diagonal element). lfil must be .ge. 0. +c ** WARNING: THE MEANING OF LFIL HAS CHANGED WITH RESPECT TO +c EARLIER VERSIONS. +c +c droptol = real*8. Sets the threshold for dropping small terms in the +c factorization. See below for details on dropping strategy. +c +c +c iwk = integer. The lengths of arrays alu and jlu. If the arrays +c are not big enough to store the ILU factorizations, ilut +c will stop with an error message. +c +c On return: +c=========== +c +c alu,jlu = matrix stored in Modified Sparse Row (MSR) format containing +c the L and U factors together. The diagonal (stored in +c alu(1:n) ) is inverted. Each i-th row of the alu,jlu matrix +c contains the i-th row of L (excluding the diagonal entry=1) +c followed by the i-th row of U. +c +c ju = integer array of length n containing the pointers to +c the beginning of each row of U in the matrix alu,jlu. +c +c ierr = integer. Error message with the following meaning. +c ierr = 0 --> successful return. +c ierr .gt. 0 --> zero pivot encountered at step number ierr. +c ierr = -1 --> Error. input matrix may be wrong. +c (The elimination process has generated a +c row in L or U whose length is .gt. n.) +c ierr = -2 --> The matrix L overflows the array al. +c ierr = -3 --> The matrix U overflows the array alu. +c ierr = -4 --> Illegal value for lfil. +c ierr = -5 --> zero row encountered. +c +c work arrays: +c============= +c jw = integer work array of length 2*n. +c w = real work array of length n+1. +c +c---------------------------------------------------------------------- +c w, ju (1:n) store the working array [1:ii-1 = L-part, ii:n = u] +c jw(n+1:2n) stores nonzero indicators +c +c Notes: +c ------ +c The diagonal elements of the input matrix must be nonzero (at least +c 'structurally'). +c +c----------------------------------------------------------------------* +c---- Dual drop strategy works as follows. * +c * +c 1) Theresholding in L and U as set by droptol. Any element whose * +c magnitude is less than some tolerance (relative to the abs * +c value of diagonal element in u) is dropped. * +c * +c 2) Keeping only the largest lfil elements in the i-th row of L * +c and the largest lfil elements in the i-th row of U (excluding * +c diagonal elements). * +c * +c Flexibility: one can use droptol=0 to get a strategy based on * +c keeping the largest elements in each row of L and U. Taking * +c droptol .ne. 0 but lfil=n will give the usual threshold strategy * +c (however, fill-in is then mpredictible). * +c----------------------------------------------------------------------* +c locals + integer ju0,k,j1,j2,j,ii,i,lenl,lenu,jj,jrow,jpos,len + real*8 tnorm, t, abs, s, fact + if (lfil .lt. 0) goto 998 +c----------------------------------------------------------------------- +c initialize ju0 (points to next element to be added to alu,jlu) +c and pointer array. +c----------------------------------------------------------------------- + ju0 = n+2 + jlu(1) = ju0 +c +c initialize nonzero indicator array. +c + do 1 j=1,n + jw(n+j) = 0 + 1 continue +c----------------------------------------------------------------------- +c beginning of main loop. +c----------------------------------------------------------------------- + do 500 ii = 1, n + j1 = ia(ii) + j2 = ia(ii+1) - 1 + tnorm = 0.0d0 + do 501 k=j1,j2 + tnorm = tnorm+abs(a(k)) + 501 continue + if (tnorm .eq. 0.0) goto 999 + tnorm = tnorm/real(j2-j1+1) +c +c unpack L-part and U-part of row of A in arrays w +c + lenu = 1 + lenl = 0 + jw(ii) = ii + w(ii) = 0.0 + jw(n+ii) = ii +c + do 170 j = j1, j2 + k = ja(j) + t = a(j) + if (k .lt. ii) then + lenl = lenl+1 + jw(lenl) = k + w(lenl) = t + jw(n+k) = lenl + else if (k .eq. ii) then + w(ii) = t + else + lenu = lenu+1 + jpos = ii+lenu-1 + jw(jpos) = k + w(jpos) = t + jw(n+k) = jpos + endif + 170 continue + jj = 0 + len = 0 +c +c eliminate previous rows +c + 150 jj = jj+1 + if (jj .gt. lenl) goto 160 +c----------------------------------------------------------------------- +c in order to do the elimination in the correct order we must select +c the smallest column index among jw(k), k=jj+1, ..., lenl. +c----------------------------------------------------------------------- + jrow = jw(jj) + k = jj +c +c determine smallest column index +c + do 151 j=jj+1,lenl + if (jw(j) .lt. jrow) then + jrow = jw(j) + k = j + endif + 151 continue +c + if (k .ne. jj) then +c exchange in jw + j = jw(jj) + jw(jj) = jw(k) + jw(k) = j +c exchange in jr + jw(n+jrow) = jj + jw(n+j) = k +c exchange in w + s = w(jj) + w(jj) = w(k) + w(k) = s + endif +c +c zero out element in row by setting jw(n+jrow) to zero. +c + jw(n+jrow) = 0 +c +c get the multiplier for row to be eliminated (jrow). +c + fact = w(jj)*alu(jrow) + if (abs(fact) .le. droptol) goto 150 +c +c combine current row and row jrow +c + do 203 k = ju(jrow), jlu(jrow+1)-1 + s = fact*alu(k) + j = jlu(k) + jpos = jw(n+j) + if (j .ge. ii) then +c +c dealing with upper part. +c + if (jpos .eq. 0) then +c +c this is a fill-in element +c + lenu = lenu+1 + if (lenu .gt. n) goto 995 + i = ii+lenu-1 + jw(i) = j + jw(n+j) = i + w(i) = - s + else +c +c this is not a fill-in element +c + w(jpos) = w(jpos) - s + + endif + else +c +c dealing with lower part. +c + if (jpos .eq. 0) then +c +c this is a fill-in element +c + lenl = lenl+1 + if (lenl .gt. n) goto 995 + jw(lenl) = j + jw(n+j) = lenl + w(lenl) = - s + else +c +c this is not a fill-in element +c + w(jpos) = w(jpos) - s + endif + endif + 203 continue +c +c store this pivot element -- (from left to right -- no danger of +c overlap with the working elements in L (pivots). +c + len = len+1 + w(len) = fact + jw(len) = jrow + goto 150 + 160 continue +c +c reset double-pointer to zero (U-part) +c + do 308 k=1, lenu + jw(n+jw(ii+k-1)) = 0 + 308 continue +c +c update L-matrix +c + lenl = len + len = min0(lenl,lfil) +c +c sort by quick-split +c + call qsplit (w,jw,lenl,len) +c +c store L-part +c + do 204 k=1, len + if (ju0 .gt. iwk) goto 996 + alu(ju0) = w(k) + jlu(ju0) = jw(k) + ju0 = ju0+1 + 204 continue +c +c save pointer to beginning of row ii of U +c + ju(ii) = ju0 +c +c update U-matrix -- first apply dropping strategy +c + len = 0 + do k=1, lenu-1 + if (abs(w(ii+k)) .gt. droptol*tnorm) then + len = len+1 + w(ii+len) = w(ii+k) + jw(ii+len) = jw(ii+k) + endif + enddo + lenu = len+1 + len = min0(lenu,lfil) +c + call qsplit (w(ii+1), jw(ii+1), lenu-1,len) +c +c copy +c + t = abs(w(ii)) + if (len + ju0 .gt. iwk) goto 997 + do 302 k=ii+1,ii+len-1 + jlu(ju0) = jw(k) + alu(ju0) = w(k) + t = t + abs(w(k) ) + ju0 = ju0+1 + 302 continue +c +c store inverse of diagonal element of u +c + if (w(ii) .eq. 0.0) w(ii) = (0.0001 + droptol)*tnorm +c + alu(ii) = 1.0d0/ w(ii) +c +c update pointer to beginning of next row of U. +c + jlu(ii+1) = ju0 +c----------------------------------------------------------------------- +c end main loop +c----------------------------------------------------------------------- + 500 continue + ierr = 0 + return +c +c incomprehensible error. Matrix must be wrong. +c + 995 ierr = -1 + return +c +c insufficient storage in L. +c + 996 ierr = -2 + return +c +c insufficient storage in U. +c + 997 ierr = -3 + return +c +c illegal lfil entered. +c + 998 ierr = -4 + return +c +c zero row encountered +c + 999 ierr = -5 + return +c----------------end-of-ilut-------------------------------------------- +c----------------------------------------------------------------------- + end +c---------------------------------------------------------------------- + subroutine ilutp(n,a,ja,ia,lfil,droptol,permtol,mbloc,alu, + * jlu,ju,iwk,w,jw,iperm,ierr) +c----------------------------------------------------------------------- +c implicit none + integer n,ja(*),ia(n+1),lfil,jlu(*),ju(n),jw(2*n),iwk, + * iperm(2*n),ierr + real*8 a(*), alu(*), w(n+1), droptol +c----------------------------------------------------------------------* +c *** ILUTP preconditioner -- ILUT with pivoting *** * +c incomplete LU factorization with dual truncation mechanism * +c----------------------------------------------------------------------* +c author Yousef Saad *Sep 8, 1993 -- Latest revision, August 1996. * +c----------------------------------------------------------------------* +c on entry: +c========== +c n = integer. The dimension of the matrix A. +c +c a,ja,ia = matrix stored in Compressed Sparse Row format. +c ON RETURN THE COLUMNS OF A ARE PERMUTED. SEE BELOW FOR +c DETAILS. +c +c lfil = integer. The fill-in parameter. Each row of L and each row +c of U will have a maximum of lfil elements (excluding the +c diagonal element). lfil must be .ge. 0. +c ** WARNING: THE MEANING OF LFIL HAS CHANGED WITH RESPECT TO +c EARLIER VERSIONS. +c +c droptol = real*8. Sets the threshold for dropping small terms in the +c factorization. See below for details on dropping strategy. +c +c lfil = integer. The fill-in parameter. Each row of L and +c each row of U will have a maximum of lfil elements. +c WARNING: THE MEANING OF LFIL HAS CHANGED WITH RESPECT TO +c EARLIER VERSIONS. +c lfil must be .ge. 0. +c +c permtol = tolerance ratio used to determne whether or not to permute +c two columns. At step i columns i and j are permuted when +c +c abs(a(i,j))*permtol .gt. abs(a(i,i)) +c +c [0 --> never permute; good values 0.1 to 0.01] +c +c mbloc = if desired, permuting can be done only within the diagonal +c blocks of size mbloc. Useful for PDE problems with several +c degrees of freedom.. If feature not wanted take mbloc=n. +c +c +c iwk = integer. The lengths of arrays alu and jlu. If the arrays +c are not big enough to store the ILU factorizations, ilut +c will stop with an error message. +c +c On return: +c=========== +c +c alu,jlu = matrix stored in Modified Sparse Row (MSR) format containing +c the L and U factors together. The diagonal (stored in +c alu(1:n) ) is inverted. Each i-th row of the alu,jlu matrix +c contains the i-th row of L (excluding the diagonal entry=1) +c followed by the i-th row of U. +c +c ju = integer array of length n containing the pointers to +c the beginning of each row of U in the matrix alu,jlu. +c +c iperm = contains the permutation arrays. +c iperm(1:n) = old numbers of unknowns +c iperm(n+1:2*n) = reverse permutation = new unknowns. +c +c ierr = integer. Error message with the following meaning. +c ierr = 0 --> successful return. +c ierr .gt. 0 --> zero pivot encountered at step number ierr. +c ierr = -1 --> Error. input matrix may be wrong. +c (The elimination process has generated a +c row in L or U whose length is .gt. n.) +c ierr = -2 --> The matrix L overflows the array al. +c ierr = -3 --> The matrix U overflows the array alu. +c ierr = -4 --> Illegal value for lfil. +c ierr = -5 --> zero row encountered. +c +c work arrays: +c============= +c jw = integer work array of length 2*n. +c w = real work array of length n +c +c IMPORTANR NOTE: +c -------------- +c TO AVOID PERMUTING THE SOLUTION VECTORS ARRAYS FOR EACH LU-SOLVE, +C THE MATRIX A IS PERMUTED ON RETURN. [all column indices are +c changed]. SIMILARLY FOR THE U MATRIX. +c To permute the matrix back to its original state use the loop: +c +c do k=ia(1), ia(n+1)-1 +c ja(k) = iperm(ja(k)) +c enddo +c +c----------------------------------------------------------------------- +c local variables +c + integer k,i,j,jrow,ju0,ii,j1,j2,jpos,len,imax,lenu,lenl,jj,mbloc, + * icut + real*8 s, tmp, tnorm,xmax,xmax0, fact, abs, t, permtol +c + if (lfil .lt. 0) goto 998 +c----------------------------------------------------------------------- +c initialize ju0 (points to next element to be added to alu,jlu) +c and pointer array. +c----------------------------------------------------------------------- + ju0 = n+2 + jlu(1) = ju0 +c +c integer double pointer array. +c + do 1 j=1, n + jw(n+j) = 0 + iperm(j) = j + iperm(n+j) = j + 1 continue +c----------------------------------------------------------------------- +c beginning of main loop. +c----------------------------------------------------------------------- + do 500 ii = 1, n + j1 = ia(ii) + j2 = ia(ii+1) - 1 + tnorm = 0.0d0 + do 501 k=j1,j2 + tnorm = tnorm+abs(a(k)) + 501 continue + if (tnorm .eq. 0.0) goto 999 + tnorm = tnorm/(j2-j1+1) +c +c unpack L-part and U-part of row of A in arrays w -- +c + lenu = 1 + lenl = 0 + jw(ii) = ii + w(ii) = 0.0 + jw(n+ii) = ii +c + do 170 j = j1, j2 + k = iperm(n+ja(j)) + t = a(j) + if (k .lt. ii) then + lenl = lenl+1 + jw(lenl) = k + w(lenl) = t + jw(n+k) = lenl + else if (k .eq. ii) then + w(ii) = t + else + lenu = lenu+1 + jpos = ii+lenu-1 + jw(jpos) = k + w(jpos) = t + jw(n+k) = jpos + endif + 170 continue + jj = 0 + len = 0 +c +c eliminate previous rows +c + 150 jj = jj+1 + if (jj .gt. lenl) goto 160 +c----------------------------------------------------------------------- +c in order to do the elimination in the correct order we must select +c the smallest column index among jw(k), k=jj+1, ..., lenl. +c----------------------------------------------------------------------- + jrow = jw(jj) + k = jj +c +c determine smallest column index +c + do 151 j=jj+1,lenl + if (jw(j) .lt. jrow) then + jrow = jw(j) + k = j + endif + 151 continue +c + if (k .ne. jj) then +c exchange in jw + j = jw(jj) + jw(jj) = jw(k) + jw(k) = j +c exchange in jr + jw(n+jrow) = jj + jw(n+j) = k +c exchange in w + s = w(jj) + w(jj) = w(k) + w(k) = s + endif +c +c zero out element in row by resetting jw(n+jrow) to zero. +c + jw(n+jrow) = 0 +c +c get the multiplier for row to be eliminated: jrow +c + fact = w(jj)*alu(jrow) +c +c drop term if small +c + if (abs(fact) .le. droptol) goto 150 +c +c combine current row and row jrow +c + do 203 k = ju(jrow), jlu(jrow+1)-1 + s = fact*alu(k) +c new column number + j = iperm(n+jlu(k)) + jpos = jw(n+j) + if (j .ge. ii) then +c +c dealing with upper part. +c + if (jpos .eq. 0) then +c +c this is a fill-in element +c + lenu = lenu+1 + i = ii+lenu-1 + if (lenu .gt. n) goto 995 + jw(i) = j + jw(n+j) = i + w(i) = - s + else +c no fill-in element -- + w(jpos) = w(jpos) - s + endif + else +c +c dealing with lower part. +c + if (jpos .eq. 0) then +c +c this is a fill-in element +c + lenl = lenl+1 + if (lenl .gt. n) goto 995 + jw(lenl) = j + jw(n+j) = lenl + w(lenl) = - s + else +c +c this is not a fill-in element +c + w(jpos) = w(jpos) - s + endif + endif + 203 continue +c +c store this pivot element -- (from left to right -- no danger of +c overlap with the working elements in L (pivots). +c + len = len+1 + w(len) = fact + jw(len) = jrow + goto 150 + 160 continue +c +c reset double-pointer to zero (U-part) +c + do 308 k=1, lenu + jw(n+jw(ii+k-1)) = 0 + 308 continue +c +c update L-matrix +c + lenl = len + len = min0(lenl,lfil) +c +c sort by quick-split +c + call qsplit (w,jw,lenl,len) +c +c store L-part -- in original coordinates .. +c + do 204 k=1, len + if (ju0 .gt. iwk) goto 996 + alu(ju0) = w(k) + jlu(ju0) = iperm(jw(k)) + ju0 = ju0+1 + 204 continue +c +c save pointer to beginning of row ii of U +c + ju(ii) = ju0 +c +c update U-matrix -- first apply dropping strategy +c + len = 0 + do k=1, lenu-1 + if (abs(w(ii+k)) .gt. droptol*tnorm) then + len = len+1 + w(ii+len) = w(ii+k) + jw(ii+len) = jw(ii+k) + endif + enddo + lenu = len+1 + len = min0(lenu,lfil) + call qsplit (w(ii+1), jw(ii+1), lenu-1,len) +c +c determine next pivot -- +c + imax = ii + xmax = abs(w(imax)) + xmax0 = xmax + icut = ii - 1 + mbloc - mod(ii-1,mbloc) + do k=ii+1,ii+len-1 + t = abs(w(k)) + if (t .gt. xmax .and. t*permtol .gt. xmax0 .and. + * jw(k) .le. icut) then + imax = k + xmax = t + endif + enddo +c +c exchange w's +c + tmp = w(ii) + w(ii) = w(imax) + w(imax) = tmp +c +c update iperm and reverse iperm +c + j = jw(imax) + i = iperm(ii) + iperm(ii) = iperm(j) + iperm(j) = i +c +c reverse iperm +c + iperm(n+iperm(ii)) = ii + iperm(n+iperm(j)) = j +c----------------------------------------------------------------------- +c + if (len + ju0 .gt. iwk) goto 997 +c +c copy U-part in original coordinates +c + do 302 k=ii+1,ii+len-1 + jlu(ju0) = iperm(jw(k)) + alu(ju0) = w(k) + ju0 = ju0+1 + 302 continue +c +c store inverse of diagonal element of u +c + if (w(ii) .eq. 0.0) w(ii) = (1.0D-4 + droptol)*tnorm + alu(ii) = 1.0d0/ w(ii) +c +c update pointer to beginning of next row of U. +c + jlu(ii+1) = ju0 +c----------------------------------------------------------------------- +c end main loop +c----------------------------------------------------------------------- + 500 continue +c +c permute all column indices of LU ... +c + do k = jlu(1),jlu(n+1)-1 + jlu(k) = iperm(n+jlu(k)) + enddo +c +c ...and of A +c + do k=ia(1), ia(n+1)-1 + ja(k) = iperm(n+ja(k)) + enddo +c + ierr = 0 + return +c +c incomprehensible error. Matrix must be wrong. +c + 995 ierr = -1 + return +c +c insufficient storage in L. +c + 996 ierr = -2 + return +c +c insufficient storage in U. +c + 997 ierr = -3 + return +c +c illegal lfil entered. +c + 998 ierr = -4 + return +c +c zero row encountered +c + 999 ierr = -5 + return +c----------------end-of-ilutp------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine ilud(n,a,ja,ia,alph,tol,alu,jlu,ju,iwk,w,jw,ierr) +c----------------------------------------------------------------------- + implicit none + integer n + real*8 a(*),alu(*),w(2*n),tol, alph + integer ja(*),ia(n+1),jlu(*),ju(n),jw(2*n),iwk,ierr +c----------------------------------------------------------------------* +c *** ILUD preconditioner *** * +c incomplete LU factorization with standard droppoing strategy * +c----------------------------------------------------------------------* +c Author: Yousef Saad * Aug. 1995 -- * +c----------------------------------------------------------------------* +c This routine computes the ILU factorization with standard threshold * +c dropping: at i-th step of elimination, an element a(i,j) in row i is * +c dropped if it satisfies the criterion: * +c * +c abs(a(i,j)) < tol * [average magnitude of elements in row i of A] * +c * +c There is no control on memory size required for the factors as is * +c done in ILUT. This routines computes also various diagonal compensa- * +c tion ILU's such MILU. These are defined through the parameter alph * +c----------------------------------------------------------------------* +c on entry: +c========== +c n = integer. The row dimension of the matrix A. The matrix +c +c a,ja,ia = matrix stored in Compressed Sparse Row format +c +c alph = diagonal compensation parameter -- the term: +c +c alph*(sum of all dropped out elements in a given row) +c +c is added to the diagonal element of U of the factorization +c Thus: alph = 0 ---> ~ ILU with threshold, +c alph = 1 ---> ~ MILU with threshold. +c +c tol = Threshold parameter for dropping small terms in the +c factorization. During the elimination, a term a(i,j) is +c dropped whenever abs(a(i,j)) .lt. tol * [weighted norm of +c row i]. Here weighted norm = 1-norm / number of nnz +c elements in the row. +c +c iwk = The length of arrays alu and jlu -- this routine will stop +c if storage for the factors L and U is not sufficient +c +c On return: +c=========== +c +c alu,jlu = matrix stored in Modified Sparse Row (MSR) format containing +c the L and U factors together. The diagonal (stored in +c alu(1:n) ) is inverted. Each i-th row of the alu,jlu matrix +c contains the i-th row of L (excluding the diagonal entry=1) +c followed by the i-th row of U. +c +c ju = integer array of length n containing the pointers to +c the beginning of each row of U in the matrix alu,jlu. +c +c ierr = integer. Error message with the following meaning. +c ierr = 0 --> successful return. +c ierr .gt. 0 --> zero pivot encountered at step number ierr. +c ierr = -1 --> Error. input matrix may be wrong. +c (The elimination process has generated a +c row in L or U whose length is .gt. n.) +c ierr = -2 --> Insufficient storage for the LU factors -- +c arrays alu/ jalu are overflowed. +c ierr = -3 --> Zero row encountered. +c +c Work Arrays: +c============= +c jw = integer work array of length 2*n. +c w = real work array of length n +c +c---------------------------------------------------------------------- +c +c w, ju (1:n) store the working array [1:ii-1 = L-part, ii:n = u] +c jw(n+1:2n) stores the nonzero indicator. +c +c Notes: +c ------ +c All diagonal elements of the input matrix must be nonzero. +c +c----------------------------------------------------------------------- +c locals + integer ju0,k,j1,j2,j,ii,i,lenl,lenu,jj,jrow,jpos,len + real*8 tnorm, t, abs, s, fact, dropsum +c----------------------------------------------------------------------- +c initialize ju0 (points to next element to be added to alu,jlu) +c and pointer array. +c----------------------------------------------------------------------- + ju0 = n+2 + jlu(1) = ju0 +c +c initialize nonzero indicator array. +c + do 1 j=1,n + jw(n+j) = 0 + 1 continue +c----------------------------------------------------------------------- +c beginning of main loop. +c----------------------------------------------------------------------- + do 500 ii = 1, n + j1 = ia(ii) + j2 = ia(ii+1) - 1 + dropsum = 0.0d0 + tnorm = 0.0d0 + do 501 k=j1,j2 + tnorm = tnorm + abs(a(k)) + 501 continue + if (tnorm .eq. 0.0) goto 997 + tnorm = tnorm / real(j2-j1+1) +c +c unpack L-part and U-part of row of A in arrays w +c + lenu = 1 + lenl = 0 + jw(ii) = ii + w(ii) = 0.0 + jw(n+ii) = ii +c + do 170 j = j1, j2 + k = ja(j) + t = a(j) + if (k .lt. ii) then + lenl = lenl+1 + jw(lenl) = k + w(lenl) = t + jw(n+k) = lenl + else if (k .eq. ii) then + w(ii) = t + else + lenu = lenu+1 + jpos = ii+lenu-1 + jw(jpos) = k + w(jpos) = t + jw(n+k) = jpos + endif + 170 continue + jj = 0 + len = 0 +c +c eliminate previous rows +c + 150 jj = jj+1 + if (jj .gt. lenl) goto 160 +c----------------------------------------------------------------------- +c in order to do the elimination in the correct order we must select +c the smallest column index among jw(k), k=jj+1, ..., lenl. +c----------------------------------------------------------------------- + jrow = jw(jj) + k = jj +c +c determine smallest column index +c + do 151 j=jj+1,lenl + if (jw(j) .lt. jrow) then + jrow = jw(j) + k = j + endif + 151 continue +c + if (k .ne. jj) then +c exchange in jw + j = jw(jj) + jw(jj) = jw(k) + jw(k) = j +c exchange in jr + jw(n+jrow) = jj + jw(n+j) = k +c exchange in w + s = w(jj) + w(jj) = w(k) + w(k) = s + endif +c +c zero out element in row by setting resetting jw(n+jrow) to zero. +c + jw(n+jrow) = 0 +c +c drop term if small +c +c if (abs(w(jj)) .le. tol*tnorm) then +c dropsum = dropsum + w(jj) +c goto 150 +c endif +c +c get the multiplier for row to be eliminated (jrow). +c + fact = w(jj)*alu(jrow) +c +c drop term if small +c + if (abs(fact) .le. tol) then + dropsum = dropsum + w(jj) + goto 150 + endif +c +c combine current row and row jrow +c + do 203 k = ju(jrow), jlu(jrow+1)-1 + s = fact*alu(k) + j = jlu(k) + jpos = jw(n+j) + if (j .ge. ii) then +c +c dealing with upper part. +c + if (jpos .eq. 0) then +c +c this is a fill-in element +c + lenu = lenu+1 + if (lenu .gt. n) goto 995 + i = ii+lenu-1 + jw(i) = j + jw(n+j) = i + w(i) = - s + else +c +c this is not a fill-in element +c + w(jpos) = w(jpos) - s + endif + else +c +c dealing with lower part. +c + if (jpos .eq. 0) then +c +c this is a fill-in element +c + lenl = lenl+1 + if (lenl .gt. n) goto 995 + jw(lenl) = j + jw(n+j) = lenl + w(lenl) = - s + else +c +c this is not a fill-in element +c + w(jpos) = w(jpos) - s + endif + endif + 203 continue + len = len+1 + w(len) = fact + jw(len) = jrow + goto 150 + 160 continue +c +c reset double-pointer to zero (For U-part only) +c + do 308 k=1, lenu + jw(n+jw(ii+k-1)) = 0 + 308 continue +c +c update l-matrix +c + do 204 k=1, len + if (ju0 .gt. iwk) goto 996 + alu(ju0) = w(k) + jlu(ju0) = jw(k) + ju0 = ju0+1 + 204 continue +c +c save pointer to beginning of row ii of U +c + ju(ii) = ju0 +c +c go through elements in U-part of w to determine elements to keep +c + len = 0 + do k=1, lenu-1 +c if (abs(w(ii+k)) .gt. tnorm*tol) then + if (abs(w(ii+k)) .gt. abs(w(ii))*tol) then + len = len+1 + w(ii+len) = w(ii+k) + jw(ii+len) = jw(ii+k) + else + dropsum = dropsum + w(ii+k) + endif + enddo +c +c now update u-matrix +c + if (ju0 + len-1 .gt. iwk) goto 996 + do 302 k=ii+1,ii+len + jlu(ju0) = jw(k) + alu(ju0) = w(k) + ju0 = ju0+1 + 302 continue +c +c define diagonal element +c + w(ii) = w(ii) + alph*dropsum +c +c store inverse of diagonal element of u +c + if (w(ii) .eq. 0.0) w(ii) = (0.0001 + tol)*tnorm +c + alu(ii) = 1.0d0/ w(ii) +c +c update pointer to beginning of next row of U. +c + jlu(ii+1) = ju0 +c----------------------------------------------------------------------- +c end main loop +c----------------------------------------------------------------------- + 500 continue + ierr = 0 + return +c +c incomprehensible error. Matrix must be wrong. +c + 995 ierr = -1 + return +c +c insufficient storage in alu/ jlu arrays for L / U factors +c + 996 ierr = -2 + return +c +c zero row encountered +c + 997 ierr = -3 + return +c----------------end-of-ilud ------------------------------------------ +c----------------------------------------------------------------------- + end +c---------------------------------------------------------------------- + subroutine iludp(n,a,ja,ia,alph,droptol,permtol,mbloc,alu, + * jlu,ju,iwk,w,jw,iperm,ierr) +c----------------------------------------------------------------------- + implicit none + integer n,ja(*),ia(n+1),mbloc,jlu(*),ju(n),jw(2*n),iwk, + * iperm(2*n),ierr + real*8 a(*), alu(*), w(2*n), alph, droptol, permtol +c----------------------------------------------------------------------* +c *** ILUDP preconditioner *** * +c incomplete LU factorization with standard droppoing strategy * +c and column pivoting * +c----------------------------------------------------------------------* +c author Yousef Saad -- Aug 1995. * +c----------------------------------------------------------------------* +c on entry: +c========== +c n = integer. The dimension of the matrix A. +c +c a,ja,ia = matrix stored in Compressed Sparse Row format. +c ON RETURN THE COLUMNS OF A ARE PERMUTED. +c +c alph = diagonal compensation parameter -- the term: +c +c alph*(sum of all dropped out elements in a given row) +c +c is added to the diagonal element of U of the factorization +c Thus: alph = 0 ---> ~ ILU with threshold, +c alph = 1 ---> ~ MILU with threshold. +c +c droptol = tolerance used for dropping elements in L and U. +c elements are dropped if they are .lt. norm(row) x droptol +c row = row being eliminated +c +c permtol = tolerance ratio used for determning whether to permute +c two columns. Two columns are permuted only when +c abs(a(i,j))*permtol .gt. abs(a(i,i)) +c [0 --> never permute; good values 0.1 to 0.01] +c +c mbloc = if desired, permuting can be done only within the diagonal +c blocks of size mbloc. Useful for PDE problems with several +c degrees of freedom.. If feature not wanted take mbloc=n. +c +c iwk = integer. The declared lengths of arrays alu and jlu +c if iwk is not large enough the code will stop prematurely +c with ierr = -2 or ierr = -3 (see below). +c +c On return: +c=========== +c +c alu,jlu = matrix stored in Modified Sparse Row (MSR) format containing +c the L and U factors together. The diagonal (stored in +c alu(1:n) ) is inverted. Each i-th row of the alu,jlu matrix +c contains the i-th row of L (excluding the diagonal entry=1) +c followed by the i-th row of U. +c +c ju = integer array of length n containing the pointers to +c the beginning of each row of U in the matrix alu,jlu. +c iperm = contains the permutation arrays .. +c iperm(1:n) = old numbers of unknowns +c iperm(n+1:2*n) = reverse permutation = new unknowns. +c +c ierr = integer. Error message with the following meaning. +c ierr = 0 --> successful return. +c ierr .gt. 0 --> zero pivot encountered at step number ierr. +c ierr = -1 --> Error. input matrix may be wrong. +c (The elimination process has generated a +c row in L or U whose length is .gt. n.) +c ierr = -2 --> The L/U matrix overflows the arrays alu,jlu +c ierr = -3 --> zero row encountered. +c +c work arrays: +c============= +c jw = integer work array of length 2*n. +c w = real work array of length 2*n +c +c Notes: +c ------ +c IMPORTANT: TO AVOID PERMUTING THE SOLUTION VECTORS ARRAYS FOR EACH +c LU-SOLVE, THE MATRIX A IS PERMUTED ON RETURN. [all column indices are +c changed]. SIMILARLY FOR THE U MATRIX. +c To permute the matrix back to its original state use the loop: +c +c do k=ia(1), ia(n+1)-1 +c ja(k) = perm(ja(k)) +c enddo +c +c----------------------------------------------------------------------- +c local variables +c + integer k,i,j,jrow,ju0,ii,j1,j2,jpos,len,imax,lenu,lenl,jj,icut + real*8 s,tmp,tnorm,xmax,xmax0,fact,abs,t,dropsum +c----------------------------------------------------------------------- +c initialize ju0 (points to next element to be added to alu,jlu) +c and pointer array. +c----------------------------------------------------------------------- + ju0 = n+2 + jlu(1) = ju0 +c +c integer double pointer array. +c + do 1 j=1,n + jw(n+j) = 0 + iperm(j) = j + iperm(n+j) = j + 1 continue +c----------------------------------------------------------------------- +c beginning of main loop. +c----------------------------------------------------------------------- + do 500 ii = 1, n + j1 = ia(ii) + j2 = ia(ii+1) - 1 + dropsum = 0.0d0 + tnorm = 0.0d0 + do 501 k=j1,j2 + tnorm = tnorm+abs(a(k)) + 501 continue + if (tnorm .eq. 0.0) goto 997 + tnorm = tnorm/(j2-j1+1) +c +c unpack L-part and U-part of row of A in arrays w -- +c + lenu = 1 + lenl = 0 + jw(ii) = ii + w(ii) = 0.0 + jw(n+ii) = ii +c + do 170 j = j1, j2 + k = iperm(n+ja(j)) + t = a(j) + if (k .lt. ii) then + lenl = lenl+1 + jw(lenl) = k + w(lenl) = t + jw(n+k) = lenl + else if (k .eq. ii) then + w(ii) = t + else + lenu = lenu+1 + jpos = ii+lenu-1 + jw(jpos) = k + w(jpos) = t + jw(n+k) = jpos + endif + 170 continue + jj = 0 + len = 0 +c +c eliminate previous rows +c + 150 jj = jj+1 + if (jj .gt. lenl) goto 160 +c----------------------------------------------------------------------- +c in order to do the elimination in the correct order we must select +c the smallest column index among jw(k), k=jj+1, ..., lenl. +c----------------------------------------------------------------------- + jrow = jw(jj) + k = jj +c +c determine smallest column index +c + do 151 j=jj+1,lenl + if (jw(j) .lt. jrow) then + jrow = jw(j) + k = j + endif + 151 continue +c + if (k .ne. jj) then +c exchange in jw + j = jw(jj) + jw(jj) = jw(k) + jw(k) = j +c exchange in jr + jw(n+jrow) = jj + jw(n+j) = k +c exchange in w + s = w(jj) + w(jj) = w(k) + w(k) = s + endif +c +c zero out element in row by resetting jw(n+jrow) to zero. +c + jw(n+jrow) = 0 +c +c drop term if small +c + if (abs(w(jj)) .le. droptol*tnorm) then + dropsum = dropsum + w(jj) + goto 150 + endif +c +c get the multiplier for row to be eliminated: jrow +c + fact = w(jj)*alu(jrow) +c +c combine current row and row jrow +c + do 203 k = ju(jrow), jlu(jrow+1)-1 + s = fact*alu(k) +c new column number + j = iperm(n+jlu(k)) + jpos = jw(n+j) +c +c if fill-in element is small then disregard: +c + if (j .ge. ii) then +c +c dealing with upper part. +c + if (jpos .eq. 0) then +c this is a fill-in element + lenu = lenu+1 + i = ii+lenu-1 + if (lenu .gt. n) goto 995 + jw(i) = j + jw(n+j) = i + w(i) = - s + else +c no fill-in element -- + w(jpos) = w(jpos) - s + endif + else +c +c dealing with lower part. +c + if (jpos .eq. 0) then +c this is a fill-in element + lenl = lenl+1 + if (lenl .gt. n) goto 995 + jw(lenl) = j + jw(n+j) = lenl + w(lenl) = - s + else +c no fill-in element -- + w(jpos) = w(jpos) - s + endif + endif + 203 continue + len = len+1 + w(len) = fact + jw(len) = jrow + goto 150 + 160 continue +c +c reset double-pointer to zero (U-part) +c + do 308 k=1, lenu + jw(n+jw(ii+k-1)) = 0 + 308 continue +c +c update L-matrix +c + do 204 k=1, len + if (ju0 .gt. iwk) goto 996 + alu(ju0) = w(k) + jlu(ju0) = iperm(jw(k)) + ju0 = ju0+1 + 204 continue +c +c save pointer to beginning of row ii of U +c + ju(ii) = ju0 +c +c update u-matrix -- first apply dropping strategy +c + len = 0 + do k=1, lenu-1 + if (abs(w(ii+k)) .gt. tnorm*droptol) then + len = len+1 + w(ii+len) = w(ii+k) + jw(ii+len) = jw(ii+k) + else + dropsum = dropsum + w(ii+k) + endif + enddo +c + imax = ii + xmax = abs(w(imax)) + xmax0 = xmax + icut = ii - 1 + mbloc - mod(ii-1,mbloc) +c +c determine next pivot -- +c + do k=ii+1,ii+len + t = abs(w(k)) + if (t .gt. xmax .and. t*permtol .gt. xmax0 .and. + * jw(k) .le. icut) then + imax = k + xmax = t + endif + enddo +c +c exchange w's +c + tmp = w(ii) + w(ii) = w(imax) + w(imax) = tmp +c +c update iperm and reverse iperm +c + j = jw(imax) + i = iperm(ii) + iperm(ii) = iperm(j) + iperm(j) = i +c reverse iperm + iperm(n+iperm(ii)) = ii + iperm(n+iperm(j)) = j +c----------------------------------------------------------------------- + if (len + ju0-1 .gt. iwk) goto 996 +c +c copy U-part in original coordinates +c + do 302 k=ii+1,ii+len + jlu(ju0) = iperm(jw(k)) + alu(ju0) = w(k) + ju0 = ju0+1 + 302 continue +c +c define diagonal element +c + w(ii) = w(ii) + alph*dropsum +c +c store inverse of diagonal element of u +c + if (w(ii) .eq. 0.0) w(ii) = (1.0D-4 + droptol)*tnorm +c + alu(ii) = 1.0d0/ w(ii) +c +c update pointer to beginning of next row of U. +c + jlu(ii+1) = ju0 +c----------------------------------------------------------------------- +c end main loop +c----------------------------------------------------------------------- + 500 continue +c +c permute all column indices of LU ... +c + do k = jlu(1),jlu(n+1)-1 + jlu(k) = iperm(n+jlu(k)) + enddo +c +c ...and of A +c + do k=ia(1), ia(n+1)-1 + ja(k) = iperm(n+ja(k)) + enddo +c + ierr = 0 + return +c +c incomprehensible error. Matrix must be wrong. +c + 995 ierr = -1 + return +c +c insufficient storage in arrays alu, jlu to store factors +c + 996 ierr = -2 + return +c +c zero row encountered +c + 997 ierr = -3 + return +c----------------end-of-iludp---------------------------!---------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine iluk(n,a,ja,ia,lfil,alu,jlu,ju,levs,iwk,w,jw,ierr) + implicit none + integer n + real*8 a(*),alu(*),w(n) + integer ja(*),ia(n+1),jlu(*),ju(n),levs(*),jw(3*n),lfil,iwk,ierr +c----------------------------------------------------------------------* +c SPARSKIT ROUTINE ILUK -- ILU WITH LEVEL OF FILL-IN OF K (ILU(k)) * +c----------------------------------------------------------------------* +c +c on entry: +c========== +c n = integer. The row dimension of the matrix A. The matrix +c +c a,ja,ia = matrix stored in Compressed Sparse Row format. +c +c lfil = integer. The fill-in parameter. Each element whose +c leve-of-fill exceeds lfil during the ILU process is dropped. +c lfil must be .ge. 0 +c +c tol = real*8. Sets the threshold for dropping small terms in the +c factorization. See below for details on dropping strategy. +c +c iwk = integer. The minimum length of arrays alu, jlu, and levs. +c +c On return: +c=========== +c +c alu,jlu = matrix stored in Modified Sparse Row (MSR) format containing +c the L and U factors together. The diagonal (stored in +c alu(1:n) ) is inverted. Each i-th row of the alu,jlu matrix +c contains the i-th row of L (excluding the diagonal entry=1) +c followed by the i-th row of U. +c +c ju = integer array of length n containing the pointers to +c the beginning of each row of U in the matrix alu,jlu. +c +c levs = integer (work) array of size iwk -- which contains the +c levels of each element in alu, jlu. +c +c ierr = integer. Error message with the following meaning. +c ierr = 0 --> successful return. +c ierr .gt. 0 --> zero pivot encountered at step number ierr. +c ierr = -1 --> Error. input matrix may be wrong. +c (The elimination process has generated a +c row in L or U whose length is .gt. n.) +c ierr = -2 --> The matrix L overflows the array al. +c ierr = -3 --> The matrix U overflows the array alu. +c ierr = -4 --> Illegal value for lfil. +c ierr = -5 --> zero row encountered in A or U. +c +c work arrays: +c============= +c jw = integer work array of length 3*n. +c w = real work array of length n +c +c Notes/known bugs: This is not implemented efficiently storage-wise. +c For example: Only the part of the array levs(*) associated with +c the U-matrix is needed in the routine.. So some storage can +c be saved if needed. The levels of fills in the LU matrix are +c output for information only -- they are not needed by LU-solve. +c +c---------------------------------------------------------------------- +c w, ju (1:n) store the working array [1:ii-1 = L-part, ii:n = u] +c jw(n+1:2n) stores the nonzero indicator. +c +c Notes: +c ------ +c All the diagonal elements of the input matrix must be nonzero. +c +c----------------------------------------------------------------------* +c locals + integer ju0,k,j1,j2,j,ii,i,lenl,lenu,jj,jrow,jpos,n2, + * jlev, min + real*8 t, s, fact + if (lfil .lt. 0) goto 998 +c----------------------------------------------------------------------- +c initialize ju0 (points to next element to be added to alu,jlu) +c and pointer array. +c----------------------------------------------------------------------- + n2 = n+n + ju0 = n+2 + jlu(1) = ju0 +c +c initialize nonzero indicator array + levs array -- +c + do 1 j=1,2*n + jw(j) = 0 + 1 continue +c----------------------------------------------------------------------- +c beginning of main loop. +c----------------------------------------------------------------------- + do 500 ii = 1, n + j1 = ia(ii) + j2 = ia(ii+1) - 1 +c +c unpack L-part and U-part of row of A in arrays w +c + lenu = 1 + lenl = 0 + jw(ii) = ii + w(ii) = 0.0 + jw(n+ii) = ii +c + do 170 j = j1, j2 + k = ja(j) + t = a(j) + if (t .eq. 0.0) goto 170 + if (k .lt. ii) then + lenl = lenl+1 + jw(lenl) = k + w(lenl) = t + jw(n2+lenl) = 0 + jw(n+k) = lenl + else if (k .eq. ii) then + w(ii) = t + jw(n2+ii) = 0 + else + lenu = lenu+1 + jpos = ii+lenu-1 + jw(jpos) = k + w(jpos) = t + jw(n2+jpos) = 0 + jw(n+k) = jpos + endif + 170 continue +c + jj = 0 +c +c eliminate previous rows +c + 150 jj = jj+1 + if (jj .gt. lenl) goto 160 +c----------------------------------------------------------------------- +c in order to do the elimination in the correct order we must select +c the smallest column index among jw(k), k=jj+1, ..., lenl. +c----------------------------------------------------------------------- + jrow = jw(jj) + k = jj +c +c determine smallest column index +c + do 151 j=jj+1,lenl + if (jw(j) .lt. jrow) then + jrow = jw(j) + k = j + endif + 151 continue +c + if (k .ne. jj) then +c exchange in jw + j = jw(jj) + jw(jj) = jw(k) + jw(k) = j +c exchange in jw(n+ (pointers/ nonzero indicator). + jw(n+jrow) = jj + jw(n+j) = k +c exchange in jw(n2+ (levels) + j = jw(n2+jj) + jw(n2+jj) = jw(n2+k) + jw(n2+k) = j +c exchange in w + s = w(jj) + w(jj) = w(k) + w(k) = s + endif +c +c zero out element in row by resetting jw(n+jrow) to zero. +c + jw(n+jrow) = 0 +c +c get the multiplier for row to be eliminated (jrow) + its level +c + fact = w(jj)*alu(jrow) + jlev = jw(n2+jj) + if (jlev .gt. lfil) goto 150 +c +c combine current row and row jrow +c + do 203 k = ju(jrow), jlu(jrow+1)-1 + s = fact*alu(k) + j = jlu(k) + jpos = jw(n+j) + if (j .ge. ii) then +c +c dealing with upper part. +c + if (jpos .eq. 0) then +c +c this is a fill-in element +c + lenu = lenu+1 + if (lenu .gt. n) goto 995 + i = ii+lenu-1 + jw(i) = j + jw(n+j) = i + w(i) = - s + jw(n2+i) = jlev+levs(k)+1 + else +c +c this is not a fill-in element +c + w(jpos) = w(jpos) - s + jw(n2+jpos) = min(jw(n2+jpos),jlev+levs(k)+1) + endif + else +c +c dealing with lower part. +c + if (jpos .eq. 0) then +c +c this is a fill-in element +c + lenl = lenl+1 + if (lenl .gt. n) goto 995 + jw(lenl) = j + jw(n+j) = lenl + w(lenl) = - s + jw(n2+lenl) = jlev+levs(k)+1 + else +c +c this is not a fill-in element +c + w(jpos) = w(jpos) - s + jw(n2+jpos) = min(jw(n2+jpos),jlev+levs(k)+1) + endif + endif + 203 continue + w(jj) = fact + jw(jj) = jrow + goto 150 + 160 continue +c +c reset double-pointer to zero (U-part) +c + do 308 k=1, lenu + jw(n+jw(ii+k-1)) = 0 + 308 continue +c +c update l-matrix +c + do 204 k=1, lenl + if (ju0 .gt. iwk) goto 996 + if (jw(n2+k) .le. lfil) then + alu(ju0) = w(k) + jlu(ju0) = jw(k) + ju0 = ju0+1 + endif + 204 continue +c +c save pointer to beginning of row ii of U +c + ju(ii) = ju0 +c +c update u-matrix +c + do 302 k=ii+1,ii+lenu-1 + if (jw(n2+k) .le. lfil) then + jlu(ju0) = jw(k) + alu(ju0) = w(k) + levs(ju0) = jw(n2+k) + ju0 = ju0+1 + endif + 302 continue + + if (w(ii) .eq. 0.0) goto 999 +c + alu(ii) = 1.0d0/ w(ii) +c +c update pointer to beginning of next row of U. +c + jlu(ii+1) = ju0 +c----------------------------------------------------------------------- +c end main loop +c----------------------------------------------------------------------- + 500 continue + ierr = 0 + return +c +c incomprehensible error. Matrix must be wrong. +c + 995 ierr = -1 + return +c +c insufficient storage in L. +c + 996 ierr = -2 + return +c +c insufficient storage in U. +c + 997 ierr = -3 + return +c +c illegal lfil entered. +c + 998 ierr = -4 + return +c +c zero row encountered in A or U. +c + 999 ierr = -5 + return +c----------------end-of-iluk-------------------------------------------- +c----------------------------------------------------------------------- + end +c---------------------------------------------------------------------- + subroutine ilu0(n, a, ja, ia, alu, jlu, ju, iw, ierr) + implicit real*8 (a-h,o-z) + real*8 a(*), alu(*) + integer ja(*), ia(*), ju(*), jlu(*), iw(*) +c------------------ right preconditioner ------------------------------* +c *** ilu(0) preconditioner. *** * +c----------------------------------------------------------------------* +c Note that this has been coded in such a way that it can be used +c with pgmres. Normally, since the data structure of the L+U matrix is +c the same as that the A matrix, savings can be made. In fact with +c some definitions (not correct for general sparse matrices) all we +c need in addition to a, ja, ia is an additional diagonal. +c ILU0 is not recommended for serious problems. It is only provided +c here for comparison purposes. +c----------------------------------------------------------------------- +c +c on entry: +c--------- +c n = dimension of matrix +c a, ja, +c ia = original matrix in compressed sparse row storage. +c +c on return: +c----------- +c alu,jlu = matrix stored in Modified Sparse Row (MSR) format containing +c the L and U factors together. The diagonal (stored in +c alu(1:n) ) is inverted. Each i-th row of the alu,jlu matrix +c contains the i-th row of L (excluding the diagonal entry=1) +c followed by the i-th row of U. +c +c ju = pointer to the diagonal elements in alu, jlu. +c +c ierr = integer indicating error code on return +c ierr = 0 --> normal return +c ierr = k --> code encountered a zero pivot at step k. +c work arrays: +c------------- +c iw = integer work array of length n. +c------------ +c IMPORTANT +c----------- +c it is assumed that the the elements in the input matrix are stored +c in such a way that in each row the lower part comes first and +c then the upper part. To get the correct ILU factorization, it is +c also necessary to have the elements of L sorted by increasing +c column number. It may therefore be necessary to sort the +c elements of a, ja, ia prior to calling ilu0. This can be +c achieved by transposing the matrix twice using csrcsc. +c +c----------------------------------------------------------------------- + ju0 = n+2 + jlu(1) = ju0 +c +c initialize work vector to zero's +c + do 31 i=1, n + iw(i) = 0 + 31 continue +c +c main loop +c + do 500 ii = 1, n + js = ju0 +c +c generating row number ii of L and U. +c + do 100 j=ia(ii),ia(ii+1)-1 +c +c copy row ii of a, ja, ia into row ii of alu, jlu (L/U) matrix. +c + jcol = ja(j) + if (jcol .eq. ii) then + alu(ii) = a(j) + iw(jcol) = ii + ju(ii) = ju0 + else + alu(ju0) = a(j) + jlu(ju0) = ja(j) + iw(jcol) = ju0 + ju0 = ju0+1 + endif + 100 continue + jlu(ii+1) = ju0 + jf = ju0-1 + jm = ju(ii)-1 +c +c exit if diagonal element is reached. +c + do 150 j=js, jm + jrow = jlu(j) + tl = alu(j)*alu(jrow) + alu(j) = tl +c +c perform linear combination +c + do 140 jj = ju(jrow), jlu(jrow+1)-1 + jw = iw(jlu(jj)) + if (jw .ne. 0) alu(jw) = alu(jw) - tl*alu(jj) + 140 continue + 150 continue +c +c invert and store diagonal element. +c + if (alu(ii) .eq. 0.0d0) goto 600 + alu(ii) = 1.0d0/alu(ii) +c +c reset pointer iw to zero +c + iw(ii) = 0 + do 201 i = js, jf + 201 iw(jlu(i)) = 0 + 500 continue + ierr = 0 + return +c +c zero pivot : +c + 600 ierr = ii +c + return +c------- end-of-ilu0 --------------------------------------------------- +c----------------------------------------------------------------------- + end +c---------------------------------------------------------------------- + subroutine milu0(n, a, ja, ia, alu, jlu, ju, iw, ierr) + implicit real*8 (a-h,o-z) + real*8 a(*), alu(*) + integer ja(*), ia(*), ju(*), jlu(*), iw(*) +c----------------------------------------------------------------------* +c *** simple milu(0) preconditioner. *** * +c----------------------------------------------------------------------* +c Note that this has been coded in such a way that it can be used +c with pgmres. Normally, since the data structure of a, ja, ia is +c the same as that of a, ja, ia, savings can be made. In fact with +c some definitions (not correct for general sparse matrices) all we +c need in addition to a, ja, ia is an additional diagonal. +c Ilu0 is not recommended for serious problems. It is only provided +c here for comparison purposes. +c----------------------------------------------------------------------- +c +c on entry: +c---------- +c n = dimension of matrix +c a, ja, +c ia = original matrix in compressed sparse row storage. +c +c on return: +c---------- +c alu,jlu = matrix stored in Modified Sparse Row (MSR) format containing +c the L and U factors together. The diagonal (stored in +c alu(1:n) ) is inverted. Each i-th row of the alu,jlu matrix +c contains the i-th row of L (excluding the diagonal entry=1) +c followed by the i-th row of U. +c +c ju = pointer to the diagonal elements in alu, jlu. +c +c ierr = integer indicating error code on return +c ierr = 0 --> normal return +c ierr = k --> code encountered a zero pivot at step k. +c work arrays: +c------------- +c iw = integer work array of length n. +c------------ +c Note (IMPORTANT): +c----------- +C it is assumed that the the elements in the input matrix are ordered +c in such a way that in each row the lower part comes first and +c then the upper part. To get the correct ILU factorization, it is +c also necessary to have the elements of L ordered by increasing +c column number. It may therefore be necessary to sort the +c elements of a, ja, ia prior to calling milu0. This can be +c achieved by transposing the matrix twice using csrcsc. +c----------------------------------------------------------- + ju0 = n+2 + jlu(1) = ju0 +c initialize work vector to zero's + do 31 i=1, n + 31 iw(i) = 0 +c +c-------------- MAIN LOOP ---------------------------------- +c + do 500 ii = 1, n + js = ju0 +c +c generating row number ii or L and U. +c + do 100 j=ia(ii),ia(ii+1)-1 +c +c copy row ii of a, ja, ia into row ii of alu, jlu (L/U) matrix. +c + jcol = ja(j) + if (jcol .eq. ii) then + alu(ii) = a(j) + iw(jcol) = ii + ju(ii) = ju0 + else + alu(ju0) = a(j) + jlu(ju0) = ja(j) + iw(jcol) = ju0 + ju0 = ju0+1 + endif + 100 continue + jlu(ii+1) = ju0 + jf = ju0-1 + jm = ju(ii)-1 +c s accumulates fill-in values + s = 0.0d0 + do 150 j=js, jm + jrow = jlu(j) + tl = alu(j)*alu(jrow) + alu(j) = tl +c-----------------------perform linear combination -------- + do 140 jj = ju(jrow), jlu(jrow+1)-1 + jw = iw(jlu(jj)) + if (jw .ne. 0) then + alu(jw) = alu(jw) - tl*alu(jj) + else + s = s + tl*alu(jj) + endif + 140 continue + 150 continue +c----------------------- invert and store diagonal element. + alu(ii) = alu(ii)-s + if (alu(ii) .eq. 0.0d0) goto 600 + alu(ii) = 1.0d0/alu(ii) +c----------------------- reset pointer iw to zero + iw(ii) = 0 + do 201 i = js, jf + 201 iw(jlu(i)) = 0 + 500 continue + ierr = 0 + return +c zero pivot : + 600 ierr = ii + return +c------- end-of-milu0 -------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine pgmres(n, im, rhs, sol, vv, eps, maxits, iout, + * aa, ja, ia, alu, jlu, ju, ierr) +c----------------------------------------------------------------------- + implicit real*8 (a-h,o-z) + integer n, im, maxits, iout, ierr, ja(*), ia(n+1), jlu(*), ju(n) + real*8 vv(n,*), rhs(n), sol(n), aa(*), alu(*), eps +c----------------------------------------------------------------------* +c * +c *** ILUT - Preconditioned GMRES *** * +c * +c----------------------------------------------------------------------* +c This is a simple version of the ILUT preconditioned GMRES algorithm. * +c The ILUT preconditioner uses a dual strategy for dropping elements * +c instead of the usual level of-fill-in approach. See details in ILUT * +c subroutine documentation. PGMRES uses the L and U matrices generated * +c from the subroutine ILUT to precondition the GMRES algorithm. * +c The preconditioning is applied to the right. The stopping criterion * +c utilized is based simply on reducing the residual norm by epsilon. * +c This preconditioning is more reliable than ilu0 but requires more * +c storage. It seems to be much less prone to difficulties related to * +c strong nonsymmetries in the matrix. We recommend using a nonzero tol * +c (tol=.005 or .001 usually give good results) in ILUT. Use a large * +c lfil whenever possible (e.g. lfil = 5 to 10). The higher lfil the * +c more reliable the code is. Efficiency may also be much improved. * +c Note that lfil=n and tol=0.0 in ILUT will yield the same factors as * +c Gaussian elimination without pivoting. * +c * +c ILU(0) and MILU(0) are also provided for comparison purposes * +c USAGE: first call ILUT or ILU0 or MILU0 to set up preconditioner and * +c then call pgmres. * +c----------------------------------------------------------------------* +c Coded by Y. Saad - This version dated May, 7, 1990. * +c----------------------------------------------------------------------* +c parameters * +c----------- * +c on entry: * +c========== * +c * +c n == integer. The dimension of the matrix. * +c im == size of krylov subspace: should not exceed 50 in this * +c version (can be reset by changing parameter command for * +c kmax below) * +c rhs == real vector of length n containing the right hand side. * +c Destroyed on return. * +c sol == real vector of length n containing an initial guess to the * +c solution on input. approximate solution on output * +c eps == tolerance for stopping criterion. process is stopped * +c as soon as ( ||.|| is the euclidean norm): * +c || current residual||/||initial residual|| <= eps * +c maxits== maximum number of iterations allowed * +c iout == output unit number number for printing intermediate results * +c if (iout .le. 0) nothing is printed out. * +c * +c aa, ja, * +c ia == the input matrix in compressed sparse row format: * +c aa(1:nnz) = nonzero elements of A stored row-wise in order * +c ja(1:nnz) = corresponding column indices. * +c ia(1:n+1) = pointer to beginning of each row in aa and ja. * +c here nnz = number of nonzero elements in A = ia(n+1)-ia(1) * +c * +c alu,jlu== A matrix stored in Modified Sparse Row format containing * +c the L and U factors, as computed by subroutine ilut. * +c * +c ju == integer array of length n containing the pointers to * +c the beginning of each row of U in alu, jlu as computed * +c by subroutine ILUT. * +c * +c on return: * +c========== * +c sol == contains an approximate solution (upon successful return). * +c ierr == integer. Error message with the following meaning. * +c ierr = 0 --> successful return. * +c ierr = 1 --> convergence not achieved in itmax iterations. * +c ierr =-1 --> the initial guess seems to be the exact * +c solution (initial residual computed was zero) * +c * +c----------------------------------------------------------------------* +c * +c work arrays: * +c============= * +c vv == work array of length n x (im+1) (used to store the Arnoli * +c basis) * +c----------------------------------------------------------------------* +c subroutines called : * +c amux : SPARSKIT routine to do the matrix by vector multiplication * +c delivers y=Ax, given x -- see SPARSKIT/BLASSM/amux * +c lusol : combined forward and backward solves (Preconditioning ope.) * +c BLAS1 routines. * +c----------------------------------------------------------------------* + parameter (kmax=50) + real*8 hh(kmax+1,kmax), c(kmax), s(kmax), rs(kmax+1),t +c------------------------------------------------------------- +c arnoldi size should not exceed kmax=50 in this version.. +c to reset modify paramter kmax accordingly. +c------------------------------------------------------------- + data epsmac/1.d-16/ + n1 = n + 1 + its = 0 +c------------------------------------------------------------- +c outer loop starts here.. +c-------------- compute initial residual vector -------------- + call amux (n, sol, vv, aa, ja, ia) + do 21 j=1,n + vv(j,1) = rhs(j) - vv(j,1) + 21 continue +c------------------------------------------------------------- + 20 ro = dnrm2(n, vv, 1) + if (iout .gt. 0 .and. its .eq. 0) + * write(iout, 199) its, ro + if (ro .eq. 0.0d0) goto 999 + t = 1.0d0/ ro + do 210 j=1, n + vv(j,1) = vv(j,1)*t + 210 continue + if (its .eq. 0) eps1=eps*ro +c ** initialize 1-st term of rhs of hessenberg system.. + rs(1) = ro + i = 0 + 4 i=i+1 + its = its + 1 + i1 = i + 1 + call lusol (n, vv(1,i), rhs, alu, jlu, ju) + call amux (n, rhs, vv(1,i1), aa, ja, ia) +c----------------------------------------- +c modified gram - schmidt... +c----------------------------------------- + do 55 j=1, i + t = ddot(n, vv(1,j),1,vv(1,i1),1) + hh(j,i) = t + call daxpy(n, -t, vv(1,j), 1, vv(1,i1), 1) + 55 continue + t = dnrm2(n, vv(1,i1), 1) + hh(i1,i) = t + if ( t .eq. 0.0d0) goto 58 + t = 1.0d0/t + do 57 k=1,n + vv(k,i1) = vv(k,i1)*t + 57 continue +c +c done with modified gram schimd and arnoldi step.. +c now update factorization of hh +c + 58 if (i .eq. 1) goto 121 +c--------perfrom previous transformations on i-th column of h + do 66 k=2,i + k1 = k-1 + t = hh(k1,i) + hh(k1,i) = c(k1)*t + s(k1)*hh(k,i) + hh(k,i) = -s(k1)*t + c(k1)*hh(k,i) + 66 continue + 121 gam = sqrt(hh(i,i)**2 + hh(i1,i)**2) +c +c if gamma is zero then any small value will do... +c will affect only residual estimate +c + if (gam .eq. 0.0d0) gam = epsmac +c +c get next plane rotation +c + c(i) = hh(i,i)/gam + s(i) = hh(i1,i)/gam + rs(i1) = -s(i)*rs(i) + rs(i) = c(i)*rs(i) +c +c detrermine residual norm and test for convergence- +c + hh(i,i) = c(i)*hh(i,i) + s(i)*hh(i1,i) + ro = abs(rs(i1)) + 131 format(1h ,2e14.4) + if (iout .gt. 0) + * write(iout, 199) its, ro + if (i .lt. im .and. (ro .gt. eps1)) goto 4 +c +c now compute solution. first solve upper triangular system. +c + rs(i) = rs(i)/hh(i,i) + do 30 ii=2,i + k=i-ii+1 + k1 = k+1 + t=rs(k) + do 40 j=k1,i + t = t-hh(k,j)*rs(j) + 40 continue + rs(k) = t/hh(k,k) + 30 continue +c +c form linear combination of v(*,i)'s to get solution +c + t = rs(1) + do 15 k=1, n + rhs(k) = vv(k,1)*t + 15 continue + do 16 j=2, i + t = rs(j) + do 161 k=1, n + rhs(k) = rhs(k)+t*vv(k,j) + 161 continue + 16 continue +c +c call preconditioner. +c + call lusol (n, rhs, rhs, alu, jlu, ju) + do 17 k=1, n + sol(k) = sol(k) + rhs(k) + 17 continue +c +c restart outer loop when necessary +c + if (ro .le. eps1) goto 990 + if (its .ge. maxits) goto 991 +c +c else compute residual vector and continue.. +c + do 24 j=1,i + jj = i1-j+1 + rs(jj-1) = -s(jj-1)*rs(jj) + rs(jj) = c(jj-1)*rs(jj) + 24 continue + do 25 j=1,i1 + t = rs(j) + if (j .eq. 1) t = t-1.0d0 + call daxpy (n, t, vv(1,j), 1, vv, 1) + 25 continue + 199 format(' its =', i4, ' res. norm =', d20.6) +c restart outer loop. + goto 20 + 990 ierr = 0 + return + 991 ierr = 1 + return + 999 continue + ierr = -1 + return +c-----------------end of pgmres --------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine lusol(n, y, x, alu, jlu, ju) + real*8 x(n), y(n), alu(*) + integer n, jlu(*), ju(*) +c----------------------------------------------------------------------- +c +c This routine solves the system (LU) x = y, +c given an LU decomposition of a matrix stored in (alu, jlu, ju) +c modified sparse row format +c +c----------------------------------------------------------------------- +c on entry: +c n = dimension of system +c y = the right-hand-side vector +c alu, jlu, ju +c = the LU matrix as provided from the ILU routines. +c +c on return +c x = solution of LU x = y. +c----------------------------------------------------------------------- +c +c Note: routine is in place: call lusol (n, x, x, alu, jlu, ju) +c will solve the system with rhs x and overwrite the result on x . +c +c----------------------------------------------------------------------- +c local variables +c + integer i,k +c +c forward solve +c + do 40 i = 1, n + x(i) = y(i) + do 41 k=jlu(i),ju(i)-1 + x(i) = x(i) - alu(k)* x(jlu(k)) + 41 continue + 40 continue +c +c backward solve. +c + do 90 i = n, 1, -1 + do 91 k=ju(i),jlu(i+1)-1 + x(i) = x(i) - alu(k)*x(jlu(k)) + 91 continue + x(i) = alu(i)*x(i) + 90 continue +c + return +c----------------end of lusol ------------------------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine lutsol(n, y, x, alu, jlu, ju) + real*8 x(n), y(n), alu(*) + integer n, jlu(*), ju(*) +c----------------------------------------------------------------------- +c +c This routine solves the system Transp(LU) x = y, +c given an LU decomposition of a matrix stored in (alu, jlu, ju) +c modified sparse row format. Transp(M) is the transpose of M. +c----------------------------------------------------------------------- +c on entry: +c n = dimension of system +c y = the right-hand-side vector +c alu, jlu, ju +c = the LU matrix as provided from the ILU routines. +c +c on return +c x = solution of transp(LU) x = y. +c----------------------------------------------------------------------- +c +c Note: routine is in place: call lutsol (n, x, x, alu, jlu, ju) +c will solve the system with rhs x and overwrite the result on x . +c +c----------------------------------------------------------------------- +c local variables +c + integer i,k +c + do 10 i = 1, n + x(i) = y(i) + 10 continue +c +c forward solve (with U^T) +c + do 20 i = 1, n + x(i) = x(i) * alu(i) + do 30 k=ju(i),jlu(i+1)-1 + x(jlu(k)) = x(jlu(k)) - alu(k)* x(i) + 30 continue + 20 continue +c +c backward solve (with L^T) +c + do 40 i = n, 1, -1 + do 50 k=jlu(i),ju(i)-1 + x(jlu(k)) = x(jlu(k)) - alu(k)*x(i) + 50 continue + 40 continue +c + return +c----------------end of lutsol ----------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine qsplit(a,ind,n,ncut) + real*8 a(n) + integer ind(n), n, ncut +c----------------------------------------------------------------------- +c does a quick-sort split of a real array. +c on input a(1:n). is a real array +c on output a(1:n) is permuted such that its elements satisfy: +c +c abs(a(i)) .ge. abs(a(ncut)) for i .lt. ncut and +c abs(a(i)) .le. abs(a(ncut)) for i .gt. ncut +c +c ind(1:n) is an integer array which permuted in the same way as a(*). +c----------------------------------------------------------------------- + real*8 tmp, abskey + integer itmp, first, last +c----- + first = 1 + last = n + if (ncut .lt. first .or. ncut .gt. last) return +c +c outer loop -- while mid .ne. ncut do +c + 1 mid = first + abskey = abs(a(mid)) + do 2 j=first+1, last + if (abs(a(j)) .gt. abskey) then + mid = mid+1 +c interchange + tmp = a(mid) + itmp = ind(mid) + a(mid) = a(j) + ind(mid) = ind(j) + a(j) = tmp + ind(j) = itmp + endif + 2 continue +c +c interchange +c + tmp = a(mid) + a(mid) = a(first) + a(first) = tmp +c + itmp = ind(mid) + ind(mid) = ind(first) + ind(first) = itmp +c +c test for while loop +c + if (mid .eq. ncut) return + if (mid .gt. ncut) then + last = mid-1 + else + first = mid+1 + endif + goto 1 +c----------------end-of-qsplit------------------------------------------ +c----------------------------------------------------------------------- + end diff --git a/ITSOL/itaux.f b/ITSOL/itaux.f new file mode 100644 index 0000000..cfb1820 --- /dev/null +++ b/ITSOL/itaux.f @@ -0,0 +1,217 @@ + subroutine runrc(n,rhs,sol,ipar,fpar,wk,guess,a,ja,ia, + + au,jau,ju,solver) + implicit none + integer n,ipar(16),ia(n+1),ja(*),ju(*),jau(*) + real*8 fpar(16),rhs(n),sol(n),guess(n),wk(*),a(*),au(*) + external solver +c----------------------------------------------------------------------- +c the actual tester. It starts the iterative linear system solvers +c with a initial guess suppied by the user. +c +c The structure {au, jau, ju} is assumed to have the output from +c the ILU* routines in ilut.f. +c +c----------------------------------------------------------------------- +c local variables +c + integer i, iou, its + real*8 res, dnrm2 +c real dtime, dt(2), time +c external dtime + external dnrm2 + save its,res +c +c ipar(2) can be 0, 1, 2, please don't use 3 +c + if (ipar(2).gt.2) then + print *, 'I can not do both left and right preconditioning.' + return + endif +c +c normal execution +c + its = 0 + res = 0.0D0 +c + do i = 1, n + sol(i) = guess(i) + enddo +c + iou = 6 + ipar(1) = 0 +c time = dtime(dt) + 10 call solver(n,rhs,sol,ipar,fpar,wk) +c +c output the residuals +c + if (ipar(7).ne.its) then + write (iou, *) its, real(res) + its = ipar(7) + endif + res = fpar(5) +c + if (ipar(1).eq.1) then + call amux(n, wk(ipar(8)), wk(ipar(9)), a, ja, ia) + goto 10 + else if (ipar(1).eq.2) then + call atmux(n, wk(ipar(8)), wk(ipar(9)), a, ja, ia) + goto 10 + else if (ipar(1).eq.3 .or. ipar(1).eq.5) then + call lusol(n,wk(ipar(8)),wk(ipar(9)),au,jau,ju) + goto 10 + else if (ipar(1).eq.4 .or. ipar(1).eq.6) then + call lutsol(n,wk(ipar(8)),wk(ipar(9)),au,jau,ju) + goto 10 + else if (ipar(1).le.0) then + if (ipar(1).eq.0) then + print *, 'Iterative sovler has satisfied convergence test.' + else if (ipar(1).eq.-1) then + print *, 'Iterative solver has iterated too many times.' + else if (ipar(1).eq.-2) then + print *, 'Iterative solver was not given enough work space.' + print *, 'The work space should at least have ', ipar(4), + & ' elements.' + else if (ipar(1).eq.-3) then + print *, 'Iterative sovler is facing a break-down.' + else + print *, 'Iterative solver terminated. code =', ipar(1) + endif + endif +c time = dtime(dt) + write (iou, *) ipar(7), real(fpar(6)) + write (iou, *) '# retrun code =', ipar(1), + + ' convergence rate =', fpar(7) +c write (iou, *) '# total execution time (sec)', time +c +c check the error +c + call amux(n,sol,wk,a,ja,ia) + do i = 1, n + wk(n+i) = sol(i) -1.0D0 + wk(i) = wk(i) - rhs(i) + enddo + write (iou, *) '# the actual residual norm is', dnrm2(n,wk,1) + write (iou, *) '# the error norm is', dnrm2(n,wk(1+n),1) +c + if (iou.ne.6) close(iou) + return + end +c-----end-of-runrc +c----------------------------------------------------------------------- + function distdot(n,x,ix,y,iy) + integer n, ix, iy + real*8 distdot, x(*), y(*), ddot + external ddot + distdot = ddot(n,x,ix,y,iy) + return + end +c-----end-of-distdot +c----------------------------------------------------------------------- +c + function afun (x,y,z) + real*8 afun, x,y, z + afun = -1.0D0 + return + end + + function bfun (x,y,z) + real*8 bfun, x,y, z + bfun = -1.0D0 + return + end + + function cfun (x,y,z) + real*8 cfun, x,y, z + cfun = -1.0D0 + return + end + + function dfun (x,y,z) + real*8 dfun, x,y, z, gammax, gammay, alpha + common /func/ gammax, gammay, alpha + dfun = gammax*exp(x*y) + return + end + + function efun (x,y,z) + real*8 efun, x,y, z, gammax, gammay, alpha + common /func/ gammax, gammay, alpha + efun = gammay*exp(-x*y) + return + end + + function ffun (x,y,z) + real*8 ffun, x,y, z + ffun = 0.0D0 + return + end + + function gfun (x,y,z) + real*8 gfun, x,y, z, gammax, gammay, alpha + common /func/ gammax, gammay, alpha + gfun = alpha + return + end + + function hfun (x,y,z) + real*8 hfun, x,y, z, gammax, gammay, alpha + common /func/ gammax, gammay, alpha + hfun = alpha * sin(gammax*x+gammay*y-z) + return + end + + + function betfun(side, x, y, z) + real*8 betfun, x, y, z + character*2 side + betfun = 1.0 + return + end + + function gamfun(side, x, y, z) + real*8 gamfun, x, y, z + character*2 side + if (side.eq.'x2') then + gamfun = 5.0 + else if (side.eq.'y1') then + gamfun = 2.0 + else if (side.eq.'y2') then + gamfun = 7.0 + else + gamfun = 0.0 + endif + return + end +c----------------------------------------------------------------------- +c functions for the block PDE's +c----------------------------------------------------------------------- + subroutine afunbl (nfree,x,y,z,coeff) + return + end +c + subroutine bfunbl (nfree,x,y,z,coeff) + return + end + + subroutine cfunbl (nfree,x,y,z,coeff) +c + return + end + + subroutine dfunbl (nfree,x,y,z,coeff) + + return + end +c + subroutine efunbl (nfree,x,y,z,coeff) + return + end +c + subroutine ffunbl (nfree,x,y,z,coeff) + return + end +c + subroutine gfunbl (nfree,x,y,z,coeff) + return + end + diff --git a/ITSOL/iters.f b/ITSOL/iters.f new file mode 100644 index 0000000..f00c7d7 --- /dev/null +++ b/ITSOL/iters.f @@ -0,0 +1,3586 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c Basic Iterative Solvers with Reverse Communication c +c----------------------------------------------------------------------c +c This file currently has several basic iterative linear system c +c solvers. They are: c +c CG -- Conjugate Gradient Method c +c CGNR -- Conjugate Gradient Method (Normal Residual equation) c +c BCG -- Bi-Conjugate Gradient Method c +c DBCG -- BCG with partial pivoting c +c BCGSTAB -- BCG stabilized c +c TFQMR -- Transpose-Free Quasi-Minimum Residual method c +c FOM -- Full Orthogonalization Method c +c GMRES -- Generalized Minimum RESidual method c +c FGMRES -- Flexible version of Generalized Minimum c +c RESidual method c +c DQGMRES -- Direct versions of Quasi Generalize Minimum c +c Residual method c +c----------------------------------------------------------------------c +c They all have the following calling sequence: +c subroutine solver(n, rhs, sol, ipar, fpar, w) +c integer n, ipar(16) +c real*8 rhs(n), sol(n), fpar(16), w(*) +c Where +c (1) 'n' is the size of the linear system, +c (2) 'rhs' is the right-hand side of the linear system, +c (3) 'sol' is the solution to the linear system, +c (4) 'ipar' is an integer parameter array for the reverse +c communication protocol, +c (5) 'fpar' is an floating-point parameter array storing +c information to and from the iterative solvers. +c (6) 'w' is the work space (size is specified in ipar) +c +c They are preconditioned iterative solvers with reverse +c communication. The preconditioners can be applied from either +c from left or right or both (specified by ipar(2), see below). +c +c Author: Kesheng John Wu (kewu@mail.cs.umn.edu) 1993 +c +c NOTES: +c +c (1) Work space required by each of the iterative solver +c routines is as follows: +c CG == 5 * n +c CGNR == 5 * n +c BCG == 7 * n +c DBCG == 11 * n +c BCGSTAB == 8 * n +c TFQMR == 11 * n +c FOM == (n+3)*(m+2) + (m+1)*m/2 (m = ipar(5), default m=15) +c GMRES == (n+3)*(m+2) + (m+1)*m/2 (m = ipar(5), default m=15) +c FGMRES == 2*n*(m+1) + (m+1)*m/2 + 3*m + 2 (m = ipar(5), +c default m=15) +c DQGMRES == n + lb * (2*n+4) (lb=ipar(5)+1, default lb = 16) +c +c (2) ALL iterative solvers require a user-supplied DOT-product +c routine named DISTDOT. The prototype of DISTDOT is +c +c real*8 function distdot(n,x,ix,y,iy) +c integer n, ix, iy +c real*8 x(1+(n-1)*ix), y(1+(n-1)*iy) +c +c This interface of DISTDOT is exactly the same as that of +c DDOT (or SDOT if real == real*8) from BLAS-1. It should have +c same functionality as DDOT on a single processor machine. On a +c parallel/distributed environment, each processor can perform +c DDOT on the data it has, then perform a summation on all the +c partial results. +c +c (3) To use this set of routines under SPMD/MIMD program paradigm, +c several things are to be noted: (a) 'n' should be the number of +c vector elements of 'rhs' that is present on the local processor. +c (b) if RHS(i) is on processor j, it is expected that SOL(i) +c will be on the same processor, i.e. the vectors are distributed +c to each processor in the same way. (c) the preconditioning and +c stopping criteria specifications have to be the same on all +c processor involved, ipar and fpar have to be the same on each +c processor. (d) DISTDOT should be replaced by a distributed +c dot-product function. +c +c .................................................................. +c Reverse Communication Protocols +c +c When a reverse-communication routine returns, it could be either +c that the routine has terminated or it simply requires the caller +c to perform one matrix-vector multiplication. The possible matrices +c that involve in the matrix-vector multiplications are: +c A (the matrix of the linear system), +c A^T (A transposed), +c Ml^{-1} (inverse of the left preconditioner), +c Ml^{-T} (inverse of the left preconditioner transposed), +c Mr^{-1} (inverse of the right preconditioner), +c Mr^{-T} (inverse of the right preconditioner transposed). +c For all the matrix vector multiplication, v = A u. The input and +c output vectors are supposed to be part of the work space 'w', and +c the starting positions of them are stored in ipar(8:9), see below. +c +c The array 'ipar' is used to store the information about the solver. +c Here is the list of what each element represents: +c +c ipar(1) -- status of the call/return. +c A call to the solver with ipar(1) == 0 will initialize the +c iterative solver. On return from the iterative solver, ipar(1) +c carries the status flag which indicates the condition of the +c return. The status information is divided into two categories, +c (1) a positive value indicates the solver requires a matrix-vector +c multiplication, +c (2) a non-positive value indicates termination of the solver. +c Here is the current definition: +c 1 == request a matvec with A, +c 2 == request a matvec with A^T, +c 3 == request a left preconditioner solve (Ml^{-1}), +c 4 == request a left preconditioner transposed solve (Ml^{-T}), +c 5 == request a right preconditioner solve (Mr^{-1}), +c 6 == request a right preconditioner transposed solve (Mr^{-T}), +c 10 == request the caller to perform stopping test, +c 0 == normal termination of the solver, satisfied the stopping +c criteria, +c -1 == termination because iteration number is greater than the +c preset limit, +c -2 == return due to insufficient work space, +c -3 == return due to anticipated break-down / divide by zero, +c in the case where Arnoldi procedure is used, additional +c error code can be found in ipar(12), where ipar(12) is +c the error code of orthogonalization procedure MGSRO: +c -1: zero input vector +c -2: input vector contains abnormal numbers +c -3: input vector is a linear combination of others +c -4: trianguler system in GMRES/FOM/etc. has nul rank +c -4 == the values of fpar(1) and fpar(2) are both <= 0, the valid +c ranges are 0 <= fpar(1) < 1, 0 <= fpar(2), and they can +c not be zero at the same time +c -9 == while trying to detect a break-down, an abnormal number is +c detected. +c -10 == return due to some non-numerical reasons, e.g. invalid +c floating-point numbers etc. +c +c ipar(2) -- status of the preconditioning: +c 0 == no preconditioning +c 1 == left preconditioning only +c 2 == right preconditioning only +c 3 == both left and right preconditioning +c +c ipar(3) -- stopping criteria (details of this will be +c discussed later). +c +c ipar(4) -- number of elements in the array 'w'. if this is less +c than the desired size, it will be over-written with the minimum +c requirement. In which case the status flag ipar(1) = -2. +c +c ipar(5) -- size of the Krylov subspace (used by GMRES and its +c variants), e.g. GMRES(ipar(5)), FGMRES(ipar(5)), +c DQGMRES(ipar(5)). +c +c ipar(6) -- maximum number of matrix-vector multiplies, if not a +c positive number the iterative solver will run till convergence +c test is satisfied. +c +c ipar(7) -- current number of matrix-vector multiplies. It is +c incremented after each matrix-vector multiplication. If there +c is preconditioning, the counter is incremented after the +c preconditioning associated with each matrix-vector multiplication. +c +c ipar(8) -- pointer to the input vector to the requested matrix- +c vector multiplication. +c +c ipar(9) -- pointer to the output vector of the requested matrix- +c vector multiplication. +c +c To perform v = A * u, it is assumed that u is w(ipar(8):ipar(8)+n-1) +c and v is stored as w(ipar(9):ipar(9)+n-1). +c +c ipar(10) -- the return address (used to determine where to go to +c inside the iterative solvers after the caller has performed the +c requested services). +c +c ipar(11) -- the result of the external convergence test +c On final return from the iterative solvers, this value +c will be reflected by ipar(1) = 0 (details discussed later) +c +c ipar(12) -- error code of MGSRO, it is +c 1 if the input vector to MGSRO is linear combination +c of others, +c 0 if MGSRO was successful, +c -1 if the input vector to MGSRO is zero, +c -2 if the input vector contains invalid number. +c +c ipar(13) -- number of initializations. During each initilization +c residual norm is computed directly from M_l(b - A x). +c +c ipar(14) to ipar(16) are NOT defined, they are NOT USED by +c any iterative solver at this time. +c +c Information about the error and tolerance are stored in the array +c FPAR. So are some internal variables that need to be saved from +c one iteration to the next one. Since the internal variables are +c not the same for each routine, we only define the common ones. +c +c The first two are input parameters: +c fpar(1) -- the relative tolerance, +c fpar(2) -- the absolute tolerance (details discussed later), +c +c When the iterative solver terminates, +c fpar(3) -- initial residual/error norm, +c fpar(4) -- target residual/error norm, +c fpar(5) -- current residual norm (if available), +c fpar(6) -- current residual/error norm, +c fpar(7) -- convergence rate, +c +c fpar(8:10) are used by some of the iterative solvers to save some +c internal information. +c +c fpar(11) -- number of floating-point operations. The iterative +c solvers will add the number of FLOPS they used to this variable, +c but they do NOT initialize it, nor add the number of FLOPS due to +c matrix-vector multiplications (since matvec is outside of the +c iterative solvers). To insure the correct FLOPS count, the +c caller should set fpar(11) = 0 before invoking the iterative +c solvers and account for the number of FLOPS from matrix-vector +c multiplications and preconditioners. +c +c fpar(12:16) are not used in current implementation. +c +c Whether the content of fpar(3), fpar(4) and fpar(6) are residual +c norms or error norms depends on ipar(3). If the requested +c convergence test is based on the residual norm, they will be +c residual norms. If the caller want to test convergence based the +c error norms (estimated by the norm of the modifications applied +c to the approximate solution), they will be error norms. +c Convergence rate is defined by (Fortran 77 statement) +c fpar(7) = log10(fpar(3) / fpar(6)) / (ipar(7)-ipar(13)) +c If fpar(7) = 0.5, it means that approximately every 2 (= 1/0.5) +c steps the residual/error norm decrease by a factor of 10. +c +c .................................................................. +c Stopping criteria, +c +c An iterative solver may be terminated due to (1) satisfying +c convergence test; (2) exceeding iteration limit; (3) insufficient +c work space; (4) break-down. Checking of the work space is +c only done in the initialization stage, i.e. when it is called with +c ipar(1) == 0. A complete convergence test is done after each +c update of the solutions. Other conditions are monitored +c continuously. +c +c With regard to the number of iteration, when ipar(6) is positive, +c the current iteration number will be checked against it. If +c current iteration number is greater the ipar(6) than the solver +c will return with status -1. If ipar(6) is not positive, the +c iteration will continue until convergence test is satisfied. +c +c Two things may be used in the convergence tests, one is the +c residual 2-norm, the other one is 2-norm of the change in the +c approximate solution. The residual and the change in approximate +c solution are from the preconditioned system (if preconditioning +c is applied). The DQGMRES and TFQMR use two estimates for the +c residual norms. The estimates are not accurate, but they are +c acceptable in most of the cases. Generally speaking, the error +c of the TFQMR's estimate is less accurate. +c +c The convergence test type is indicated by ipar(3). There are four +c type convergence tests: (1) tests based on the residual norm; +c (2) tests based on change in approximate solution; (3) caller +c does not care, the solver choose one from above two on its own; +c (4) caller will perform the test, the solver should simply continue. +c Here is the complete definition: +c -2 == || dx(i) || <= rtol * || rhs || + atol +c -1 == || dx(i) || <= rtol * || dx(1) || + atol +c 0 == solver will choose test 1 (next) +c 1 == || residual || <= rtol * || initial residual || + atol +c 2 == || residual || <= rtol * || rhs || + atol +c 999 == caller will perform the test +c where dx(i) denote the change in the solution at the ith update. +c ||.|| denotes 2-norm. rtol = fpar(1) and atol = fpar(2). +c +c If the caller is to perform the convergence test, the outcome +c should be stored in ipar(11). +c ipar(11) = 0 -- failed the convergence test, iterative solver +c should continue +c ipar(11) = 1 -- satisfied convergence test, iterative solver +c should perform the clean up job and stop. +c +c Upon return with ipar(1) = 10, +c ipar(8) points to the starting position of the change in +c solution Sx, where the actual solution of the step is +c x_j = x_0 + M_r^{-1} Sx. +c Exception: ipar(8) < 0, Sx = 0. It is mostly used by +c GMRES and variants to indicate (1) Sx was not necessary, +c (2) intermediate result of Sx is not computed. +c ipar(9) points to the starting position of a work vector that +c can be used by the caller. +c +c NOTE: the caller should allow the iterative solver to perform +c clean up job after the external convergence test is satisfied, +c since some of the iterative solvers do not directly +c update the 'sol' array. A typical clean-up stage includes +c performing the final update of the approximate solution and +c computing the convergence information (e.g. values of fpar(3:7)). +c +c NOTE: fpar(4) and fpar(6) are not set by the accelerators (the +c routines implemented here) if ipar(3) = 999. +c +c .................................................................. +c Usage: +c +c To start solving a linear system, the user needs to specify +c first 6 elements of the ipar, and first 2 elements of fpar. +c The user may optionally set fpar(11) = 0 if one wants to count +c the number of floating-point operations. (Note: the iterative +c solvers will only add the floating-point operations inside +c themselves, the caller will have to add the FLOPS from the +c matrix-vector multiplication routines and the preconditioning +c routines in order to account for all the arithmetic operations.) +c +c Here is an example: +c ipar(1) = 0 ! always 0 to start an iterative solver +c ipar(2) = 2 ! right preconditioning +c ipar(3) = 1 ! use convergence test scheme 1 +c ipar(4) = 10000 ! the 'w' has 10,000 elements +c ipar(5) = 10 ! use *GMRES(10) (e.g. FGMRES(10)) +c ipar(6) = 100 ! use at most 100 matvec's +c fpar(1) = 1.0E-6 ! relative tolerance 1.0E-6 +c fpar(2) = 1.0E-10 ! absolute tolerance 1.0E-10 +c fpar(11) = 0.0 ! clearing the FLOPS counter +c +c After the above specifications, one can start to call an iterative +c solver, say BCG. Here is a piece of pseudo-code showing how it can +c be done, +c +c 10 call bcg(n,rhs,sol,ipar,fpar,w) +c if (ipar(1).eq.1) then +c call amux(n,w(ipar(8)),w(ipar(9)),a,ja,ia) +c goto 10 +c else if (ipar(1).eq.2) then +c call atmux(n,w(ipar(8)),w(ipar(9)),a,ja,ia) +c goto 10 +c else if (ipar(1).eq.3) then +c left preconditioner solver +c goto 10 +c else if (ipar(1).eq.4) then +c left preconditioner transposed solve +c goto 10 +c else if (ipar(1).eq.5) then +c right preconditioner solve +c goto 10 +c else if (ipar(1).eq.6) then +c right preconditioner transposed solve +c goto 10 +c else if (ipar(1).eq.10) then +c call my own stopping test routine +c goto 10 +c else if (ipar(1).gt.0) then +c ipar(1) is an unspecified code +c else +c the iterative solver terminated with code = ipar(1) +c endif +c +c This segment of pseudo-code assumes the matrix is in CSR format, +c AMUX and ATMUX are two routines from the SPARSKIT MATVEC module. +c They perform matrix-vector multiplications for CSR matrices, +c where w(ipar(8)) is the first element of the input vectors to the +c two routines, and w(ipar(9)) is the first element of the output +c vectors from them. For simplicity, we did not show the name of +c the routine that performs the preconditioning operations or the +c convergence tests. +c----------------------------------------------------------------------- + subroutine cg(n, rhs, sol, ipar, fpar, w) + implicit none + integer n, ipar(16) + real*8 rhs(n), sol(n), fpar(16), w(n,*) +c----------------------------------------------------------------------- +c This is a implementation of the Conjugate Gradient (CG) method +c for solving linear system. +c +c NOTE: This is not the PCG algorithm. It is a regular CG algorithm. +c To be consistent with the other solvers, the preconditioners are +c applied by performing Ml^{-1} A Mr^{-1} P in place of A P in the +c CG algorithm. PCG uses the preconditioner differently. +c +c fpar(7) is used here internally to store . +c w(:,1) -- residual vector +c w(:,2) -- P, the conjugate direction +c w(:,3) -- A P, matrix multiply the conjugate direction +c w(:,4) -- temporary storage for results of preconditioning +c w(:,5) -- change in the solution (sol) is stored here until +c termination of this solver +c----------------------------------------------------------------------- +c external functions used +c + real*8 distdot + logical stopbis, brkdn + external distdot, stopbis, brkdn, bisinit +c +c local variables +c + integer i + real*8 alpha + logical lp,rp + save +c +c check the status of the call +c + if (ipar(1).le.0) ipar(10) = 0 + goto (10, 20, 40, 50, 60, 70, 80), ipar(10) +c +c initialization +c + call bisinit(ipar,fpar,5*n,1,lp,rp,w) + if (ipar(1).lt.0) return +c +c request for matrix vector multiplication A*x in the initialization +c + ipar(1) = 1 + ipar(8) = n+1 + ipar(9) = ipar(8) + n + ipar(10) = 1 + do i = 1, n + w(i,2) = sol(i) + enddo + return + 10 ipar(7) = ipar(7) + 1 + ipar(13) = 1 + do i = 1, n + w(i,2) = rhs(i) - w(i,3) + enddo + fpar(11) = fpar(11) + n +c +c if left preconditioned +c + if (lp) then + ipar(1) = 3 + ipar(9) = 1 + ipar(10) = 2 + return + endif +c + 20 if (lp) then + do i = 1, n + w(i,2) = w(i,1) + enddo + else + do i = 1, n + w(i,1) = w(i,2) + enddo + endif +c + fpar(7) = distdot(n,w,1,w,1) + fpar(11) = fpar(11) + 2 * n + fpar(3) = sqrt(fpar(7)) + fpar(5) = fpar(3) + if (abs(ipar(3)).eq.2) then + fpar(4) = fpar(1) * sqrt(distdot(n,rhs,1,rhs,1)) + fpar(2) + fpar(11) = fpar(11) + 2 * n + else if (ipar(3).ne.999) then + fpar(4) = fpar(1) * fpar(3) + fpar(2) + endif +c +c before iteration can continue, we need to compute A * p, which +c includes the preconditioning operations +c + 30 if (rp) then + ipar(1) = 5 + ipar(8) = n + 1 + if (lp) then + ipar(9) = ipar(8) + n + else + ipar(9) = 3*n + 1 + endif + ipar(10) = 3 + return + endif +c + 40 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = n + 1 + endif + if (lp) then + ipar(9) = 3*n+1 + else + ipar(9) = n+n+1 + endif + ipar(10) = 4 + return +c + 50 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = n+n+1 + ipar(10) = 5 + return + endif +c +c continuing with the iterations +c + 60 ipar(7) = ipar(7) + 1 + alpha = distdot(n,w(1,2),1,w(1,3),1) + fpar(11) = fpar(11) + 2*n + if (brkdn(alpha,ipar)) goto 900 + alpha = fpar(7) / alpha + do i = 1, n + w(i,5) = w(i,5) + alpha * w(i,2) + w(i,1) = w(i,1) - alpha * w(i,3) + enddo + fpar(11) = fpar(11) + 4*n +c +c are we ready to terminate ? +c + if (ipar(3).eq.999) then + ipar(1) = 10 + ipar(8) = 4*n + 1 + ipar(9) = 3*n + 1 + ipar(10) = 6 + return + endif + 70 if (ipar(3).eq.999) then + if (ipar(11).eq.1) goto 900 + else if (stopbis(n,ipar,1,fpar,w,w(1,2),alpha)) then + goto 900 + endif +c +c continue the iterations +c + alpha = fpar(5)*fpar(5) / fpar(7) + fpar(7) = fpar(5)*fpar(5) + do i = 1, n + w(i,2) = w(i,1) + alpha * w(i,2) + enddo + fpar(11) = fpar(11) + 2*n + goto 30 +c +c clean up -- necessary to accommodate the right-preconditioning +c + 900 if (rp) then + if (ipar(1).lt.0) ipar(12) = ipar(1) + ipar(1) = 5 + ipar(8) = 4*n + 1 + ipar(9) = ipar(8) - n + ipar(10) = 7 + return + endif + 80 if (rp) then + call tidycg(n,ipar,fpar,sol,w(1,4)) + else + call tidycg(n,ipar,fpar,sol,w(1,5)) + endif +c + return + end +c-----end-of-cg +c----------------------------------------------------------------------- + subroutine cgnr(n,rhs,sol,ipar,fpar,wk) + implicit none + integer n, ipar(16) + real*8 rhs(n),sol(n),fpar(16),wk(n,*) +c----------------------------------------------------------------------- +c CGNR -- Using CG algorithm solving A x = b by solving +c Normal Residual equation: A^T A x = A^T b +c As long as the matrix is not singular, A^T A is symmetric +c positive definite, therefore CG (CGNR) will converge. +c +c Usage of the work space: +c wk(:,1) == residual vector R +c wk(:,2) == the conjugate direction vector P +c wk(:,3) == a scratch vector holds A P, or A^T R +c wk(:,4) == a scratch vector holds intermediate results of the +c preconditioning +c wk(:,5) == a place to hold the modification to SOL +c +c size of the work space WK is required = 5*n +c----------------------------------------------------------------------- +c external functions used +c + real*8 distdot + logical stopbis, brkdn + external distdot, stopbis, brkdn, bisinit +c +c local variables +c + integer i + real*8 alpha, zz, zzm1 + logical lp, rp + save +c +c check the status of the call +c + if (ipar(1).le.0) ipar(10) = 0 + goto (10, 20, 40, 50, 60, 70, 80, 90, 100, 110), ipar(10) +c +c initialization +c + call bisinit(ipar,fpar,5*n,1,lp,rp,wk) + if (ipar(1).lt.0) return +c +c request for matrix vector multiplication A*x in the initialization +c + ipar(1) = 1 + ipar(8) = 1 + ipar(9) = 1 + n + ipar(10) = 1 + do i = 1, n + wk(i,1) = sol(i) + enddo + return + 10 ipar(7) = ipar(7) + 1 + ipar(13) = ipar(13) + 1 + do i = 1, n + wk(i,1) = rhs(i) - wk(i,2) + enddo + fpar(11) = fpar(11) + n +c +c if left preconditioned, precondition the initial residual +c + if (lp) then + ipar(1) = 3 + ipar(10) = 2 + return + endif +c + 20 if (lp) then + do i = 1, n + wk(i,1) = wk(i,2) + enddo + endif +c + zz = distdot(n,wk,1,wk,1) + fpar(11) = fpar(11) + 2 * n + fpar(3) = sqrt(zz) + fpar(5) = fpar(3) + if (abs(ipar(3)).eq.2) then + fpar(4) = fpar(1) * sqrt(distdot(n,rhs,1,rhs,1)) + fpar(2) + fpar(11) = fpar(11) + 2 * n + else if (ipar(3).ne.999) then + fpar(4) = fpar(1) * fpar(3) + fpar(2) + endif +c +c normal iteration begins here, first half of the iteration +c computes the conjugate direction +c + 30 continue +c +c request the caller to perform a A^T r --> wk(:,3) +c + if (lp) then + ipar(1) = 4 + ipar(8) = 1 + if (rp) then + ipar(9) = n + n + 1 + else + ipar(9) = 3*n + 1 + endif + ipar(10) = 3 + return + endif +c + 40 ipar(1) = 2 + if (lp) then + ipar(8) = ipar(9) + else + ipar(8) = 1 + endif + if (rp) then + ipar(9) = 3*n + 1 + else + ipar(9) = n + n + 1 + endif + ipar(10) = 4 + return +c + 50 if (rp) then + ipar(1) = 6 + ipar(8) = ipar(9) + ipar(9) = n + n + 1 + ipar(10) = 5 + return + endif +c + 60 ipar(7) = ipar(7) + 1 + zzm1 = zz + zz = distdot(n,wk(1,3),1,wk(1,3),1) + fpar(11) = fpar(11) + 2 * n + if (brkdn(zz,ipar)) goto 900 + if (ipar(7).gt.3) then + alpha = zz / zzm1 + do i = 1, n + wk(i,2) = wk(i,3) + alpha * wk(i,2) + enddo + fpar(11) = fpar(11) + 2 * n + else + do i = 1, n + wk(i,2) = wk(i,3) + enddo + endif +c +c before iteration can continue, we need to compute A * p +c + if (rp) then + ipar(1) = 5 + ipar(8) = n + 1 + if (lp) then + ipar(9) = ipar(8) + n + else + ipar(9) = 3*n + 1 + endif + ipar(10) = 6 + return + endif +c + 70 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = n + 1 + endif + if (lp) then + ipar(9) = 3*n+1 + else + ipar(9) = n+n+1 + endif + ipar(10) = 7 + return +c + 80 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = n+n+1 + ipar(10) = 8 + return + endif +c +c update the solution -- accumulate the changes in w(:,5) +c + 90 ipar(7) = ipar(7) + 1 + alpha = distdot(n,wk(1,3),1,wk(1,3),1) + fpar(11) = fpar(11) + 2 * n + if (brkdn(alpha,ipar)) goto 900 + alpha = zz / alpha + do i = 1, n + wk(i,5) = wk(i,5) + alpha * wk(i,2) + wk(i,1) = wk(i,1) - alpha * wk(i,3) + enddo + fpar(11) = fpar(11) + 4 * n +c +c are we ready to terminate ? +c + if (ipar(3).eq.999) then + ipar(1) = 10 + ipar(8) = 4*n + 1 + ipar(9) = 3*n + 1 + ipar(10) = 9 + return + endif + 100 if (ipar(3).eq.999) then + if (ipar(11).eq.1) goto 900 + else if (stopbis(n,ipar,1,fpar,wk,wk(1,2),alpha)) then + goto 900 + endif +c +c continue the iterations +c + goto 30 +c +c clean up -- necessary to accommodate the right-preconditioning +c + 900 if (rp) then + if (ipar(1).lt.0) ipar(12) = ipar(1) + ipar(1) = 5 + ipar(8) = 4*n + 1 + ipar(9) = ipar(8) - n + ipar(10) = 10 + return + endif + 110 if (rp) then + call tidycg(n,ipar,fpar,sol,wk(1,4)) + else + call tidycg(n,ipar,fpar,sol,wk(1,5)) + endif + return + end +c-----end-of-cgnr +c----------------------------------------------------------------------- + subroutine bcg(n,rhs,sol,ipar,fpar,w) + implicit none + integer n, ipar(16) + real*8 fpar(16), rhs(n), sol(n), w(n,*) +c----------------------------------------------------------------------- +c BCG: Bi Conjugate Gradient method. Programmed with reverse +c communication, see the header for detailed specifications +c of the protocol. +c +c in this routine, before successful return, the fpar's are +c fpar(3) == initial residual norm +c fpar(4) == target residual norm +c fpar(5) == current residual norm +c fpar(7) == current rho (rhok = ) +c fpar(8) == previous rho (rhokm1) +c +c w(:,1) -- r, the residual +c w(:,2) -- s, the dual of the 'r' +c w(:,3) -- p, the projection direction +c w(:,4) -- q, the dual of the 'p' +c w(:,5) -- v, a scratch vector to store A*p, or A*q. +c w(:,6) -- a scratch vector to store intermediate results +c w(:,7) -- changes in the solution +c----------------------------------------------------------------------- +c external routines used +c + real*8 distdot + logical stopbis,brkdn + external distdot, stopbis, brkdn +c + real*8 one + parameter(one=1.0D0) +c +c local variables +c + integer i + real*8 alpha + logical rp, lp + save +c +c status of the program +c + if (ipar(1).le.0) ipar(10) = 0 + goto (10, 20, 40, 50, 60, 70, 80, 90, 100, 110), ipar(10) +c +c initialization, initial residual +c + call bisinit(ipar,fpar,7*n,1,lp,rp,w) + if (ipar(1).lt.0) return +c +c compute initial residual, request a matvecc +c + ipar(1) = 1 + ipar(8) = 3*n+1 + ipar(9) = ipar(8) + n + do i = 1, n + w(i,4) = sol(i) + enddo + ipar(10) = 1 + return + 10 ipar(7) = ipar(7) + 1 + ipar(13) = ipar(13) + 1 + do i = 1, n + w(i,1) = rhs(i) - w(i,5) + enddo + fpar(11) = fpar(11) + n + if (lp) then + ipar(1) = 3 + ipar(8) = 1 + ipar(9) = n+1 + ipar(10) = 2 + return + endif +c + 20 if (lp) then + do i = 1, n + w(i,1) = w(i,2) + w(i,3) = w(i,2) + w(i,4) = w(i,2) + enddo + else + do i = 1, n + w(i,2) = w(i,1) + w(i,3) = w(i,1) + w(i,4) = w(i,1) + enddo + endif +c + fpar(7) = distdot(n,w,1,w,1) + fpar(11) = fpar(11) + 2 * n + fpar(3) = sqrt(fpar(7)) + fpar(5) = fpar(3) + fpar(8) = one + if (abs(ipar(3)).eq.2) then + fpar(4) = fpar(1) * sqrt(distdot(n,rhs,1,rhs,1)) + fpar(2) + fpar(11) = fpar(11) + 2 * n + else if (ipar(3).ne.999) then + fpar(4) = fpar(1) * fpar(3) + fpar(2) + endif + if (ipar(3).ge.0.and.fpar(5).le.fpar(4)) then + fpar(6) = fpar(5) + goto 900 + endif +c +c end of initialization, begin iteration, v = A p +c + 30 if (rp) then + ipar(1) = 5 + ipar(8) = n + n + 1 + if (lp) then + ipar(9) = 4*n + 1 + else + ipar(9) = 5*n + 1 + endif + ipar(10) = 3 + return + endif +c + 40 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = n + n + 1 + endif + if (lp) then + ipar(9) = 5*n + 1 + else + ipar(9) = 4*n + 1 + endif + ipar(10) = 4 + return +c + 50 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = 4*n + 1 + ipar(10) = 5 + return + endif +c + 60 ipar(7) = ipar(7) + 1 + alpha = distdot(n,w(1,4),1,w(1,5),1) + fpar(11) = fpar(11) + 2 * n + if (brkdn(alpha,ipar)) goto 900 + alpha = fpar(7) / alpha + do i = 1, n + w(i,7) = w(i,7) + alpha * w(i,3) + w(i,1) = w(i,1) - alpha * w(i,5) + enddo + fpar(11) = fpar(11) + 4 * n + if (ipar(3).eq.999) then + ipar(1) = 10 + ipar(8) = 6*n + 1 + ipar(9) = 5*n + 1 + ipar(10) = 6 + return + endif + 70 if (ipar(3).eq.999) then + if (ipar(11).eq.1) goto 900 + else if (stopbis(n,ipar,1,fpar,w,w(1,3),alpha)) then + goto 900 + endif +c +c A^t * x +c + if (lp) then + ipar(1) = 4 + ipar(8) = 3*n + 1 + if (rp) then + ipar(9) = 4*n + 1 + else + ipar(9) = 5*n + 1 + endif + ipar(10) = 7 + return + endif +c + 80 ipar(1) = 2 + if (lp) then + ipar(8) = ipar(9) + else + ipar(8) = 3*n + 1 + endif + if (rp) then + ipar(9) = 5*n + 1 + else + ipar(9) = 4*n + 1 + endif + ipar(10) = 8 + return +c + 90 if (rp) then + ipar(1) = 6 + ipar(8) = ipar(9) + ipar(9) = 4*n + 1 + ipar(10) = 9 + return + endif +c + 100 ipar(7) = ipar(7) + 1 + do i = 1, n + w(i,2) = w(i,2) - alpha * w(i,5) + enddo + fpar(8) = fpar(7) + fpar(7) = distdot(n,w,1,w(1,2),1) + fpar(11) = fpar(11) + 4 * n + if (brkdn(fpar(7), ipar)) return + alpha = fpar(7) / fpar(8) + do i = 1, n + w(i,3) = w(i,1) + alpha * w(i,3) + w(i,4) = w(i,2) + alpha * w(i,4) + enddo + fpar(11) = fpar(11) + 4 * n +c +c end of the iterations +c + goto 30 +c +c some clean up job to do +c + 900 if (rp) then + if (ipar(1).lt.0) ipar(12) = ipar(1) + ipar(1) = 5 + ipar(8) = 6*n + 1 + ipar(9) = ipar(8) - n + ipar(10) = 10 + return + endif + 110 if (rp) then + call tidycg(n,ipar,fpar,sol,w(1,6)) + else + call tidycg(n,ipar,fpar,sol,w(1,7)) + endif + return +c-----end-of-bcg + end +c----------------------------------------------------------------------- + subroutine bcgstab(n, rhs, sol, ipar, fpar, w) + implicit none + integer n, ipar(16) + real*8 rhs(n), sol(n), fpar(16), w(n,8) +c----------------------------------------------------------------------- +c BCGSTAB --- Bi Conjugate Gradient stabilized (BCGSTAB) +c This is an improved BCG routine. (1) no matrix transpose is +c involved. (2) the convergence is smoother. +c +c +c Algorithm: +c Initialization - r = b - A x, r0 = r, p = r, rho = (r0, r), +c Iterate - +c (1) v = A p +c (2) alpha = rho / (r0, v) +c (3) s = r - alpha v +c (4) t = A s +c (5) omega = (t, s) / (t, t) +c (6) x = x + alpha * p + omega * s +c (7) r = s - omega * t +c convergence test goes here +c (8) beta = rho, rho = (r0, r), beta = rho * alpha / (beta * omega) +c p = r + beta * (p - omega * v) +c +c in this routine, before successful return, the fpar's are +c fpar(3) == initial (preconditionied-)residual norm +c fpar(4) == target (preconditionied-)residual norm +c fpar(5) == current (preconditionied-)residual norm +c fpar(6) == current residual norm or error +c fpar(7) == current rho (rhok = ) +c fpar(8) == alpha +c fpar(9) == omega +c +c Usage of the work space W +c w(:, 1) = r0, the initial residual vector +c w(:, 2) = r, current residual vector +c w(:, 3) = s +c w(:, 4) = t +c w(:, 5) = v +c w(:, 6) = p +c w(:, 7) = tmp, used in preconditioning, etc. +c w(:, 8) = delta x, the correction to the answer is accumulated +c here, so that the right-preconditioning may be applied +c at the end +c----------------------------------------------------------------------- +c external routines used +c + real*8 distdot + logical stopbis, brkdn + external distdot, stopbis, brkdn +c + real*8 one + parameter(one=1.0D0) +c +c local variables +c + integer i + real*8 alpha,beta,rho,omega + logical lp, rp + save lp, rp +c +c where to go +c + if (ipar(1).gt.0) then + goto (10, 20, 40, 50, 60, 70, 80, 90, 100, 110) ipar(10) + else if (ipar(1).lt.0) then + goto 900 + endif +c +c call the initialization routine +c + call bisinit(ipar,fpar,8*n,1,lp,rp,w) + if (ipar(1).lt.0) return +c +c perform a matvec to compute the initial residual +c + ipar(1) = 1 + ipar(8) = 1 + ipar(9) = 1 + n + do i = 1, n + w(i,1) = sol(i) + enddo + ipar(10) = 1 + return + 10 ipar(7) = ipar(7) + 1 + ipar(13) = ipar(13) + 1 + do i = 1, n + w(i,1) = rhs(i) - w(i,2) + enddo + fpar(11) = fpar(11) + n + if (lp) then + ipar(1) = 3 + ipar(10) = 2 + return + endif +c + 20 if (lp) then + do i = 1, n + w(i,1) = w(i,2) + w(i,6) = w(i,2) + enddo + else + do i = 1, n + w(i,2) = w(i,1) + w(i,6) = w(i,1) + enddo + endif +c + fpar(7) = distdot(n,w,1,w,1) + fpar(11) = fpar(11) + 2 * n + fpar(5) = sqrt(fpar(7)) + fpar(3) = fpar(5) + if (abs(ipar(3)).eq.2) then + fpar(4) = fpar(1) * sqrt(distdot(n,rhs,1,rhs,1)) + fpar(2) + fpar(11) = fpar(11) + 2 * n + else if (ipar(3).ne.999) then + fpar(4) = fpar(1) * fpar(3) + fpar(2) + endif + if (ipar(3).ge.0) fpar(6) = fpar(5) + if (ipar(3).ge.0 .and. fpar(5).le.fpar(4) .and. + + ipar(3).ne.999) then + goto 900 + endif +c +c beginning of the iterations +c +c Step (1), v = A p + 30 if (rp) then + ipar(1) = 5 + ipar(8) = 5*n+1 + if (lp) then + ipar(9) = 4*n + 1 + else + ipar(9) = 6*n + 1 + endif + ipar(10) = 3 + return + endif +c + 40 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = 5*n+1 + endif + if (lp) then + ipar(9) = 6*n + 1 + else + ipar(9) = 4*n + 1 + endif + ipar(10) = 4 + return + 50 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = 4*n + 1 + ipar(10) = 5 + return + endif +c + 60 ipar(7) = ipar(7) + 1 +c +c step (2) + alpha = distdot(n,w(1,1),1,w(1,5),1) + fpar(11) = fpar(11) + 2 * n + if (brkdn(alpha, ipar)) goto 900 + alpha = fpar(7) / alpha + fpar(8) = alpha +c +c step (3) + do i = 1, n + w(i,3) = w(i,2) - alpha * w(i,5) + enddo + fpar(11) = fpar(11) + 2 * n +c +c Step (4): the second matvec -- t = A s +c + if (rp) then + ipar(1) = 5 + ipar(8) = n+n+1 + if (lp) then + ipar(9) = ipar(8)+n + else + ipar(9) = 6*n + 1 + endif + ipar(10) = 6 + return + endif +c + 70 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = n+n+1 + endif + if (lp) then + ipar(9) = 6*n + 1 + else + ipar(9) = 3*n + 1 + endif + ipar(10) = 7 + return + 80 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = 3*n + 1 + ipar(10) = 8 + return + endif + 90 ipar(7) = ipar(7) + 1 +c +c step (5) + omega = distdot(n,w(1,4),1,w(1,4),1) + fpar(11) = fpar(11) + n + n + if (brkdn(omega,ipar)) goto 900 + omega = distdot(n,w(1,4),1,w(1,3),1) / omega + fpar(11) = fpar(11) + n + n + if (brkdn(omega,ipar)) goto 900 + fpar(9) = omega + alpha = fpar(8) +c +c step (6) and (7) + do i = 1, n + w(i,7) = alpha * w(i,6) + omega * w(i,3) + w(i,8) = w(i,8) + w(i,7) + w(i,2) = w(i,3) - omega * w(i,4) + enddo + fpar(11) = fpar(11) + 6 * n + 1 +c +c convergence test + if (ipar(3).eq.999) then + ipar(1) = 10 + ipar(8) = 7*n + 1 + ipar(9) = 6*n + 1 + ipar(10) = 9 + return + endif + if (stopbis(n,ipar,2,fpar,w(1,2),w(1,7),one)) goto 900 + 100 if (ipar(3).eq.999.and.ipar(11).eq.1) goto 900 +c +c step (8): computing new p and rho + rho = fpar(7) + fpar(7) = distdot(n,w(1,2),1,w(1,1),1) + omega = fpar(9) + beta = fpar(7) * fpar(8) / (fpar(9) * rho) + do i = 1, n + w(i,6) = w(i,2) + beta * (w(i,6) - omega * w(i,5)) + enddo + fpar(11) = fpar(11) + 6 * n + 3 + if (brkdn(fpar(7),ipar)) goto 900 +c +c end of an iteration +c + goto 30 +c +c some clean up job to do +c + 900 if (rp) then + if (ipar(1).lt.0) ipar(12) = ipar(1) + ipar(1) = 5 + ipar(8) = 7*n + 1 + ipar(9) = ipar(8) - n + ipar(10) = 10 + return + endif + 110 if (rp) then + call tidycg(n,ipar,fpar,sol,w(1,7)) + else + call tidycg(n,ipar,fpar,sol,w(1,8)) + endif +c + return +c-----end-of-bcgstab + end +c----------------------------------------------------------------------- + subroutine tfqmr(n, rhs, sol, ipar, fpar, w) + implicit none + integer n, ipar(16) + real*8 rhs(n), sol(n), fpar(16), w(n,*) +c----------------------------------------------------------------------- +c TFQMR --- transpose-free Quasi-Minimum Residual method +c This is developed from BCG based on the principle of Quasi-Minimum +c Residual, and it is transpose-free. +c +c It uses approximate residual norm. +c +c Internally, the fpar's are used as following: +c fpar(3) --- initial residual norm squared +c fpar(4) --- target residual norm squared +c fpar(5) --- current residual norm squared +c +c w(:,1) -- R, residual +c w(:,2) -- R0, the initial residual +c w(:,3) -- W +c w(:,4) -- Y +c w(:,5) -- Z +c w(:,6) -- A * Y +c w(:,7) -- A * Z +c w(:,8) -- V +c w(:,9) -- D +c w(:,10) -- intermediate results of preconditioning +c w(:,11) -- changes in the solution +c----------------------------------------------------------------------- +c external functions +c + real*8 distdot + logical brkdn + external brkdn, distdot +c + real*8 one,zero + parameter(one=1.0D0,zero=0.0D0) +c +c local variables +c + integer i + logical lp, rp + real*8 eta,sigma,theta,te,alpha,rho,tao + save +c +c status of the call (where to go) +c + if (ipar(1).le.0) ipar(10) = 0 + goto (10,20,40,50,60,70,80,90,100,110), ipar(10) +c +c initializations +c + call bisinit(ipar,fpar,11*n,2,lp,rp,w) + if (ipar(1).lt.0) return + ipar(1) = 1 + ipar(8) = 1 + ipar(9) = 1 + 6*n + do i = 1, n + w(i,1) = sol(i) + enddo + ipar(10) = 1 + return + 10 ipar(7) = ipar(7) + 1 + ipar(13) = ipar(13) + 1 + do i = 1, n + w(i,1) = rhs(i) - w(i,7) + w(i,9) = zero + enddo + fpar(11) = fpar(11) + n +c + if (lp) then + ipar(1) = 3 + ipar(9) = n+1 + ipar(10) = 2 + return + endif + 20 continue + if (lp) then + do i = 1, n + w(i,1) = w(i,2) + w(i,3) = w(i,2) + enddo + else + do i = 1, n + w(i,2) = w(i,1) + w(i,3) = w(i,1) + enddo + endif +c + fpar(5) = sqrt(distdot(n,w,1,w,1)) + fpar(3) = fpar(5) + tao = fpar(5) + fpar(11) = fpar(11) + n + n + if (abs(ipar(3)).eq.2) then + fpar(4) = fpar(1) * sqrt(distdot(n,rhs,1,rhs,1)) + fpar(2) + fpar(11) = fpar(11) + n + n + else if (ipar(3).ne.999) then + fpar(4) = fpar(1) * tao + fpar(2) + endif + te = zero + rho = zero +c +c begin iteration +c + 30 sigma = rho + rho = distdot(n,w(1,2),1,w(1,3),1) + fpar(11) = fpar(11) + n + n + if (brkdn(rho,ipar)) goto 900 + if (ipar(7).eq.1) then + alpha = zero + else + alpha = rho / sigma + endif + do i = 1, n + w(i,4) = w(i,3) + alpha * w(i,5) + enddo + fpar(11) = fpar(11) + n + n +c +c A * x -- with preconditioning +c + if (rp) then + ipar(1) = 5 + ipar(8) = 3*n + 1 + if (lp) then + ipar(9) = 5*n + 1 + else + ipar(9) = 9*n + 1 + endif + ipar(10) = 3 + return + endif +c + 40 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = 3*n + 1 + endif + if (lp) then + ipar(9) = 9*n + 1 + else + ipar(9) = 5*n + 1 + endif + ipar(10) = 4 + return +c + 50 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = 5*n + 1 + ipar(10) = 5 + return + endif + 60 ipar(7) = ipar(7) + 1 + do i = 1, n + w(i,8) = w(i,6) + alpha * (w(i,7) + alpha * w(i,8)) + enddo + sigma = distdot(n,w(1,2),1,w(1,8),1) + fpar(11) = fpar(11) + 6 * n + if (brkdn(sigma,ipar)) goto 900 + alpha = rho / sigma + do i = 1, n + w(i,5) = w(i,4) - alpha * w(i,8) + enddo + fpar(11) = fpar(11) + 2*n +c +c the second A * x +c + if (rp) then + ipar(1) = 5 + ipar(8) = 4*n + 1 + if (lp) then + ipar(9) = 6*n + 1 + else + ipar(9) = 9*n + 1 + endif + ipar(10) = 6 + return + endif +c + 70 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = 4*n + 1 + endif + if (lp) then + ipar(9) = 9*n + 1 + else + ipar(9) = 6*n + 1 + endif + ipar(10) = 7 + return +c + 80 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = 6*n + 1 + ipar(10) = 8 + return + endif + 90 ipar(7) = ipar(7) + 1 + do i = 1, n + w(i,3) = w(i,3) - alpha * w(i,6) + enddo +c +c update I +c + theta = distdot(n,w(1,3),1,w(1,3),1) / (tao*tao) + sigma = one / (one + theta) + tao = tao * sqrt(sigma * theta) + fpar(11) = fpar(11) + 4*n + 6 + if (brkdn(tao,ipar)) goto 900 + eta = sigma * alpha + sigma = te / alpha + te = theta * eta + do i = 1, n + w(i,9) = w(i,4) + sigma * w(i,9) + w(i,11) = w(i,11) + eta * w(i,9) + w(i,3) = w(i,3) - alpha * w(i,7) + enddo + fpar(11) = fpar(11) + 6 * n + 6 + if (ipar(7).eq.1) then + if (ipar(3).eq.-1) then + fpar(3) = eta * sqrt(distdot(n,w(1,9),1,w(1,9),1)) + fpar(4) = fpar(1)*fpar(3) + fpar(2) + fpar(11) = fpar(11) + n + n + 4 + endif + endif +c +c update II +c + theta = distdot(n,w(1,3),1,w(1,3),1) / (tao*tao) + sigma = one / (one + theta) + tao = tao * sqrt(sigma * theta) + fpar(11) = fpar(11) + 8 + 2*n + if (brkdn(tao,ipar)) goto 900 + eta = sigma * alpha + sigma = te / alpha + te = theta * eta + do i = 1, n + w(i,9) = w(i,5) + sigma * w(i,9) + w(i,11) = w(i,11) + eta * w(i,9) + enddo + fpar(11) = fpar(11) + 4*n + 3 +c +c this is the correct over-estimate +c fpar(5) = sqrt(real(ipar(7)+1)) * tao +c this is an approximation + fpar(5) = tao + if (ipar(3).eq.999) then + ipar(1) = 10 + ipar(8) = 10*n + 1 + ipar(9) = 9*n + 1 + ipar(10) = 9 + return + else if (ipar(3).lt.0) then + fpar(6) = eta * sqrt(distdot(n,w(1,9),1,w(1,9),1)) + fpar(11) = fpar(11) + n + n + 2 + else + fpar(6) = fpar(5) + endif + if (fpar(6).gt.fpar(4) .and. (ipar(7).lt.ipar(6) + + .or. ipar(6).le.0)) goto 30 + 100 if (ipar(3).eq.999.and.ipar(11).eq.0) goto 30 +c +c clean up +c + 900 if (rp) then + if (ipar(1).lt.0) ipar(12) = ipar(1) + ipar(1) = 5 + ipar(8) = 10*n + 1 + ipar(9) = ipar(8) - n + ipar(10) = 10 + return + endif + 110 if (rp) then + call tidycg(n,ipar,fpar,sol,w(1,10)) + else + call tidycg(n,ipar,fpar,sol,w(1,11)) + endif +c + return + end +c-----end-of-tfqmr +c----------------------------------------------------------------------- + subroutine fom(n, rhs, sol, ipar, fpar, w) + implicit none + integer n, ipar(16) + real*8 rhs(n), sol(n), fpar(16), w(*) +c----------------------------------------------------------------------- +c This a version of The Full Orthogonalization Method (FOM) +c implemented with reverse communication. It is a simple restart +c version of the FOM algorithm and is implemented with plane +c rotations similarly to GMRES. +c +c parameters: +c ----------- +c ipar(5) == the dimension of the Krylov subspace +c after every ipar(5) iterations, the FOM will restart with +c the updated solution and recomputed residual vector. +c +c the work space in `w' is used as follows: +c (1) the basis for the Krylov subspace, size n*(m+1); +c (2) the Hessenberg matrix, only the upper triangular +c portion of the matrix is stored, size (m+1)*m/2 + 1 +c (3) three vectors, all are of size m, they are +c the cosine and sine of the Givens rotations, the third one holds +c the residuals, it is of size m+1. +c +c TOTAL SIZE REQUIRED == (n+3)*(m+2) + (m+1)*m/2 +c Note: m == ipar(5). The default value for this is 15 if +c ipar(5) <= 1. +c----------------------------------------------------------------------- +c external functions used +c + real*8 distdot + external distdot +c + real*8 one, zero + parameter(one=1.0D0, zero=0.0D0) +c +c local variables, ptr and p2 are temporary pointers, +c hes points to the Hessenberg matrix, +c vc, vs point to the cosines and sines of the Givens rotations +c vrn points to the vectors of residual norms, more precisely +c the right hand side of the least square problem solved. +c + integer i,ii,idx,k,m,ptr,p2,prs,hes,vc,vs,vrn + real*8 alpha, c, s + logical lp, rp + save +c +c check the status of the call +c + if (ipar(1).le.0) ipar(10) = 0 + goto (10, 20, 30, 40, 50, 60, 70) ipar(10) +c +c initialization +c + if (ipar(5).le.1) then + m = 15 + else + m = ipar(5) + endif + idx = n * (m+1) + hes = idx + n + vc = hes + (m+1) * m / 2 + 1 + vs = vc + m + vrn = vs + m + i = vrn + m + 1 + call bisinit(ipar,fpar,i,1,lp,rp,w) + if (ipar(1).lt.0) return +c +c request for matrix vector multiplication A*x in the initialization +c + 100 ipar(1) = 1 + ipar(8) = n+1 + ipar(9) = 1 + ipar(10) = 1 + k = 0 + do i = 1, n + w(n+i) = sol(i) + enddo + return + 10 ipar(7) = ipar(7) + 1 + ipar(13) = ipar(13) + 1 + if (lp) then + do i = 1, n + w(n+i) = rhs(i) - w(i) + enddo + ipar(1) = 3 + ipar(10) = 2 + return + else + do i = 1, n + w(i) = rhs(i) - w(i) + enddo + endif + fpar(11) = fpar(11) + n +c + 20 alpha = sqrt(distdot(n,w,1,w,1)) + fpar(11) = fpar(11) + 2*n + 1 + if (ipar(7).eq.1 .and. ipar(3).ne.999) then + if (abs(ipar(3)).eq.2) then + fpar(4) = fpar(1) * sqrt(distdot(n,rhs,1,rhs,1)) + fpar(2) + fpar(11) = fpar(11) + 2*n + else + fpar(4) = fpar(1) * alpha + fpar(2) + endif + fpar(3) = alpha + endif + fpar(5) = alpha + w(vrn+1) = alpha + if (alpha.le.fpar(4) .and. ipar(3).ge.0 .and. ipar(3).ne.999) then + ipar(1) = 0 + fpar(6) = alpha + goto 300 + endif + alpha = one / alpha + do ii = 1, n + w(ii) = alpha * w(ii) + enddo + fpar(11) = fpar(11) + n +c +c request for (1) right preconditioning +c (2) matrix vector multiplication +c (3) left preconditioning +c + 110 k = k + 1 + if (rp) then + ipar(1) = 5 + ipar(8) = k*n - n + 1 + if (lp) then + ipar(9) = k*n + 1 + else + ipar(9) = idx + 1 + endif + ipar(10) = 3 + return + endif +c + 30 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = (k-1)*n + 1 + endif + if (lp) then + ipar(9) = idx + 1 + else + ipar(9) = 1 + k*n + endif + ipar(10) = 4 + return +c + 40 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = k*n + 1 + ipar(10) = 5 + return + endif +c +c Modified Gram-Schmidt orthogonalization procedure +c temporary pointer 'ptr' is pointing to the current column of the +c Hessenberg matrix. 'p2' points to the new basis vector +c + 50 ipar(7) = ipar(7) + 1 + ptr = k * (k - 1) / 2 + hes + p2 = ipar(9) + call mgsro(.false.,n,n,k+1,k+1,fpar(11),w,w(ptr+1), + $ ipar(12)) + if (ipar(12).lt.0) goto 200 +c +c apply previous Givens rotations to column. +c + p2 = ptr + 1 + do i = 1, k-1 + ptr = p2 + p2 = p2 + 1 + alpha = w(ptr) + c = w(vc+i) + s = w(vs+i) + w(ptr) = c * alpha + s * w(p2) + w(p2) = c * w(p2) - s * alpha + enddo +c +c end of one Arnoldi iteration, alpha will store the estimated +c residual norm at current stage +c + fpar(11) = fpar(11) + 6*k + + prs = vrn+k + alpha = fpar(5) + if (w(p2) .ne. zero) alpha = abs(w(p2+1)*w(prs)/w(p2)) + fpar(5) = alpha +c + if (k.ge.m .or. (ipar(3).ge.0 .and. alpha.le.fpar(4)) + + .or. (ipar(6).gt.0 .and. ipar(7).ge.ipar(6))) + + goto 200 +c + call givens(w(p2), w(p2+1), c, s) + w(vc+k) = c + w(vs+k) = s + alpha = - s * w(prs) + w(prs) = c * w(prs) + w(prs+1) = alpha +c + if (w(p2).ne.zero) goto 110 +c +c update the approximate solution, first solve the upper triangular +c system, temporary pointer ptr points to the Hessenberg matrix, +c prs points to the right-hand-side (also the solution) of the system. +c + 200 ptr = hes + k * (k + 1) / 2 + prs = vrn + k + if (w(ptr).eq.zero) then +c +c if the diagonal elements of the last column is zero, reduce k by 1 +c so that a smaller trianguler system is solved +c + k = k - 1 + if (k.gt.0) then + goto 200 + else + ipar(1) = -3 + ipar(12) = -4 + goto 300 + endif + endif + w(prs) = w(prs) / w(ptr) + do i = k-1, 1, -1 + ptr = ptr - i - 1 + do ii = 1, i + w(vrn+ii) = w(vrn+ii) - w(prs) * w(ptr+ii) + enddo + prs = prs - 1 + w(prs) = w(prs) / w(ptr) + enddo +c + do ii = 1, n + w(ii) = w(ii) * w(prs) + enddo + do i = 1, k-1 + prs = prs + 1 + ptr = i*n + do ii = 1, n + w(ii) = w(ii) + w(prs) * w(ptr+ii) + enddo + enddo + fpar(11) = fpar(11) + 2*(k-1)*n + n + k*(k+1) +c + if (rp) then + ipar(1) = 5 + ipar(8) = 1 + ipar(9) = idx + 1 + ipar(10) = 6 + return + endif +c + 60 if (rp) then + do i = 1, n + sol(i) = sol(i) + w(idx+i) + enddo + else + do i = 1, n + sol(i) = sol(i) + w(i) + enddo + endif + fpar(11) = fpar(11) + n +c +c process the complete stopping criteria +c + if (ipar(3).eq.999) then + ipar(1) = 10 + ipar(8) = -1 + ipar(9) = idx + 1 + ipar(10) = 7 + return + else if (ipar(3).lt.0) then + if (ipar(7).le.m+1) then + fpar(3) = abs(w(vrn+1)) + if (ipar(3).eq.-1) fpar(4) = fpar(1)*fpar(3)+fpar(2) + endif + alpha = abs(w(vrn+k)) + endif + fpar(6) = alpha +c +c do we need to restart ? +c + 70 if (ipar(12).ne.0) then + ipar(1) = -3 + goto 300 + endif + if (ipar(7).lt.ipar(6) .or. ipar(6).le.0) then + if (ipar(3).ne.999) then + if (fpar(6).gt.fpar(4)) goto 100 + else + if (ipar(11).eq.0) goto 100 + endif + endif +c +c termination, set error code, compute convergence rate +c + if (ipar(1).gt.0) then + if (ipar(3).eq.999 .and. ipar(11).eq.1) then + ipar(1) = 0 + else if (ipar(3).ne.999 .and. fpar(6).le.fpar(4)) then + ipar(1) = 0 + else if (ipar(7).ge.ipar(6) .and. ipar(6).gt.0) then + ipar(1) = -1 + else + ipar(1) = -10 + endif + endif + 300 if (fpar(3).ne.zero .and. fpar(6).ne.zero .and. + + ipar(7).gt.ipar(13)) then + fpar(7) = log10(fpar(3) / fpar(6)) / dble(ipar(7)-ipar(13)) + else + fpar(7) = zero + endif + return + end +c-----end-of-fom-------------------------------------------------------- +c----------------------------------------------------------------------- + subroutine gmres(n, rhs, sol, ipar, fpar, w) + implicit none + integer n, ipar(16) + real*8 rhs(n), sol(n), fpar(16), w(*) +c----------------------------------------------------------------------- +c This a version of GMRES implemented with reverse communication. +c It is a simple restart version of the GMRES algorithm. +c +c ipar(5) == the dimension of the Krylov subspace +c after every ipar(5) iterations, the GMRES will restart with +c the updated solution and recomputed residual vector. +c +c the space of the `w' is used as follows: +c (1) the basis for the Krylov subspace, size n*(m+1); +c (2) the Hessenberg matrix, only the upper triangular +c portion of the matrix is stored, size (m+1)*m/2 + 1 +c (3) three vectors, all are of size m, they are +c the cosine and sine of the Givens rotations, the third one holds +c the residuals, it is of size m+1. +c +c TOTAL SIZE REQUIRED == (n+3)*(m+2) + (m+1)*m/2 +c Note: m == ipar(5). The default value for this is 15 if +c ipar(5) <= 1. +c----------------------------------------------------------------------- +c external functions used +c + real*8 distdot + external distdot +c + real*8 one, zero + parameter(one=1.0D0, zero=0.0D0) +c +c local variables, ptr and p2 are temporary pointers, +c hess points to the Hessenberg matrix, +c vc, vs point to the cosines and sines of the Givens rotations +c vrn points to the vectors of residual norms, more precisely +c the right hand side of the least square problem solved. +c + integer i,ii,idx,k,m,ptr,p2,hess,vc,vs,vrn + real*8 alpha, c, s + logical lp, rp + save +c +c check the status of the call +c + if (ipar(1).le.0) ipar(10) = 0 + goto (10, 20, 30, 40, 50, 60, 70) ipar(10) +c +c initialization +c + if (ipar(5).le.1) then + m = 15 + else + m = ipar(5) + endif + idx = n * (m+1) + hess = idx + n + vc = hess + (m+1) * m / 2 + 1 + vs = vc + m + vrn = vs + m + i = vrn + m + 1 + call bisinit(ipar,fpar,i,1,lp,rp,w) + if (ipar(1).lt.0) return +c +c request for matrix vector multiplication A*x in the initialization +c + 100 ipar(1) = 1 + ipar(8) = n+1 + ipar(9) = 1 + ipar(10) = 1 + k = 0 + do i = 1, n + w(n+i) = sol(i) + enddo + return + 10 ipar(7) = ipar(7) + 1 + ipar(13) = ipar(13) + 1 + if (lp) then + do i = 1, n + w(n+i) = rhs(i) - w(i) + enddo + ipar(1) = 3 + ipar(10) = 2 + return + else + do i = 1, n + w(i) = rhs(i) - w(i) + enddo + endif + fpar(11) = fpar(11) + n +c + 20 alpha = sqrt(distdot(n,w,1,w,1)) + fpar(11) = fpar(11) + 2*n + if (ipar(7).eq.1 .and. ipar(3).ne.999) then + if (abs(ipar(3)).eq.2) then + fpar(4) = fpar(1) * sqrt(distdot(n,rhs,1,rhs,1)) + fpar(2) + fpar(11) = fpar(11) + 2*n + else + fpar(4) = fpar(1) * alpha + fpar(2) + endif + fpar(3) = alpha + endif + fpar(5) = alpha + w(vrn+1) = alpha + if (alpha.le.fpar(4) .and. ipar(3).ge.0 .and. ipar(3).ne.999) then + ipar(1) = 0 + fpar(6) = alpha + goto 300 + endif + alpha = one / alpha + do ii = 1, n + w(ii) = alpha * w(ii) + enddo + fpar(11) = fpar(11) + n +c +c request for (1) right preconditioning +c (2) matrix vector multiplication +c (3) left preconditioning +c + 110 k = k + 1 + if (rp) then + ipar(1) = 5 + ipar(8) = k*n - n + 1 + if (lp) then + ipar(9) = k*n + 1 + else + ipar(9) = idx + 1 + endif + ipar(10) = 3 + return + endif +c + 30 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = (k-1)*n + 1 + endif + if (lp) then + ipar(9) = idx + 1 + else + ipar(9) = 1 + k*n + endif + ipar(10) = 4 + return +c + 40 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = k*n + 1 + ipar(10) = 5 + return + endif +c +c Modified Gram-Schmidt orthogonalization procedure +c temporary pointer 'ptr' is pointing to the current column of the +c Hessenberg matrix. 'p2' points to the new basis vector +c + 50 ipar(7) = ipar(7) + 1 + ptr = k * (k - 1) / 2 + hess + p2 = ipar(9) + call mgsro(.false.,n,n,k+1,k+1,fpar(11),w,w(ptr+1), + $ ipar(12)) + if (ipar(12).lt.0) goto 200 +c +c apply previous Givens rotations and generate a new one to eliminate +c the subdiagonal element. +c + p2 = ptr + 1 + do i = 1, k-1 + ptr = p2 + p2 = p2 + 1 + alpha = w(ptr) + c = w(vc+i) + s = w(vs+i) + w(ptr) = c * alpha + s * w(p2) + w(p2) = c * w(p2) - s * alpha + enddo + call givens(w(p2), w(p2+1), c, s) + w(vc+k) = c + w(vs+k) = s + p2 = vrn + k + alpha = - s * w(p2) + w(p2) = c * w(p2) + w(p2+1) = alpha +c +c end of one Arnoldi iteration, alpha will store the estimated +c residual norm at current stage +c + fpar(11) = fpar(11) + 6*k + 2 + alpha = abs(alpha) + fpar(5) = alpha + if (k.lt.m .and. .not.(ipar(3).ge.0 .and. alpha.le.fpar(4)) + + .and. (ipar(6).le.0 .or. ipar(7).lt.ipar(6))) goto 110 +c +c update the approximate solution, first solve the upper triangular +c system, temporary pointer ptr points to the Hessenberg matrix, +c p2 points to the right-hand-side (also the solution) of the system. +c + 200 ptr = hess + k * (k + 1) / 2 + p2 = vrn + k + if (w(ptr).eq.zero) then +c +c if the diagonal elements of the last column is zero, reduce k by 1 +c so that a smaller trianguler system is solved [It should only +c happen when the matrix is singular, and at most once!] +c + k = k - 1 + if (k.gt.0) then + goto 200 + else + ipar(1) = -3 + ipar(12) = -4 + goto 300 + endif + endif + w(p2) = w(p2) / w(ptr) + do i = k-1, 1, -1 + ptr = ptr - i - 1 + do ii = 1, i + w(vrn+ii) = w(vrn+ii) - w(p2) * w(ptr+ii) + enddo + p2 = p2 - 1 + w(p2) = w(p2) / w(ptr) + enddo +c + do ii = 1, n + w(ii) = w(ii) * w(p2) + enddo + do i = 1, k-1 + ptr = i*n + p2 = p2 + 1 + do ii = 1, n + w(ii) = w(ii) + w(p2) * w(ptr+ii) + enddo + enddo + fpar(11) = fpar(11) + 2*k*n - n + k*(k+1) +c + if (rp) then + ipar(1) = 5 + ipar(8) = 1 + ipar(9) = idx + 1 + ipar(10) = 6 + return + endif +c + 60 if (rp) then + do i = 1, n + sol(i) = sol(i) + w(idx+i) + enddo + else + do i = 1, n + sol(i) = sol(i) + w(i) + enddo + endif + fpar(11) = fpar(11) + n +c +c process the complete stopping criteria +c + if (ipar(3).eq.999) then + ipar(1) = 10 + ipar(8) = -1 + ipar(9) = idx + 1 + ipar(10) = 7 + return + else if (ipar(3).lt.0) then + if (ipar(7).le.m+1) then + fpar(3) = abs(w(vrn+1)) + if (ipar(3).eq.-1) fpar(4) = fpar(1)*fpar(3)+fpar(2) + endif + fpar(6) = abs(w(vrn+k)) + else + fpar(6) = fpar(5) + endif +c +c do we need to restart ? +c + 70 if (ipar(12).ne.0) then + ipar(1) = -3 + goto 300 + endif + if ((ipar(7).lt.ipar(6) .or. ipar(6).le.0) .and. + + ((ipar(3).eq.999.and.ipar(11).eq.0) .or. + + (ipar(3).ne.999.and.fpar(6).gt.fpar(4)))) goto 100 +c +c termination, set error code, compute convergence rate +c + if (ipar(1).gt.0) then + if (ipar(3).eq.999 .and. ipar(11).eq.1) then + ipar(1) = 0 + else if (ipar(3).ne.999 .and. fpar(6).le.fpar(4)) then + ipar(1) = 0 + else if (ipar(7).ge.ipar(6) .and. ipar(6).gt.0) then + ipar(1) = -1 + else + ipar(1) = -10 + endif + endif + 300 if (fpar(3).ne.zero .and. fpar(6).ne.zero .and. + + ipar(7).gt.ipar(13)) then + fpar(7) = log10(fpar(3) / fpar(6)) / dble(ipar(7)-ipar(13)) + else + fpar(7) = zero + endif + return + end +c-----end-of-gmres +c----------------------------------------------------------------------- + subroutine dqgmres(n, rhs, sol, ipar, fpar, w) + implicit none + integer n, ipar(16) + real*8 rhs(n), sol(n), fpar(16), w(*) +c----------------------------------------------------------------------- +c DQGMRES -- Flexible Direct version of Quasi-General Minimum +c Residual method. The right preconditioning can be varied from +c step to step. +c +c Work space used = n + lb * (2*n+4) +c where lb = ipar(5) + 1 (default 16 if ipar(5) <= 1) +c----------------------------------------------------------------------- +c local variables +c + real*8 one,zero,deps + parameter(one=1.0D0,zero=0.0D0) + parameter(deps=1.0D-33) +c + integer i,ii,j,jp1,j0,k,ptrw,ptrv,iv,iw,ic,is,ihm,ihd,lb,ptr + real*8 alpha,beta,psi,c,s,distdot + logical lp,rp,full + external distdot,bisinit + save +c +c where to go +c + if (ipar(1).le.0) ipar(10) = 0 + goto (10, 20, 40, 50, 60, 70) ipar(10) +c +c locations of the work arrays. The arrangement is as follows: +c w(1:n) -- temporary storage for the results of the preconditioning +c w(iv+1:iw) -- the V's +c w(iw+1:ic) -- the W's +c w(ic+1:is) -- the COSINEs of the Givens rotations +c w(is+1:ihm) -- the SINEs of the Givens rotations +c w(ihm+1:ihd) -- the last column of the Hessenberg matrix +c w(ihd+1:i) -- the inverse of the diagonals of the Hessenberg matrix +c + if (ipar(5).le.1) then + lb = 16 + else + lb = ipar(5) + 1 + endif + iv = n + iw = iv + lb * n + ic = iw + lb * n + is = ic + lb + ihm = is + lb + ihd = ihm + lb + i = ihd + lb +c +c parameter check, initializations +c + full = .false. + call bisinit(ipar,fpar,i,1,lp,rp,w) + if (ipar(1).lt.0) return + ipar(1) = 1 + if (lp) then + do ii = 1, n + w(iv+ii) = sol(ii) + enddo + ipar(8) = iv+1 + ipar(9) = 1 + else + do ii = 1, n + w(ii) = sol(ii) + enddo + ipar(8) = 1 + ipar(9) = iv+1 + endif + ipar(10) = 1 + return +c + 10 ipar(7) = ipar(7) + 1 + ipar(13) = ipar(13) + 1 + if (lp) then + do i = 1, n + w(i) = rhs(i) - w(i) + enddo + ipar(1) = 3 + ipar(8) = 1 + ipar(9) = iv+1 + ipar(10) = 2 + return + else + do i = 1, n + w(iv+i) = rhs(i) - w(iv+i) + enddo + endif + fpar(11) = fpar(11) + n +c + 20 alpha = sqrt(distdot(n, w(iv+1), 1, w(iv+1), 1)) + fpar(11) = fpar(11) + (n + n) + if (abs(ipar(3)).eq.2) then + fpar(4) = fpar(1) * sqrt(distdot(n,rhs,1,rhs,1)) + fpar(2) + fpar(11) = fpar(11) + 2*n + else if (ipar(3).ne.999) then + fpar(4) = fpar(1) * alpha + fpar(2) + endif + fpar(3) = alpha + fpar(5) = alpha + psi = alpha + if (alpha.le.fpar(4)) then + ipar(1) = 0 + fpar(6) = alpha + goto 80 + endif + alpha = one / alpha + do i = 1, n + w(iv+i) = w(iv+i) * alpha + enddo + fpar(11) = fpar(11) + n + j = 0 +c +c iterations start here +c + 30 j = j + 1 + if (j.gt.lb) j = j - lb + jp1 = j + 1 + if (jp1.gt.lb) jp1 = jp1 - lb + ptrv = iv + (j-1)*n + 1 + ptrw = iv + (jp1-1)*n + 1 + if (.not.full) then + if (j.gt.jp1) full = .true. + endif + if (full) then + j0 = jp1+1 + if (j0.gt.lb) j0 = j0 - lb + else + j0 = 1 + endif +c +c request the caller to perform matrix-vector multiplication and +c preconditioning +c + if (rp) then + ipar(1) = 5 + ipar(8) = ptrv + ipar(9) = ptrv + iw - iv + ipar(10) = 3 + return + else + do i = 0, n-1 + w(ptrv+iw-iv+i) = w(ptrv+i) + enddo + endif +c + 40 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = ptrv + endif + if (lp) then + ipar(9) = 1 + else + ipar(9) = ptrw + endif + ipar(10) = 4 + return +c + 50 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = ptrw + ipar(10) = 5 + return + endif +c +c compute the last column of the Hessenberg matrix +c modified Gram-schmidt procedure, orthogonalize against (lb-1) +c previous vectors +c + 60 continue + call mgsro(full,n,n,lb,jp1,fpar(11),w(iv+1),w(ihm+1), + $ ipar(12)) + if (ipar(12).lt.0) then + ipar(1) = -3 + goto 80 + endif + beta = w(ihm+jp1) +c +c incomplete factorization (QR factorization through Givens rotations) +c (1) apply previous rotations [(lb-1) of them] +c (2) generate a new rotation +c + if (full) then + w(ihm+jp1) = w(ihm+j0) * w(is+jp1) + w(ihm+j0) = w(ihm+j0) * w(ic+jp1) + endif + i = j0 + do while (i.ne.j) + k = i+1 + if (k.gt.lb) k = k - lb + c = w(ic+i) + s = w(is+i) + alpha = w(ihm+i) + w(ihm+i) = c * alpha + s * w(ihm+k) + w(ihm+k) = c * w(ihm+k) - s * alpha + i = k + enddo + call givens(w(ihm+j), beta, c, s) + if (full) then + fpar(11) = fpar(11) + 6 * lb + else + fpar(11) = fpar(11) + 6 * j + endif +c +c detect whether diagonal element of this column is zero +c + if (abs(w(ihm+j)).lt.deps) then + ipar(1) = -3 + goto 80 + endif + w(ihd+j) = one / w(ihm+j) + w(ic+j) = c + w(is+j) = s +c +c update the W's (the conjugate directions) -- essentially this is one +c step of triangular solve. +c + ptrw = iw+(j-1)*n + 1 + if (full) then + do i = j+1, lb + alpha = -w(ihm+i)*w(ihd+i) + ptr = iw+(i-1)*n+1 + do ii = 0, n-1 + w(ptrw+ii) = w(ptrw+ii) + alpha * w(ptr+ii) + enddo + enddo + endif + do i = 1, j-1 + alpha = -w(ihm+i)*w(ihd+i) + ptr = iw+(i-1)*n+1 + do ii = 0, n-1 + w(ptrw+ii) = w(ptrw+ii) + alpha * w(ptr+ii) + enddo + enddo +c +c update the solution to the linear system +c + alpha = psi * c * w(ihd+j) + psi = - s * psi + do i = 1, n + sol(i) = sol(i) + alpha * w(ptrw-1+i) + enddo + if (full) then + fpar(11) = fpar(11) + lb * (n+n) + else + fpar(11) = fpar(11) + j * (n+n) + endif +c +c determine whether to continue, +c compute the desired error/residual norm +c + ipar(7) = ipar(7) + 1 + fpar(5) = abs(psi) + if (ipar(3).eq.999) then + ipar(1) = 10 + ipar(8) = -1 + ipar(9) = 1 + ipar(10) = 6 + return + endif + if (ipar(3).lt.0) then + alpha = abs(alpha) + if (ipar(7).eq.2 .and. ipar(3).eq.-1) then + fpar(3) = alpha*sqrt(distdot(n, w(ptrw), 1, w(ptrw), 1)) + fpar(4) = fpar(1) * fpar(3) + fpar(2) + fpar(6) = fpar(3) + else + fpar(6) = alpha*sqrt(distdot(n, w(ptrw), 1, w(ptrw), 1)) + endif + fpar(11) = fpar(11) + 2 * n + else + fpar(6) = fpar(5) + endif + if (ipar(1).ge.0 .and. fpar(6).gt.fpar(4) .and. (ipar(6).le.0 + + .or. ipar(7).lt.ipar(6))) goto 30 + 70 if (ipar(3).eq.999 .and. ipar(11).eq.0) goto 30 +c +c clean up the iterative solver +c + 80 fpar(7) = zero + if (fpar(3).ne.zero .and. fpar(6).ne.zero .and. + + ipar(7).gt.ipar(13)) + + fpar(7) = log10(fpar(3) / fpar(6)) / dble(ipar(7)-ipar(13)) + if (ipar(1).gt.0) then + if (ipar(3).eq.999 .and. ipar(11).ne.0) then + ipar(1) = 0 + else if (fpar(6).le.fpar(4)) then + ipar(1) = 0 + else if (ipar(6).gt.0 .and. ipar(7).ge.ipar(6)) then + ipar(1) = -1 + else + ipar(1) = -10 + endif + endif + return + end +c-----end-of-dqgmres +c----------------------------------------------------------------------- + subroutine fgmres(n, rhs, sol, ipar, fpar, w) + implicit none + integer n, ipar(16) + real*8 rhs(n), sol(n), fpar(16), w(*) +c----------------------------------------------------------------------- +c This a version of FGMRES implemented with reverse communication. +c +c ipar(5) == the dimension of the Krylov subspace +c +c the space of the `w' is used as follows: +c >> V: the bases for the Krylov subspace, size n*(m+1); +c >> W: the above bases after (left-)multiplying with the +c right-preconditioner inverse, size m*n; +c >> a temporary vector of size n; +c >> the Hessenberg matrix, only the upper triangular portion +c of the matrix is stored, size (m+1)*m/2 + 1 +c >> three vectors, first two are of size m, they are the cosine +c and sine of the Givens rotations, the third one holds the +c residuals, it is of size m+1. +c +c TOTAL SIZE REQUIRED == n*(2m+1) + (m+1)*m/2 + 3*m + 2 +c Note: m == ipar(5). The default value for this is 15 if +c ipar(5) <= 1. +c----------------------------------------------------------------------- +c external functions used +c + real*8 distdot + external distdot +c + real*8 one, zero + parameter(one=1.0D0, zero=0.0D0) +c +c local variables, ptr and p2 are temporary pointers, +c hess points to the Hessenberg matrix, +c vc, vs point to the cosines and sines of the Givens rotations +c vrn points to the vectors of residual norms, more precisely +c the right hand side of the least square problem solved. +c + integer i,ii,idx,iz,k,m,ptr,p2,hess,vc,vs,vrn + real*8 alpha, c, s + logical lp, rp + save +c +c check the status of the call +c + if (ipar(1).le.0) ipar(10) = 0 + goto (10, 20, 30, 40, 50, 60) ipar(10) +c +c initialization +c + if (ipar(5).le.1) then + m = 15 + else + m = ipar(5) + endif + idx = n * (m+1) + iz = idx + n + hess = iz + n*m + vc = hess + (m+1) * m / 2 + 1 + vs = vc + m + vrn = vs + m + i = vrn + m + 1 + call bisinit(ipar,fpar,i,1,lp,rp,w) + if (ipar(1).lt.0) return +c +c request for matrix vector multiplication A*x in the initialization +c + 100 ipar(1) = 1 + ipar(8) = n+1 + ipar(9) = 1 + ipar(10) = 1 + k = 0 + do ii = 1, n + w(ii+n) = sol(ii) + enddo + return + 10 ipar(7) = ipar(7) + 1 + ipar(13) = ipar(13) + 1 + fpar(11) = fpar(11) + n + if (lp) then + do i = 1, n + w(n+i) = rhs(i) - w(i) + enddo + ipar(1) = 3 + ipar(10) = 2 + return + else + do i = 1, n + w(i) = rhs(i) - w(i) + enddo + endif +c + 20 alpha = sqrt(distdot(n,w,1,w,1)) + fpar(11) = fpar(11) + n + n + if (ipar(7).eq.1 .and. ipar(3).ne.999) then + if (abs(ipar(3)).eq.2) then + fpar(4) = fpar(1) * sqrt(distdot(n,rhs,1,rhs,1)) + fpar(2) + fpar(11) = fpar(11) + 2*n + else + fpar(4) = fpar(1) * alpha + fpar(2) + endif + fpar(3) = alpha + endif + fpar(5) = alpha + w(vrn+1) = alpha + if (alpha.le.fpar(4) .and. ipar(3).ge.0 .and. ipar(3).ne.999) then + ipar(1) = 0 + fpar(6) = alpha + goto 300 + endif + alpha = one / alpha + do ii = 1, n + w(ii) = w(ii) * alpha + enddo + fpar(11) = fpar(11) + n +c +c request for (1) right preconditioning +c (2) matrix vector multiplication +c (3) left preconditioning +c + 110 k = k + 1 + if (rp) then + ipar(1) = 5 + ipar(8) = k*n - n + 1 + ipar(9) = iz + ipar(8) + ipar(10) = 3 + return + else + do ii = 0, n-1 + w(iz+k*n-ii) = w(k*n-ii) + enddo + endif +c + 30 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = (k-1)*n + 1 + endif + if (lp) then + ipar(9) = idx + 1 + else + ipar(9) = 1 + k*n + endif + ipar(10) = 4 + return +c + 40 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = k*n + 1 + ipar(10) = 5 + return + endif +c +c Modified Gram-Schmidt orthogonalization procedure +c temporary pointer 'ptr' is pointing to the current column of the +c Hessenberg matrix. 'p2' points to the new basis vector +c + 50 ptr = k * (k - 1) / 2 + hess + p2 = ipar(9) + ipar(7) = ipar(7) + 1 + call mgsro(.false.,n,n,k+1,k+1,fpar(11),w,w(ptr+1), + $ ipar(12)) + if (ipar(12).lt.0) goto 200 +c +c apply previous Givens rotations and generate a new one to eliminate +c the subdiagonal element. +c + p2 = ptr + 1 + do i = 1, k-1 + ptr = p2 + p2 = p2 + 1 + alpha = w(ptr) + c = w(vc+i) + s = w(vs+i) + w(ptr) = c * alpha + s * w(p2) + w(p2) = c * w(p2) - s * alpha + enddo + call givens(w(p2), w(p2+1), c, s) + w(vc+k) = c + w(vs+k) = s + p2 = vrn + k + alpha = - s * w(p2) + w(p2) = c * w(p2) + w(p2+1) = alpha + fpar(11) = fpar(11) + 6 * k +c +c end of one Arnoldi iteration, alpha will store the estimated +c residual norm at current stage +c + alpha = abs(alpha) + fpar(5) = alpha + if (k.lt.m .and. .not.(ipar(3).ge.0 .and. alpha.le.fpar(4)) + + .and. (ipar(6).le.0 .or. ipar(7).lt.ipar(6))) goto 110 +c +c update the approximate solution, first solve the upper triangular +c system, temporary pointer ptr points to the Hessenberg matrix, +c p2 points to the right-hand-side (also the solution) of the system. +c + 200 ptr = hess + k * (k + 1 ) / 2 + p2 = vrn + k + if (w(ptr).eq.zero) then +c +c if the diagonal elements of the last column is zero, reduce k by 1 +c so that a smaller trianguler system is solved [It should only +c happen when the matrix is singular!] +c + k = k - 1 + if (k.gt.0) then + goto 200 + else + ipar(1) = -3 + ipar(12) = -4 + goto 300 + endif + endif + w(p2) = w(p2) / w(ptr) + do i = k-1, 1, -1 + ptr = ptr - i - 1 + do ii = 1, i + w(vrn+ii) = w(vrn+ii) - w(p2) * w(ptr+ii) + enddo + p2 = p2 - 1 + w(p2) = w(p2) / w(ptr) + enddo +c + do i = 0, k-1 + ptr = iz+i*n + do ii = 1, n + sol(ii) = sol(ii) + w(p2)*w(ptr+ii) + enddo + p2 = p2 + 1 + enddo + fpar(11) = fpar(11) + 2*k*n + k*(k+1) +c +c process the complete stopping criteria +c + if (ipar(3).eq.999) then + ipar(1) = 10 + ipar(8) = -1 + ipar(9) = idx + 1 + ipar(10) = 6 + return + else if (ipar(3).lt.0) then + if (ipar(7).le.m+1) then + fpar(3) = abs(w(vrn+1)) + if (ipar(3).eq.-1) fpar(4) = fpar(1)*fpar(3)+fpar(2) + endif + fpar(6) = abs(w(vrn+k)) + else if (ipar(3).ne.999) then + fpar(6) = fpar(5) + endif +c +c do we need to restart ? +c + 60 if (ipar(12).ne.0) then + ipar(1) = -3 + goto 300 + endif + if ((ipar(7).lt.ipar(6) .or. ipar(6).le.0).and. + + ((ipar(3).eq.999.and.ipar(11).eq.0) .or. + + (ipar(3).ne.999.and.fpar(6).gt.fpar(4)))) goto 100 +c +c termination, set error code, compute convergence rate +c + if (ipar(1).gt.0) then + if (ipar(3).eq.999 .and. ipar(11).eq.1) then + ipar(1) = 0 + else if (ipar(3).ne.999 .and. fpar(6).le.fpar(4)) then + ipar(1) = 0 + else if (ipar(7).ge.ipar(6) .and. ipar(6).gt.0) then + ipar(1) = -1 + else + ipar(1) = -10 + endif + endif + 300 if (fpar(3).ne.zero .and. fpar(6).ne.zero .and. + $ ipar(7).gt.ipar(13)) then + fpar(7) = log10(fpar(3) / fpar(6)) / dble(ipar(7)-ipar(13)) + else + fpar(7) = zero + endif + return + end +c-----end-of-fgmres +c----------------------------------------------------------------------- + subroutine dbcg (n,rhs,sol,ipar,fpar,w) + implicit none + integer n,ipar(16) + real*8 rhs(n), sol(n), fpar(16), w(n,*) +c----------------------------------------------------------------------- +c Quasi GMRES method for solving a linear +c system of equations a * sol = y. double precision version. +c this version is without restarting and without preconditioning. +c parameters : +c ----------- +c n = dimension of the problem +c +c y = w(:,1) a temporary storage used for various operations +c z = w(:,2) a work vector of length n. +c v = w(:,3:4) size n x 2 +c w = w(:,5:6) size n x 2 +c p = w(:,7:9) work array of dimension n x 3 +c del x = w(:,10) accumulation of the changes in solution +c tmp = w(:,11) a temporary vector used to hold intermediate result of +c preconditioning, etc. +c +c sol = the solution of the problem . at input sol must contain an +c initial guess to the solution. +c *** note: y is destroyed on return. +c +c----------------------------------------------------------------------- +c subroutines and functions called: +c 1) matrix vector multiplication and preconditioning through reverse +c communication +c +c 2) implu, uppdir, distdot (blas) +c----------------------------------------------------------------------- +c aug. 1983 version. author youcef saad. yale university computer +c science dept. some changes made july 3, 1986. +c references: siam j. sci. stat. comp., vol. 5, pp. 203-228 (1984) +c----------------------------------------------------------------------- +c local variables +c + real*8 one,zero + parameter(one=1.0D0,zero=0.0D0) +c + real*8 t,sqrt,distdot,ss,res,beta,ss1,delta,x,zeta,umm + integer k,j,i,i2,ip2,ju,lb,lbm1,np,indp + logical lp,rp,full, perm(3) + real*8 ypiv(3),u(3),usav(3) + external tidycg + save +c +c where to go +c + if (ipar(1).le.0) ipar(10) = 0 + goto (110, 120, 130, 140, 150, 160, 170, 180, 190, 200) ipar(10) +c +c initialization, parameter checking, clear the work arrays +c + call bisinit(ipar,fpar,11*n,1,lp,rp,w) + if (ipar(1).lt.0) return + perm(1) = .false. + perm(2) = .false. + perm(3) = .false. + usav(1) = zero + usav(2) = zero + usav(3) = zero + ypiv(1) = zero + ypiv(2) = zero + ypiv(3) = zero +c----------------------------------------------------------------------- +c initialize constants for outer loop : +c----------------------------------------------------------------------- + lb = 3 + lbm1 = 2 +c +c get initial residual vector and norm +c + ipar(1) = 1 + ipar(8) = 1 + ipar(9) = 1 + n + do i = 1, n + w(i,1) = sol(i) + enddo + ipar(10) = 1 + return + 110 ipar(7) = ipar(7) + 1 + ipar(13) = ipar(13) + 1 + if (lp) then + do i = 1, n + w(i,1) = rhs(i) - w(i,2) + enddo + ipar(1) = 3 + ipar(8) = 1 + ipar(9) = n+n+1 + ipar(10) = 2 + return + else + do i = 1, n + w(i,3) = rhs(i) - w(i,2) + enddo + endif + fpar(11) = fpar(11) + n +c + 120 fpar(3) = sqrt(distdot(n,w(1,3),1,w(1,3),1)) + fpar(11) = fpar(11) + n + n + fpar(5) = fpar(3) + fpar(7) = fpar(3) + zeta = fpar(3) + if (abs(ipar(3)).eq.2) then + fpar(4) = fpar(1) * sqrt(distdot(n,rhs,1,rhs,1)) + fpar(2) + fpar(11) = fpar(11) + 2*n + else if (ipar(3).ne.999) then + fpar(4) = fpar(1) * zeta + fpar(2) + endif + if (ipar(3).ge.0.and.fpar(5).le.fpar(4)) then + fpar(6) = fpar(5) + goto 900 + endif +c +c normalize first arnoldi vector +c + t = one/zeta + do 22 k=1,n + w(k,3) = w(k,3)*t + w(k,5) = w(k,3) + 22 continue + fpar(11) = fpar(11) + n +c +c initialize constants for main loop +c + beta = zero + delta = zero + i2 = 1 + indp = 0 + i = 0 +c +c main loop: i = index of the loop. +c +c----------------------------------------------------------------------- + 30 i = i + 1 +c + if (rp) then + ipar(1) = 5 + ipar(8) = (1+i2)*n+1 + if (lp) then + ipar(9) = 1 + else + ipar(9) = 10*n + 1 + endif + ipar(10) = 3 + return + endif +c + 130 ipar(1) = 1 + if (rp) then + ipar(8) = ipar(9) + else + ipar(8) = (1+i2)*n + 1 + endif + if (lp) then + ipar(9) = 10*n + 1 + else + ipar(9) = 1 + endif + ipar(10) = 4 + return +c + 140 if (lp) then + ipar(1) = 3 + ipar(8) = ipar(9) + ipar(9) = 1 + ipar(10) = 5 + return + endif +c +c A^t * x +c + 150 ipar(7) = ipar(7) + 1 + if (lp) then + ipar(1) = 4 + ipar(8) = (3+i2)*n + 1 + if (rp) then + ipar(9) = n + 1 + else + ipar(9) = 10*n + 1 + endif + ipar(10) = 6 + return + endif +c + 160 ipar(1) = 2 + if (lp) then + ipar(8) = ipar(9) + else + ipar(8) = (3+i2)*n + 1 + endif + if (rp) then + ipar(9) = 10*n + 1 + else + ipar(9) = n + 1 + endif + ipar(10) = 7 + return +c + 170 if (rp) then + ipar(1) = 6 + ipar(8) = ipar(9) + ipar(9) = n + 1 + ipar(10) = 8 + return + endif +c----------------------------------------------------------------------- +c orthogonalize current v against previous v's and +c determine relevant part of i-th column of u(.,.) the +c upper triangular matrix -- +c----------------------------------------------------------------------- + 180 ipar(7) = ipar(7) + 1 + u(1) = zero + ju = 1 + k = i2 + if (i .le. lbm1) ju = 0 + if (i .lt. lb) k = 0 + 31 if (k .eq. lbm1) k=0 + k=k+1 +c + if (k .ne. i2) then + ss = delta + ss1 = beta + ju = ju + 1 + u(ju) = ss + else + ss = distdot(n,w(1,1),1,w(1,4+k),1) + fpar(11) = fpar(11) + 2*n + ss1= ss + ju = ju + 1 + u(ju) = ss + endif +c + do 32 j=1,n + w(j,1) = w(j,1) - ss*w(j,k+2) + w(j,2) = w(j,2) - ss1*w(j,k+4) + 32 continue + fpar(11) = fpar(11) + 4*n +c + if (k .ne. i2) goto 31 +c +c end of Mod. Gram. Schmidt loop +c + t = distdot(n,w(1,2),1,w(1,1),1) +c + beta = sqrt(abs(t)) + delta = t/beta +c + ss = one/beta + ss1 = one/ delta +c +c normalize and insert new vectors +c + ip2 = i2 + if (i2 .eq. lbm1) i2=0 + i2=i2+1 +c + do 315 j=1,n + w(j,i2+2)=w(j,1)*ss + w(j,i2+4)=w(j,2)*ss1 + 315 continue + fpar(11) = fpar(11) + 4*n +c----------------------------------------------------------------------- +c end of orthogonalization. +c now compute the coefficients u(k) of the last +c column of the l . u factorization of h . +c----------------------------------------------------------------------- + np = min0(i,lb) + full = (i .ge. lb) + call implu(np, umm, beta, ypiv, u, perm, full) +c----------------------------------------------------------------------- +c update conjugate directions and solution +c----------------------------------------------------------------------- + do 33 k=1,n + w(k,1) = w(k,ip2+2) + 33 continue + call uppdir(n, w(1,7), np, lb, indp, w, u, usav, fpar(11)) +c----------------------------------------------------------------------- + if (i .eq. 1) goto 34 + j = np - 1 + if (full) j = j-1 + if (.not.perm(j)) zeta = -zeta*ypiv(j) + 34 x = zeta/u(np) + if (perm(np))goto 36 + do 35 k=1,n + w(k,10) = w(k,10) + x*w(k,1) + 35 continue + fpar(11) = fpar(11) + 2 * n +c----------------------------------------------------------------------- + 36 if (ipar(3).eq.999) then + ipar(1) = 10 + ipar(8) = 9*n + 1 + ipar(9) = 10*n + 1 + ipar(10) = 9 + return + endif + res = abs(beta*zeta/umm) + fpar(5) = res * sqrt(distdot(n, w(1,i2+2), 1, w(1,i2+2), 1)) + fpar(11) = fpar(11) + 2 * n + if (ipar(3).lt.0) then + fpar(6) = x * sqrt(distdot(n,w,1,w,1)) + fpar(11) = fpar(11) + 2 * n + if (ipar(7).le.3) then + fpar(3) = fpar(6) + if (ipar(3).eq.-1) then + fpar(4) = fpar(1) * sqrt(fpar(3)) + fpar(2) + endif + endif + else + fpar(6) = fpar(5) + endif +c---- convergence test ----------------------------------------------- + 190 if (ipar(3).eq.999.and.ipar(11).eq.0) then + goto 30 + else if (fpar(6).gt.fpar(4) .and. (ipar(6).gt.ipar(7) .or. + + ipar(6).le.0)) then + goto 30 + endif +c----------------------------------------------------------------------- +c here the fact that the last step is different is accounted for. +c----------------------------------------------------------------------- + if (.not. perm(np)) goto 900 + x = zeta/umm + do 40 k = 1,n + w(k,10) = w(k,10) + x*w(k,1) + 40 continue + fpar(11) = fpar(11) + 2 * n +c +c right preconditioning and clean-up jobs +c + 900 if (rp) then + if (ipar(1).lt.0) ipar(12) = ipar(1) + ipar(1) = 5 + ipar(8) = 9*n + 1 + ipar(9) = ipar(8) + n + ipar(10) = 10 + return + endif + 200 if (rp) then + call tidycg(n,ipar,fpar,sol,w(1,11)) + else + call tidycg(n,ipar,fpar,sol,w(1,10)) + endif + return + end +c-----end-of-dbcg------------------------------------------------------- +c----------------------------------------------------------------------- + subroutine implu(np,umm,beta,ypiv,u,permut,full) + real*8 umm,beta,ypiv(*),u(*),x, xpiv + logical full, perm, permut(*) + integer np,k,npm1 +c----------------------------------------------------------------------- +c performs implicitly one step of the lu factorization of a +c banded hessenberg matrix. +c----------------------------------------------------------------------- + if (np .le. 1) goto 12 + npm1 = np - 1 +c +c -- perform previous step of the factorization- +c + do 6 k=1,npm1 + if (.not. permut(k)) goto 5 + x=u(k) + u(k) = u(k+1) + u(k+1) = x + 5 u(k+1) = u(k+1) - ypiv(k)*u(k) + 6 continue +c----------------------------------------------------------------------- +c now determine pivotal information to be used in the next call +c----------------------------------------------------------------------- + 12 umm = u(np) + perm = (beta .gt. abs(umm)) + if (.not. perm) goto 4 + xpiv = umm / beta + u(np) = beta + goto 8 + 4 xpiv = beta/umm + 8 permut(np) = perm + ypiv(np) = xpiv + if (.not. full) return +c shift everything up if full... + do 7 k=1,npm1 + ypiv(k) = ypiv(k+1) + permut(k) = permut(k+1) + 7 continue + return +c-----end-of-implu + end +c----------------------------------------------------------------------- + subroutine uppdir(n,p,np,lbp,indp,y,u,usav,flops) + real*8 p(n,lbp), y(*), u(*), usav(*), x, flops + integer k,np,n,npm1,j,ju,indp,lbp +c----------------------------------------------------------------------- +c updates the conjugate directions p given the upper part of the +c banded upper triangular matrix u. u contains the non zero +c elements of the column of the triangular matrix.. +c----------------------------------------------------------------------- + real*8 zero + parameter(zero=0.0D0) +c + npm1=np-1 + if (np .le. 1) goto 12 + j=indp + ju = npm1 + 10 if (j .le. 0) j=lbp + x = u(ju) /usav(j) + if (x .eq. zero) goto 115 + do 11 k=1,n + y(k) = y(k) - x*p(k,j) + 11 continue + flops = flops + 2*n + 115 j = j-1 + ju = ju -1 + if (ju .ge. 1) goto 10 + 12 indp = indp + 1 + if (indp .gt. lbp) indp = 1 + usav(indp) = u(np) + do 13 k=1,n + p(k,indp) = y(k) + 13 continue + 208 return +c----------------------------------------------------------------------- +c-------end-of-uppdir--------------------------------------------------- + end + subroutine givens(x,y,c,s) + real*8 x,y,c,s +c----------------------------------------------------------------------- +c Given x and y, this subroutine generates a Givens' rotation c, s. +c And apply the rotation on (x,y) ==> (sqrt(x**2 + y**2), 0). +c (See P 202 of "matrix computation" by Golub and van Loan.) +c----------------------------------------------------------------------- + real*8 t,one,zero + parameter (zero=0.0D0,one=1.0D0) +c + if (x.eq.zero .and. y.eq.zero) then + c = one + s = zero + else if (abs(y).gt.abs(x)) then + t = x / y + x = sqrt(one+t*t) + s = sign(one / x, y) + c = t*s + else if (abs(y).le.abs(x)) then + t = y / x + y = sqrt(one+t*t) + c = sign(one / y, x) + s = t*c + else +c +c X or Y must be an invalid floating-point number, set both to zero +c + x = zero + y = zero + c = one + s = zero + endif + x = abs(x*y) +c +c end of givens +c + return + end +c-----end-of-givens +c----------------------------------------------------------------------- + logical function stopbis(n,ipar,mvpi,fpar,r,delx,sx) + implicit none + integer n,mvpi,ipar(16) + real*8 fpar(16), r(n), delx(n), sx, distdot + external distdot +c----------------------------------------------------------------------- +c function for determining the stopping criteria. return value of +c true if the stopbis criteria is satisfied. +c----------------------------------------------------------------------- + if (ipar(11) .eq. 1) then + stopbis = .true. + else + stopbis = .false. + endif + if (ipar(6).gt.0 .and. ipar(7).ge.ipar(6)) then + ipar(1) = -1 + stopbis = .true. + endif + if (stopbis) return +c +c computes errors +c + fpar(5) = sqrt(distdot(n,r,1,r,1)) + fpar(11) = fpar(11) + 2 * n + if (ipar(3).lt.0) then +c +c compute the change in the solution vector +c + fpar(6) = sx * sqrt(distdot(n,delx,1,delx,1)) + fpar(11) = fpar(11) + 2 * n + if (ipar(7).lt.mvpi+mvpi+1) then +c +c if this is the end of the first iteration, set fpar(3:4) +c + fpar(3) = fpar(6) + if (ipar(3).eq.-1) then + fpar(4) = fpar(1) * fpar(3) + fpar(2) + endif + endif + else + fpar(6) = fpar(5) + endif +c +c .. the test is struct this way so that when the value in fpar(6) +c is not a valid number, STOPBIS is set to .true. +c + if (fpar(6).gt.fpar(4)) then + stopbis = .false. + ipar(11) = 0 + else + stopbis = .true. + ipar(11) = 1 + endif +c + return + end +c-----end-of-stopbis +c----------------------------------------------------------------------- + subroutine tidycg(n,ipar,fpar,sol,delx) + implicit none + integer i,n,ipar(16) + real*8 fpar(16),sol(n),delx(n) +c----------------------------------------------------------------------- +c Some common operations required before terminating the CG routines +c----------------------------------------------------------------------- + real*8 zero + parameter(zero=0.0D0) +c + if (ipar(12).ne.0) then + ipar(1) = ipar(12) + else if (ipar(1).gt.0) then + if ((ipar(3).eq.999 .and. ipar(11).eq.1) .or. + + fpar(6).le.fpar(4)) then + ipar(1) = 0 + else if (ipar(7).ge.ipar(6) .and. ipar(6).gt.0) then + ipar(1) = -1 + else + ipar(1) = -10 + endif + endif + if (fpar(3).gt.zero .and. fpar(6).gt.zero .and. + + ipar(7).gt.ipar(13)) then + fpar(7) = log10(fpar(3) / fpar(6)) / dble(ipar(7)-ipar(13)) + else + fpar(7) = zero + endif + do i = 1, n + sol(i) = sol(i) + delx(i) + enddo + return + end +c-----end-of-tidycg +c----------------------------------------------------------------------- + logical function brkdn(alpha, ipar) + implicit none + integer ipar(16) + real*8 alpha, beta, zero, one + parameter (zero=0.0D0, one=1.0D0) +c----------------------------------------------------------------------- +c test whether alpha is zero or an abnormal number, if yes, +c this routine will return .true. +c +c If alpha == 0, ipar(1) = -3, +c if alpha is an abnormal number, ipar(1) = -9. +c----------------------------------------------------------------------- + brkdn = .false. + if (alpha.gt.zero) then + beta = one / alpha + if (.not. beta.gt.zero) then + brkdn = .true. + ipar(1) = -9 + endif + else if (alpha.lt.zero) then + beta = one / alpha + if (.not. beta.lt.zero) then + brkdn = .true. + ipar(1) = -9 + endif + else if (alpha.eq.zero) then + brkdn = .true. + ipar(1) = -3 + else + brkdn = .true. + ipar(1) = -9 + endif + return + end +c-----end-of-brkdn +c----------------------------------------------------------------------- + subroutine bisinit(ipar,fpar,wksize,dsc,lp,rp,wk) + implicit none + integer i,ipar(16),wksize,dsc + logical lp,rp + real*8 fpar(16),wk(*) +c----------------------------------------------------------------------- +c some common initializations for the iterative solvers +c----------------------------------------------------------------------- + real*8 zero, one + parameter(zero=0.0D0, one=1.0D0) +c +c ipar(1) = -2 inidcate that there are not enough space in the work +c array +c + if (ipar(4).lt.wksize) then + ipar(1) = -2 + ipar(4) = wksize + return + endif +c + if (ipar(2).gt.2) then + lp = .true. + rp = .true. + else if (ipar(2).eq.2) then + lp = .false. + rp = .true. + else if (ipar(2).eq.1) then + lp = .true. + rp = .false. + else + lp = .false. + rp = .false. + endif + if (ipar(3).eq.0) ipar(3) = dsc +c .. clear the ipar elements used + ipar(7) = 0 + ipar(8) = 0 + ipar(9) = 0 + ipar(10) = 0 + ipar(11) = 0 + ipar(12) = 0 + ipar(13) = 0 +c +c fpar(1) must be between (0, 1), fpar(2) must be positive, +c fpar(1) and fpar(2) can NOT both be zero +c Normally return ipar(1) = -4 to indicate any of above error +c + if (fpar(1).lt.zero .or. fpar(1).ge.one .or. fpar(2).lt.zero .or. + & (fpar(1).eq.zero .and. fpar(2).eq.zero)) then + if (ipar(1).eq.0) then + ipar(1) = -4 + return + else + fpar(1) = 1.0D-6 + fpar(2) = 1.0D-16 + endif + endif +c .. clear the fpar elements + do i = 3, 10 + fpar(i) = zero + enddo + if (fpar(11).lt.zero) fpar(11) = zero +c .. clear the used portion of the work array to zero + do i = 1, wksize + wk(i) = zero + enddo +c + return +c-----end-of-bisinit + end +c----------------------------------------------------------------------- + subroutine mgsro(full,lda,n,m,ind,ops,vec,hh,ierr) + implicit none + logical full + integer lda,m,n,ind,ierr + real*8 ops,hh(m),vec(lda,m) +c----------------------------------------------------------------------- +c MGSRO -- Modified Gram-Schmidt procedure with Selective Re- +c Orthogonalization +c The ind'th vector of VEC is orthogonalized against the rest of +c the vectors. +c +c The test for performing re-orthogonalization is performed for +c each indivadual vectors. If the cosine between the two vectors +c is greater than 0.99 (REORTH = 0.99**2), re-orthogonalization is +c performed. The norm of the 'new' vector is kept in variable NRM0, +c and updated after operating with each vector. +c +c full -- .ture. if it is necessary to orthogonalize the ind'th +c against all the vectors vec(:,1:ind-1), vec(:,ind+2:m) +c .false. only orthogonalize againt vec(:,1:ind-1) +c lda -- the leading dimension of VEC +c n -- length of the vector in VEC +c m -- number of vectors can be stored in VEC +c ind -- index to the vector to be changed +c ops -- operation counts +c vec -- vector of LDA X M storing the vectors +c hh -- coefficient of the orthogonalization +c ierr -- error code +c 0 : successful return +c -1: zero input vector +c -2: input vector contains abnormal numbers +c -3: input vector is a linear combination of others +c +c External routines used: real*8 distdot +c----------------------------------------------------------------------- + integer i,k + real*8 nrm0, nrm1, fct, thr, distdot, zero, one, reorth + parameter (zero=0.0D0, one=1.0D0, reorth=0.98D0) + external distdot +c +c compute the norm of the input vector +c + nrm0 = distdot(n,vec(1,ind),1,vec(1,ind),1) + ops = ops + n + n + thr = nrm0 * reorth + if (nrm0.le.zero) then + ierr = - 1 + return + else if (nrm0.gt.zero .and. one/nrm0.gt.zero) then + ierr = 0 + else + ierr = -2 + return + endif +c +c Modified Gram-Schmidt loop +c + if (full) then + do 40 i = ind+1, m + fct = distdot(n,vec(1,ind),1,vec(1,i),1) + hh(i) = fct + do 20 k = 1, n + vec(k,ind) = vec(k,ind) - fct * vec(k,i) + 20 continue + ops = ops + 4 * n + 2 + if (fct*fct.gt.thr) then + fct = distdot(n,vec(1,ind),1,vec(1,i),1) + hh(i) = hh(i) + fct + do 30 k = 1, n + vec(k,ind) = vec(k,ind) - fct * vec(k,i) + 30 continue + ops = ops + 4*n + 1 + endif + nrm0 = nrm0 - hh(i) * hh(i) + if (nrm0.lt.zero) nrm0 = zero + thr = nrm0 * reorth + 40 continue + endif +c + do 70 i = 1, ind-1 + fct = distdot(n,vec(1,ind),1,vec(1,i),1) + hh(i) = fct + do 50 k = 1, n + vec(k,ind) = vec(k,ind) - fct * vec(k,i) + 50 continue + ops = ops + 4 * n + 2 + if (fct*fct.gt.thr) then + fct = distdot(n,vec(1,ind),1,vec(1,i),1) + hh(i) = hh(i) + fct + do 60 k = 1, n + vec(k,ind) = vec(k,ind) - fct * vec(k,i) + 60 continue + ops = ops + 4*n + 1 + endif + nrm0 = nrm0 - hh(i) * hh(i) + if (nrm0.lt.zero) nrm0 = zero + thr = nrm0 * reorth + 70 continue +c +c test the resulting vector +c + nrm1 = sqrt(distdot(n,vec(1,ind),1,vec(1,ind),1)) + ops = ops + n + n + 75 hh(ind) = nrm1 + if (nrm1.le.zero) then + ierr = -3 + return + endif +c +c scale the resulting vector +c + fct = one / nrm1 + do 80 k = 1, n + vec(k,ind) = vec(k,ind) * fct + 80 continue + ops = ops + n + 1 +c +c normal return +c + ierr = 0 + return +c end surbotine mgsro + end diff --git a/ITSOL/makefile b/ITSOL/makefile new file mode 100644 index 0000000..41bbeb7 --- /dev/null +++ b/ITSOL/makefile @@ -0,0 +1,27 @@ +FFLAGS = +F77 = f77 + +#F77 = cf77 +#FFLAGS = -Wf"-dp" + +LIBS = ../libskit.a ../UNSUPP/BLAS1/blas1.o + +riters.ex: riters.o iters.o ilut.o itaux.o $(LIBS) + $(F77) $(FFLAGS) -o riters.ex riters.o itaux.o $(LIBS) + +rilut.ex: rilut.o ilut.o iters.o itaux.o $(LIBS) + $(F77) $(FFLAGS) -o rilut.ex rilut.o itaux.o $(LIBS) + +riter2.ex: riter2.o iters.o ilut.o itaux.o $(LIBS) + $(F77) $(FFLAGS) -o riter2.ex riter2.o itaux.o $(LIBS) + +clean: + rm -f *.o *.ex core *.trace + +../UNSUPP/BLAS1/blas1.o: + (cd ../UNSUPP/BLAS1; $(F77) $(FFLAGS) -c blas1.f) + +../libskit.a: + (cd ..; $(MAKE) $(MAKEFLAGS) libskit.a) + + diff --git a/ITSOL/rilut.f b/ITSOL/rilut.f new file mode 100644 index 0000000..ddf4a70 --- /dev/null +++ b/ITSOL/rilut.f @@ -0,0 +1,285 @@ + program rilut +c----------------------------------------------------------------------- +c test program for ilut preconditioned gmres. +c this program generates a sparse matrix using +c matgen and then solves a linear system with an +c artificial rhs. +c----------------------------------------------------------------------- + implicit none +c + integer nmax, nzmax + parameter (nmax=5000,nzmax=100000) + integer ia(nmax),ja(nzmax),jau(nzmax),ju(nzmax),iw(nmax*3), + & iperm(nmax*2),ipar(16), levs(nzmax) + real*8 a(nzmax),x(nmax),y(nmax),au(nzmax),vv(nmax,20), + * xran(nmax),rhs(nmax),al(nmax),fpar(16) +c real t(2), t1, etime +c + integer nx,ny,nz,n,j,k,ierr,meth,lfil,nwk,im,maxits,iout + real*8 tol,permtol,eps,alph,gammax,gammay,alpha + external gmres +c + common /func/ gammax, gammay, alpha +c----------------------------------------------------------------------- +c pde to be discretized is : +c--------------------------- +c +c -Lap u + gammax exp (xy)delx u + gammay exp (-xy) dely u +alpha u +c +c where Lap = 2-D laplacean, delx = part. der. wrt x, +c dely = part. der. wrt y. +c gammax, gammay, and alpha are passed via the commun func. +c +c----------------------------------------------------------------------- +c +c data for PDE: +c + nx = 30 + ny = 30 + nz = 1 + alpha = -50.0 + gammax = 10.0 + gammay = 10.0 +c +c data for preconditioner +c + nwk = nzmax +c +c data for GMRES +c + im = 10 + eps = 1.0D-07 + maxits = 100 + iout = 6 + permtol = 1.0 + ipar(2) = 2 + ipar(3) = 2 + ipar(4) = 20*nmax + ipar(5) = im + ipar(6) = maxits + fpar(1) = eps + fpar(2) = 2.22D-16 +c +c same initial guess for gmres +c +c-------------------------------------------------------------- +c call gen57 to generate matrix in compressed sparse row format +c-------------------------------------------------------------- +c +c define part of the boundary condition here +c + al(1) = 0.0 + al(2) = 1.0 + al(3) = 0.0 + al(4) = 0.0 + al(5) = 0.0 + al(6) = 0.0 + call gen57pt(nx,ny,nz,al,0,n,a,ja,ia,ju,rhs) +c +c zero initial guess to the iterative solvers +c + do j=1, n + xran(j) = 0.d0 + enddo + print *, 'RILUT: generated a finite difference matrix' + print *, ' grid size = ', nx, ' X ', ny, ' X ', nz + print *, ' matrix size = ', n +c-------------------------------------------------------------- +c gnerate right han side = A * (1,1,1,...,1)**T +c-------------------------------------------------------------- + do k=1,n + x(k) = 1.0 + enddo + call amux(n, x, y, a, ja, ia) +c-------------------------------------------------------------- +c test all different methods available: +c ILU0, MILU0, ILUT and with different values of tol and lfil +c ( from cheaper to more expensive preconditioners) +c The more accurate the preconditioner the fewer iterations +c are required in pgmres, in general. +c +c-------------------------------------------------------------- + do 200 meth = 1, 15 + goto (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) meth + 1 continue + write (iout,*) ' +++++ ILU(0) Preconditioner ++++ ' +c t1 = etime(t) + call ilu0 (n, a, ja, ia, au, jau, ju, iw, ierr) +c t1 = etime(t) - t1 + goto 100 + 2 continue + write (iout,*) ' +++++ MILU(0) Preconditioner ++++ ' +c t1 = etime(t) + call milu0 (n, a, ja, ia, au, jau, ju, iw, ierr) +c t1 = etime(t) - t1 + goto 100 + 3 continue + write (iout,*) ' +++++ ILUT Preconditioner ++++ ' + write (iout,*) ' +++++ tol = 0.0001, lfil=5 ++++ ' + tol = 0.0001 + lfil = 5 +c +c t1 = etime(t) + call ilut (n,a,ja,ia,lfil,tol,au,jau,ju,nwk,vv,iw,ierr) +c t1 = etime(t) - t1 + goto 100 + 4 continue + write (iout,*) ' +++++ ILUT Preconditioner ++++ ' + write (iout,*) ' +++++ tol = 0.0001, lfil=10 ++++ ' + tol = 0.0001 + lfil = 10 +c +c t1 = etime(t) + call ilut (n,a,ja,ia,lfil,tol,au,jau,ju,nwk,vv,iw,ierr) + +c t1 = etime(t) - t1 + goto 100 + 5 continue + write (iout,*) ' +++++ ILUT Preconditioner ++++ ' + write (iout,*) ' +++++ tol = .0001, lfil=15 ++++ ' + tol = 0.0001 + lfil = 15 +c +c t1 = etime(t) + call ilut (n,a,ja,ia,lfil,tol,au,jau,ju,nwk,vv,iw,ierr) +c t1 = etime(t) - t1 + goto 100 + 6 continue + write (iout,*) ' +++++ ILUTP Preconditioner ++++ ' + write (iout,*) ' +++++ tol = 0.0001, lfil=5 ++++ ' + tol = 0.0001 + lfil = 5 +c +c t1 = etime(t) + call ilutp(n,a,ja,ia,lfil,tol,permtol,n,au,jau,ju,nwk, + * vv,iw,iperm,ierr) +c t1 = etime(t) - t1 + goto 100 + 7 continue + write (iout,*) ' +++++ ILUTP Preconditioner ++++ ' + write (iout,*) ' +++++ tol = 0.0001, lfil=10 ++++ ' + tol = 0.0001 + lfil = 10 +c +c t1 = etime(t) + call ilutp(n,a,ja,ia,lfil,tol,permtol,n,au,jau,ju,nwk, + * vv,iw,iperm,ierr) +c t1 = etime(t) - t1 + goto 100 +c----------------------------------------------------------------------------- + 8 continue + write (iout,*) ' +++++ ILUTP Preconditioner ++++ ' + write (iout,*) ' +++++ tol = .0001, lfil=15 ++++ ' + tol = 0.0001 + lfil = 15 +c +c t1 = etime(t) + call ilutp(n,a,ja,ia,lfil,tol,permtol,n,au,jau,ju,nwk, + * vv,iw,iperm,ierr) +c t1 = etime(t) - t1 + goto 100 + 9 continue + write (iout,*) ' +++++ ILUK Preconditioner ++++ ' + write (iout,*) ' +++++ lfil=0 ++++ ' + lfil = 0 +c t1 = etime(t) + call iluk(n,a,ja,ia,lfil,au,jau,ju,levs,nwk,vv,iw,ierr) + print *, ' nnz for a =', ia(n+1) - ia(1) + print *, ' nnz for ilu =', jau(n+1) -jau(1) + n +c t1 = etime(t) - t1 + goto 100 +c + 10 continue + write (iout,*) ' +++++ ILUK Preconditioner ++++ ' + write (iout,*) ' +++++ lfil=1 ++++ ' + lfil = 1 +c t1 = etime(t) + call iluk(n,a,ja,ia,lfil,au,jau,ju,levs,nwk,vv,iw,ierr) + print *, ' nnz for a =', ia(n+1) - ia(1) + print *, ' nnz for ilu =', jau(n+1) -jau(1) + n +c t1 = etime(t) - t1 + goto 100 +c + 11 continue + write (iout,*) ' +++++ ILUK Preconditioner ++++ ' + write (iout,*) ' +++++ lfil=3 ++++ ' + lfil = 3 +c t1 = etime(t) + call iluk(n,a,ja,ia,lfil,au,jau,ju,levs,nwk,vv,iw,ierr) + print *, ' nnz for a =', ia(n+1) - ia(1) + print *, ' nnz for ilu =', jau(n+1) -jau(1) + n +c t1 = etime(t) - t1 + goto 100 +c + 12 continue + write (iout,*) ' +++++ ILUK Preconditioner ++++ ' + write (iout,*) ' +++++ lfil=6 ++++ ' + lfil = 6 +c t1 = etime(t) + call iluk(n,a,ja,ia,lfil,au,jau,ju,levs,nwk,vv,iw,ierr) + print *, ' nnz for a =', ia(n+1) - ia(1) + print *, ' nnz for ilu =', jau(n+1) -jau(1) + n +c t1 = etime(t) - t1 + goto 100 +c + 13 continue +c----------------------------------------------------------------------- + write (iout,*) ' +++++ ILUD Preconditioner ++++ ' + write (iout,*) ' +++++ tol=0.075, alpha=0.0 ++++ ' + tol = 0.075 + alph= 0.0 +c t1 = etime(t) + call ilud(n,a,ja,ia,alph,tol,au,jau,ju,nwk,vv,iw,ierr) +c + print *, ' nnz for a =', ia(n+1) - ia(1) + print *, ' nnz for ilu =', jau(n+1) -jau(1) + n +c t1 = etime(t) - t1 + goto 100 +c + 14 continue + write (iout,*) ' +++++ ILUD Preconditioner ++++ ' + write (iout,*) ' +++++ tol=0.075, alpha=1.0 ++++ ' + tol = 0.075 + alph=1.0 +c t1 = etime(t) + call ilud(n,a,ja,ia,alph,tol,au,jau,ju,nwk,vv,iw,ierr) + print *, ' nnz for a =', ia(n+1) - ia(1) + print *, ' nnz for ilu =', jau(n+1) -jau(1) + n +c t1 = etime(t) - t1 + goto 100 + + 15 continue + write (iout,*) ' +++++ ILUD Preconditioner ++++ ' + write (iout,*) ' +++++ tol=0.01, alpha=1.0 ++++ ' + tol = 0.01 +c t1 = etime(t) + call ilud(n,a,ja,ia,alph,tol,au,jau,ju,nwk,vv,iw,ierr) + print *, ' nnz for a =', ia(n+1) - ia(1) + print *, ' nnz for ilu =', jau(n+1) -jau(1) + n +c t1 = etime(t) - t1 +c goto 100 +c + 100 continue +c +c check that return was succesful +c +c print *, ' ILU factorization time ', t1 + print *, ' Precon set-up returned with ierr ', ierr + if (ierr .ne. 0) goto 200 +c-------------------------------------------------------------- +c call GMRES +c-------------------------------------------------------------- + call runrc(n,y,x,ipar,fpar,vv,xran,a,ja,ia,au,jau,ju, + + gmres) + print *, 'GMRES return status = ', ipar(1) + write (iout,*) ' ' + 200 continue +c +c---------------------------------------------------------- +c + write (iout,*) ' **** SOLUTION **** ' + write(iout, 111) (x(k),k=1,n) + 111 format (5d15.5) + stop + end + diff --git a/ITSOL/riter2.f b/ITSOL/riter2.f new file mode 100644 index 0000000..01b50d6 --- /dev/null +++ b/ITSOL/riter2.f @@ -0,0 +1,102 @@ + program riters +c----------------------------------------------------------------------- +c test program for iters -- the basic iterative solvers +c +c this program reads a Harwell/Boeing matrix from standard input +c and solves the linear system with an artifical right-hand side +c (the solution is a vector of (1,1,...,1)^T) +c----------------------------------------------------------------------- +c implicit none +c implicit real*8 (a-h,o-z) + integer nmax, nzmax, maxits,lwk + parameter (nmax=5000,nzmax=100000,maxits=60,lwk=nmax*40) + integer ia(nmax),ja(nzmax),jau(nzmax),ju(nzmax),iw(nmax*3) + integer ipar(16),i,lfil,nwk,nrow,ierr + real*8 a(nzmax),sol(nmax),rhs(nmax),au(nzmax),wk(nmax*40) + real*8 xran(nmax), fpar(16), tol + character guesol*2, title*72, key*8, type*3 + external cg,bcg,dbcg,bcgstab,tfqmr,gmres,fgmres,dqgmres + external cgnr, fom, runrc, ilut +c +c set the parameters for the iterative solvers +c + ipar(2) = 2 + ipar(3) = 1 + ipar(4) = lwk + ipar(5) = 16 + ipar(6) = maxits + fpar(1) = 1.0D-5 + fpar(2) = 1.0D-10 +c-------------------------------------------------------------- +c read in a matrix from standard input +c-------------------------------------------------------------- + iounit = 5 + job = 2 + nrhs = 0 + call readmt (nmax,nzmax,job,iounit,a,ja,ia,a,nrhs, + * guesol,nrow,ncol,nnz,title,key,type,ierr) + print *, 'READ the matrix ', key, type + print *, title + print * +c +c set-up the preconditioner ILUT(15, 1E-4) ! new definition of lfil +c + lfil = 15 + tol = 1.0D-4 ! this is too high for ilut for saylr1 + tol = 1.0D-7 + nwk = nzmax + call ilut (nrow,a,ja,ia,lfil,tol,au,jau,ju,nwk, + * wk,iw,ierr) + ipar(2) = 2 +c +c generate a linear system with known solution +c + do i = 1, nrow + sol(i) = 1.0D0 + xran(i) = 0.D0 + end do + call amux(nrow, sol, rhs, a, ja, ia) + print *, ' ' + print *, ' *** CG ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + cg) + print *, ' ' + print *, ' *** BCG ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + bcg) + print *, ' ' + print *, ' *** DBCG ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + dbcg) + print *, ' ' + print *, ' *** CGNR ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + cgnr) + print *, ' ' + print *, ' *** BCGSTAB ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + bcgstab) + print *, ' ' + print *, ' *** TFQMR ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + tfqmr) + print *, ' ' + print *, ' *** FOM ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + fom) + print *, ' ' + print *, ' *** GMRES ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + gmres) + print *, ' ' + print *, ' *** FGMRES ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + fgmres) + print *, ' ' + print *, ' *** DQGMRES ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + dqgmres) + stop + end +c-----end-of-main +c----------------------------------------------------------------------- diff --git a/ITSOL/riters.f b/ITSOL/riters.f new file mode 100644 index 0000000..1ad8e69 --- /dev/null +++ b/ITSOL/riters.f @@ -0,0 +1,129 @@ + program riters +c----------------------------------------------------------------------- +c test program for iters -- the basic iterative solvers +c +c this program generates a sparse matrix using +c GEN57PT and then solves a linear system with an +c artificial rhs (the solution is a vector of (1,1,...,1)^T). +c----------------------------------------------------------------------- +c implicit none +c implicit real*8 (a-h,o-z) + integer nmax, nzmax, maxits,lwk + parameter (nmax=5000,nzmax=100000,maxits=60,lwk=nmax*40) + integer ia(nmax),ja(nzmax),jau(nzmax),ju(nzmax),iw(nmax*3) + integer ipar(16),nx,ny,nz,i,lfil,nwk,nrow,ierr + real*8 a(nzmax),sol(nmax),rhs(nmax),au(nzmax),wk(nmax*40) + real*8 xran(nmax), fpar(16), al(nmax) + real*8 gammax,gammay,alpha,tol + external gen57pt,cg,bcg,dbcg,bcgstab,tfqmr,gmres,fgmres,dqgmres + external cgnr, fom, runrc, ilut +c + common /func/ gammax, gammay, alpha +c----------------------------------------------------------------------- +c pde to be discretized is : +c--------------------------- +c +c -Lap u + gammax exp (xy)delx u + gammay exp (-xy) dely u +alpha u +c +c where Lap = 2-D laplacean, delx = part. der. wrt x, +c dely = part. der. wrt y. +c gammax, gammay, and alpha are passed via the commun func. +c +c----------------------------------------------------------------------- +c +c data for PDE: +c + nx = 6 + ny = 6 + nz = 1 + alpha = 0.0 + gammax = 0.0 + gammay = 0.0 +c +c set the parameters for the iterative solvers +c + ipar(2) = 2 + ipar(3) = 1 + ipar(4) = lwk + ipar(5) = 10 + ipar(6) = maxits + fpar(1) = 1.0D-5 + fpar(2) = 1.0D-10 +c-------------------------------------------------------------- +c call GEN57PT to generate matrix in compressed sparse row format +c +c al(1:6) are used to store part of the boundary conditions +c (see documentation on GEN57PT.) +c-------------------------------------------------------------- + al(1) = 0.0 + al(2) = 0.0 + al(3) = 0.0 + al(4) = 0.0 + al(5) = 0.0 + al(6) = 0.0 + nrow = nx * ny * nz + call gen57pt(nx,ny,nz,al,0,nrow,a,ja,ia,ju,rhs) + print *, 'RITERS: generated a finite difference matrix' + print *, ' grid size = ', nx, ' X ', ny, ' X ', nz + print *, ' matrix size = ', nrow +c +c set-up the preconditioner ILUT(15, 1E-4) ! new definition of lfil +c + lfil = 3 + tol = 1.0D-4 + nwk = nzmax + call ilut (nrow,a,ja,ia,lfil,tol,au,jau,ju,nwk, + * wk,iw,ierr) + ipar(2) = 2 +c +c generate a linear system with known solution +c + do i = 1, nrow + sol(i) = 1.0D0 + xran(i) = 0.d0 + end do + call amux(nrow, sol, rhs, a, ja, ia) + print *, ' ' + print *, ' *** CG ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + cg) + print *, ' ' + print *, ' *** BCG ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + bcg) + print *, ' ' + print *, ' *** DBCG ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + dbcg) + print *, ' ' + print *, ' *** CGNR ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + cgnr) + print *, ' ' + print *, ' *** BCGSTAB ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + bcgstab) + print *, ' ' + print *, ' *** TFQMR ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + tfqmr) + print *, ' ' + print *, ' *** FOM ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + fom) + print *, ' ' + print *, ' *** GMRES ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + gmres) + print *, ' ' + print *, ' *** FGMRES ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + fgmres) + print *, ' ' + print *, ' *** DQGMRES ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + dqgmres) + stop + end +c-----end-of-main +c----------------------------------------------------------------------- diff --git a/ITSOL/riters_sav b/ITSOL/riters_sav new file mode 100644 index 0000000..d4bc99a --- /dev/null +++ b/ITSOL/riters_sav @@ -0,0 +1,129 @@ + program riters +c----------------------------------------------------------------------- +c test program for iters -- the basic iterative solvers +c +c this program generates a sparse matrix using +c GEN57PT and then solves a linear system with an +c artificial rhs (the solution is a vector of (1,1,...,1)^T). +c----------------------------------------------------------------------- +c implicit none +c implicit real*8 (a-h,o-z) + integer nmax, nzmax, maxits,lwk + parameter (nmax=5000,nzmax=100000,maxits=60,lwk=nmax*40) + integer ia(nmax),ja(nzmax),jau(nzmax),ju(nzmax),iw(nmax*3) + integer ipar(16),nx,ny,nz,i,lfil,nwk,nrow,ierr + real*8 a(nzmax),sol(nmax),rhs(nmax),au(nzmax),wk(nmax*40) + real*8 xran(nmax), fpar(16), al(nmax) + real*8 gammax,gammay,alpha,tol + external gen57pt,cg,bcg,dbcg,bcgstab,tfqmr,gmres,fgmres,dqgmres + external cgnr, fom, runrc, ilut +c + common /func/ gammax, gammay, alpha +c----------------------------------------------------------------------- +c pde to be discretized is : +c--------------------------- +c +c -Lap u + gammax exp (xy)delx u + gammay exp (-xy) dely u +alpha u +c +c where Lap = 2-D laplacean, delx = part. der. wrt x, +c dely = part. der. wrt y. +c gammax, gammay, and alpha are passed via the commun func. +c +c----------------------------------------------------------------------- +c +c data for PDE: +c + nx = 50 + ny = 50 + nz = 1 + alpha = -50.0 + gammax = 10.0 + gammay = 10.0 +c +c set the parameters for the iterative solvers +c + ipar(2) = 2 + ipar(3) = 1 + ipar(4) = lwk + ipar(5) = 16 + ipar(6) = maxits + fpar(1) = 1.0D-5 + fpar(2) = 1.0D-10 +c-------------------------------------------------------------- +c call GEN57PT to generate matrix in compressed sparse row format +c +c al(1:6) are used to store part of the boundary conditions +c (see documentation on GEN57PT.) +c-------------------------------------------------------------- + al(1) = 0.0 + al(2) = 0.0 + al(3) = 0.0 + al(4) = 0.0 + al(5) = 0.0 + al(6) = 0.0 + nrow = nx * ny * nz + call gen57pt(nx,ny,nz,al,0,nrow,a,ja,ia,ju,rhs) + print *, 'RITERS: generated a finite difference matrix' + print *, ' grid size = ', nx, ' X ', ny, ' X ', nz + print *, ' matrix size = ', nrow +c +c set-up the preconditioner ILUT(15, 1E-4) ! new definition of lfil +c + lfil = 15 + tol = 1.0D-4 + nwk = nzmax + call ilut (nrow,a,ja,ia,lfil,tol,au,jau,ju,nwk, + * wk,iw,ierr) + ipar(2) = 2 +c +c generate a linear system with known solution +c + do i = 1, nrow + sol(i) = 1.0D0 + xran(i) = 0.d0 + end do + call amux(nrow, sol, rhs, a, ja, ia) + print *, ' ' + print *, ' *** CG ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + cg) + print *, ' ' + print *, ' *** BCG ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + bcg) + print *, ' ' + print *, ' *** DBCG ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + dbcg) + print *, ' ' + print *, ' *** CGNR ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + cgnr) + print *, ' ' + print *, ' *** BCGSTAB ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + bcgstab) + print *, ' ' + print *, ' *** TFQMR ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + tfqmr) + print *, ' ' + print *, ' *** FOM ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + fom) + print *, ' ' + print *, ' *** GMRES ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + gmres) + print *, ' ' + print *, ' *** FGMRES ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + fgmres) + print *, ' ' + print *, ' *** DQGMRES ***' + call runrc(nrow,rhs,sol,ipar,fpar,wk,xran,a,ja,ia,au,jau,ju, + + dqgmres) + stop + end +c-----end-of-main +c----------------------------------------------------------------------- diff --git a/ITSOL/runilut.f b/ITSOL/runilut.f new file mode 100644 index 0000000..8eb817f --- /dev/null +++ b/ITSOL/runilut.f @@ -0,0 +1,264 @@ + program runall +c----------------------------------------------------------------------- +c not present: CG and FGMRES +c----------------------------------------------------------------------- +c program for running all examples -- for book tables. +c----------------------------------------------------------------------- + parameter (nmax=10000,np1=nmax+1,nt2=2*nmax,nzmax = 100000, + * lw=31*nmax,nzumax = 20*nzmax) +c----------------------------------------------------------------------- + implicit none +c + integer ia(nt2),ja(nzmax),jlu(nzumax),levs(nzumax),ju(nmax+1) + real*8 wk(lw),rhs(nmax),a(nzmax),alu(nzumax) + integer jw(nt2), iperm(nt2) + real*8 w(nt2),sol(nt2) + integer n, mbloc + character guesol*2, title*72, key*8, type*3 +c----------------------------------------------------------------------- + integer iout,lfil,j,k,maxits,i,ncol,numat,mat,iwk,nnz,ipo,ipi,iin, + * job,nrhs,im,outf,ipre,its,ierr,ipre1,ipre2,lf,it,itp, + * icode,imat,kk,lfinc, niter + character*50 filnam + integer iters(20) +c +c up to 10 matrices +c + real*8 droptol, dropinc, t, permtol, tol, eps, rand, alph, dnrm2 +c +c----------------------------------------------------------------------- + data iin/4/, iout/8/ +c----------------------------------------------------------------------- + iwk = nzumax +c +c read in matrix pathname from file. == then read matrix itself +c + open (2, file ='matfile') + read (2,*) numat + i=20 +c----------------------------------------------------------------------- + open (iin,file='inputs') + read (iin,*) alph + read (iin,*) im, maxits + read (iin,*) eps + read (iin,*) ipre1, ipre2, niter + read (iin,*) tol, dropinc, permtol + read (iin,*) lf, lfinc + outf = 30 +c +c BIG MATRIX LOOP +c +c----------------------------------------------------------------------- +c LOOP THROUGH MATRICES +c----------------------------------------------------------------------- + do 300 mat =1, numat + read (2,'(a50)') filnam + imat = 20 + open (imat,file =filnam) + write (7,*) filnam + job = 3 + nrhs = nmax + call readmt (nmax,nzmax,job,imat,a,ja,ia, rhs, nrhs, + * guesol,n,ncol,nnz,title,key,type,ierr) +c----------------------------------------------------------------------- + rewind(imat) + write (7,*) ' -- read -- returned with ierr = ', ierr + write (7,*) ' matrix ', filnam + write (7,*) ' *** n = ', n, ' nnz ', nnz + if (ierr .ne. 0) stop ' not able to read *** ' +c +c sort matrix +c + call csort(n,a,ja,ia,jlu,.true.) + job = 0 + call roscal(n,job,1,a,ja,ia,wk,a,ja,ia,ierr) + call coscal(n,job,1,a,ja,ia,wk,a,ja,ia,ierr) +c----------------------------------------------------------------------- +c LOOP THROUGH PRECONDITONERS +c----------------------------------------------------------------------- + droptol = tol + lfil = lf + kk = 0 + do 500 ipre = ipre1, ipre2 +c----------------------------------------------------------------------- +c ipre = 1 --> ILUD +c ipre = 2 --> ILUT +c ipre = 3 --> ILUDP +c ipre = 4 --> ILUTP +c ipre = 5 --> ILUK +c----------------------------------------------------------------------- + lfil = lf + droptol = tol + do 350 itp =1, niter + do k=1,n + sol(k) = 1.0 + enddo +c + call amux (n, sol, rhs, a, ja, ia) +c + goto (1,2,3,4) ipre +c + 1 continue + call ilud (n,a,ja,ia,alph,droptol,alu,jlu,ju,iwk, + * w,jw,ierr) + if (ierr .ne. 0) write (7,*) ' ilud ierr = ', ierr + call stb_test(n,rhs,alu,jlu,ju,t) + write (7,*) ' ILUD-drpt =', droptol, ' stbtest = ', t + write (7,*) ' --- fill-in =', jlu(n+1)-jlu(1) +c + goto 100 + 2 continue +c + call ilutn (n,a,ja,ia,lfil,droptol,alu,jlu,ju,iwk,w,jw, + * ierr) + if (ierr .ne. 0) write (7,*) ' ILUT ierr = ', ierr + call stb_test(n,rhs,alu,jlu,ju,t) + write (7,*) ' ILUT-drpt =', droptol, + * ' lfil = ', lfil, ' stbtest = ', t + write (7,*) ' --- fill-in =', jlu(n+1)-jlu(1) +c + goto 100 +c +c pivoting codes +c + 3 continue + mbloc = n + call iludp (n,a,ja,ia,alph,droptol,permtol,mbloc,alu, + * jlu,ju,iwk,w,jw,iperm,ierr) + if (ierr .ne. 0) write (7,*) ' ilud ierr = ', ierr + call stb_test(n,rhs,alu,jlu,ju,t) + write (7,*) ' ILUD-drpt =', droptol, ' stbtest = ', t + write (7,*) ' --- fill-in =', jlu(n+1)-jlu(1) + goto 100 + 4 continue + mbloc = n + call ilutpn (n,a,ja,ia,lfil,droptol,permtol,mbloc,alu, + * jlu,ju,iwk,w,jw,iperm,ierr) + if (ierr .ne. 0) write (7,*) ' milutp ierr = ', ierr +c + call stb_test(n,rhs,alu,jlu,ju,t) + write (7,*) ' ILUTP-drpt =', droptol, + * ' lfil = ', lfil, ' stbtest = ', t + write (7,*) ' --- fill-in =', jlu(n+1)-jlu(1) + + goto 100 + 5 continue +c + call ilukn(n,a,ja,ia,lfil,alu,jlu,ju,levs,iwk,w,jw,ierr) + if (ierr .ne. 0) write (7,*) ' ILUT ierr = ', ierr + call stb_test(n,rhs,alu,jlu,ju,t) + write (7,*) ' ILUK -- lfil = ', lfil,' stbtest = ', t + write (7,*) ' --- fill-in =', jlu(n+1)-jlu(1) +c goto 100 +c ----------- +c big loop -- +c ----------- + 100 continue + + do 11 k=1,n + sol(k) = 1.0 + 11 continue + + call amux (n, sol, rhs, a, ja, ia) + do 12 j=1, n + sol(j) = rand(j) + 12 continue + its = 0 +c----------------------------------------------------------------------- + 10 continue +c + call fgmr (n,im,rhs,sol,it,wk,ipo,ipi,eps,maxits,0,icode) +c----------------------------------------------------------------------- + if (icode.eq.1) then + call amux(n, wk(ipo), wk(ipi), a, ja, ia) + its = its+1 + goto 10 + else if (icode.eq.3 .or. icode.eq.5) then +c +c output the residuals here ... +c + if (ipre .eq. 0) then +c NOPRE + call dcopy(n, wk(ipo),1,wk(ipi),1) + else + call lusol(n,wk(ipo),wk(ipi),alu,jlu,ju) + endif + goto 10 + endif +c +c done *** +c + call amux(n,sol,wk,a,ja,ia) +c + do i = 1, n + wk(n+i) = sol(i) -1.0D0 + wk(i) = wk(i) - rhs(i) + end do +c + kk = kk+1 + iters(kk) = its +c res(kk) = dnrm2(n,wk,1) +c err(kk) = dnrm2(n,wk(n+1),1) + write (iout, *) '# actual residual norm ', dnrm2(n,wk,1) + write (iout, *) '# error norm ', dnrm2(n,wk(1+n),1) +c + droptol = droptol*dropinc + lfil = lfil + lfinc +c +c pivoting codes +c + if (ipre .ge. 3) then + do k=1, ia(n+1)-1 + ja(k) = iperm(ja(k)) + enddo + endif + 350 continue +c + 500 continue + call entline(outf,filnam,iters,kk) + close (imat) + 300 continue + stop +c-------------end-of-main-program-ilut_solve_new------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + function distdot(n,x,ix,y,iy) + integer n, ix, iy + real*8 distdot, x(*), y(*), ddot + external ddot + distdot = ddot(n,x,ix,y,iy) + return +c-----end-of-distdot +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine entline(outf,mat,its,kk) + implicit none + integer outf, kk,its(kk),k + character mat*70 +c real*8 err(kk), res(kk) +c----------------------------------------------------------------------- + write(outf,100) mat(19:29),(its(k),k=1,8) + 100 format + * (a,' & ', 8(i4,' & '),'\\\\ \\hline') + return + end +c----------------------------------------------------------------------- + subroutine stb_test(n,sol,alu,jlu,ju,tmax) + implicit none + integer n, jlu(*),ju(*) + real*8 sol(n),alu(*),tmax +c----------------------------------------------------------------------- + real*8 max, t, abs + integer j +c + call lusol(n,sol,sol,alu,jlu,ju) +c + tmax = 0.0 + do j=1, n + t = abs(sol(j)) + tmax = max(t,tmax) + enddo + return + end diff --git a/ITSOL/saylr1 b/ITSOL/saylr1 new file mode 100644 index 0000000..a5a0f2f --- /dev/null +++ b/ITSOL/saylr1 @@ -0,0 +1,367 @@ +1UNSYMMETRIC MATRIX OF PAUL SAYLOR - 14 BY 17 2D GRID MAY, 1983 SAYLR1 + 363 24 113 226 0 +RUA 238 238 1128 0 +(10I8) (10I8) (5E16.8) + 1 4 8 12 16 20 24 28 32 36 + 40 44 48 52 55 59 64 69 74 79 + 84 89 94 99 104 109 114 119 123 127 + 132 137 142 147 152 157 162 167 172 177 + 182 187 191 195 200 205 210 215 220 225 + 230 235 240 245 250 255 259 263 268 273 + 278 283 288 293 298 303 308 313 318 323 + 327 331 336 341 346 351 356 361 366 371 + 376 381 386 391 395 399 404 409 414 419 + 424 429 434 439 444 449 454 459 463 467 + 472 477 482 487 492 497 502 507 512 517 + 522 527 531 535 540 545 550 555 560 565 + 570 575 580 585 590 595 599 603 608 613 + 618 623 628 633 638 643 648 653 658 663 + 667 671 676 681 686 691 696 701 706 711 + 716 721 726 731 735 739 744 749 754 759 + 764 769 774 779 784 789 794 799 803 807 + 812 817 822 827 832 837 842 847 852 857 + 862 867 871 875 880 885 890 895 900 905 + 910 915 920 925 930 935 939 943 948 953 + 958 963 968 973 978 983 988 993 998 1003 + 1007 1011 1016 1021 1026 1031 1036 1041 1046 1051 + 1056 1061 1066 1071 1075 1078 1082 1086 1090 1094 + 1098 1102 1106 1110 1114 1118 1122 1126 1129 + 1 2 15 1 2 3 16 2 3 4 + 17 3 4 5 18 4 5 6 19 5 + 6 7 20 6 7 8 21 7 8 9 + 22 8 9 10 23 9 10 11 24 10 + 11 12 25 11 12 13 26 12 13 14 + 27 13 14 28 1 15 16 29 2 15 + 16 17 30 3 16 17 18 31 4 17 + 18 19 32 5 18 19 20 33 6 19 + 20 21 34 7 20 21 22 35 8 21 + 22 23 36 9 22 23 24 37 10 23 + 24 25 38 11 24 25 26 39 12 25 + 26 27 40 13 26 27 28 41 14 27 + 28 42 15 29 30 43 16 29 30 31 + 44 17 30 31 32 45 18 31 32 33 + 46 19 32 33 34 47 20 33 34 35 + 48 21 34 35 36 49 22 35 36 37 + 50 23 36 37 38 51 24 37 38 39 + 52 25 38 39 40 53 26 39 40 41 + 54 27 40 41 42 55 28 41 42 56 + 29 43 44 57 30 43 44 45 58 31 + 44 45 46 59 32 45 46 47 60 33 + 46 47 48 61 34 47 48 49 62 35 + 48 49 50 63 36 49 50 51 64 37 + 50 51 52 65 38 51 52 53 66 39 + 52 53 54 67 40 53 54 55 68 41 + 54 55 56 69 42 55 56 70 43 57 + 58 71 44 57 58 59 72 45 58 59 + 60 73 46 59 60 61 74 47 60 61 + 62 75 48 61 62 63 76 49 62 63 + 64 77 50 63 64 65 78 51 64 65 + 66 79 52 65 66 67 80 53 66 67 + 68 81 54 67 68 69 82 55 68 69 + 70 83 56 69 70 84 57 71 72 85 + 58 71 72 73 86 59 72 73 74 87 + 60 73 74 75 88 61 74 75 76 89 + 62 75 76 77 90 63 76 77 78 91 + 64 77 78 79 92 65 78 79 80 93 + 66 79 80 81 94 67 80 81 82 95 + 68 81 82 83 96 69 82 83 84 97 + 70 83 84 98 71 85 86 99 72 85 + 86 87 100 73 86 87 88 101 74 87 + 88 89 102 75 88 89 90 103 76 89 + 90 91 104 77 90 91 92 105 78 91 + 92 93 106 79 92 93 94 107 80 93 + 94 95 108 81 94 95 96 109 82 95 + 96 97 110 83 96 97 98 111 84 97 + 98 112 85 99 100 113 86 99 100 101 + 114 87 100 101 102 115 88 101 102 103 + 116 89 102 103 104 117 90 103 104 105 + 118 91 104 105 106 119 92 105 106 107 + 120 93 106 107 108 121 94 107 108 109 + 122 95 108 109 110 123 96 109 110 111 + 124 97 110 111 112 125 98 111 112 126 + 99 113 114 127 100 113 114 115 128 101 + 114 115 116 129 102 115 116 117 130 103 + 116 117 118 131 104 117 118 119 132 105 + 118 119 120 133 106 119 120 121 134 107 + 120 121 122 135 108 121 122 123 136 109 + 122 123 124 137 110 123 124 125 138 111 + 124 125 126 139 112 125 126 140 113 127 + 128 141 114 127 128 129 142 115 128 129 + 130 143 116 129 130 131 144 117 130 131 + 132 145 118 131 132 133 146 119 132 133 + 134 147 120 133 134 135 148 121 134 135 + 136 149 122 135 136 137 150 123 136 137 + 138 151 124 137 138 139 152 125 138 139 + 140 153 126 139 140 154 127 141 142 155 + 128 141 142 143 156 129 142 143 144 157 + 130 143 144 145 158 131 144 145 146 159 + 132 145 146 147 160 133 146 147 148 161 + 134 147 148 149 162 135 148 149 150 163 + 136 149 150 151 164 137 150 151 152 165 + 138 151 152 153 166 139 152 153 154 167 + 140 153 154 168 141 155 156 169 142 155 + 156 157 170 143 156 157 158 171 144 157 + 158 159 172 145 158 159 160 173 146 159 + 160 161 174 147 160 161 162 175 148 161 + 162 163 176 149 162 163 164 177 150 163 + 164 165 178 151 164 165 166 179 152 165 + 166 167 180 153 166 167 168 181 154 167 + 168 182 155 169 170 183 156 169 170 171 + 184 157 170 171 172 185 158 171 172 173 + 186 159 172 173 174 187 160 173 174 175 + 188 161 174 175 176 189 162 175 176 177 + 190 163 176 177 178 191 164 177 178 179 + 192 165 178 179 180 193 166 179 180 181 + 194 167 180 181 182 195 168 181 182 196 + 169 183 184 197 170 183 184 185 198 171 + 184 185 186 199 172 185 186 187 200 173 + 186 187 188 201 174 187 188 189 202 175 + 188 189 190 203 176 189 190 191 204 177 + 190 191 192 205 178 191 192 193 206 179 + 192 193 194 207 180 193 194 195 208 181 + 194 195 196 209 182 195 196 210 183 197 + 198 211 184 197 198 199 212 185 198 199 + 200 213 186 199 200 201 214 187 200 201 + 202 215 188 201 202 203 216 189 202 203 + 204 217 190 203 204 205 218 191 204 205 + 206 219 192 205 206 207 220 193 206 207 + 208 221 194 207 208 209 222 195 208 209 + 210 223 196 209 210 224 197 211 212 225 + 198 211 212 213 226 199 212 213 214 227 + 200 213 214 215 228 201 214 215 216 229 + 202 215 216 217 230 203 216 217 218 231 + 204 217 218 219 232 205 218 219 220 233 + 206 219 220 221 234 207 220 221 222 235 + 208 221 222 223 236 209 222 223 224 237 + 210 223 224 238 211 225 226 212 225 226 + 227 213 226 227 228 214 227 228 229 215 + 228 229 230 216 229 230 231 217 230 231 + 232 218 231 232 233 219 232 233 234 220 + 233 234 235 221 234 235 236 222 235 236 + 237 223 236 237 238 224 237 238 + -.19315000E+02 .19311000E+02 .44227000E-02 .19311000E+02 -.38640000E+02 + .19311000E+02 .17691000E-01 .19311000E+02 -.38693000E+02 .19311000E+02 + .70763000E-01 .19311000E+02 -.38905000E+02 .19311000E+02 .28305000E+00 + .19311000E+02 -.39755000E+02 .19311000E+02 .11322000E+01 .19311000E+02 + -.43156000E+02 .19311000E+02 .45289000E+01 .19311000E+02 -.56756000E+02 + .19311000E+02 .18115000E+02 .19311000E+02 -.11116000E+03 .19311000E+02 + .72462000E+02 .19311000E+02 -.32877000E+03 .19311000E+02 .28985000E+03 + .19311000E+02 -.11992000E+04 .19310000E+02 .11593000E+04 .19310000E+02 + -.46805000E+04 .19309000E+02 .46370000E+04 .19309000E+02 -.18586000E+05 + .11061000E+02 .18536000E+05 .11060000E+02 -.75788000E+05 .19722000E+02 + .75689000E+05 .19699000E+02 -.41574000E+08 .41579000E+08 .44227000E-02 + -.10241000E+04 .10230000E+04 .11876000E+01 .17691000E-01 .10230000E+04 + -.20507000E+04 .10230000E+04 .47506000E+01 .70763000E-01 .10230000E+04 + -.20650000E+04 .10230000E+04 .19002000E+02 .28305000E+00 .10230000E+04 + -.21222000E+04 .10230000E+04 .76009000E+02 .11322000E+01 .10230000E+04 + -.23511000E+04 .10230000E+04 .30404000E+03 .45288000E+01 .10230000E+04 + -.32666000E+04 .10230000E+04 .12161000E+04 .18115000E+02 .10230000E+04 + -.69286000E+04 .10229000E+04 .48646000E+04 .72461000E+02 .10229000E+04 + -.21577000E+05 .10230000E+04 .19458000E+05 .28984000E+03 .10230000E+04 + -.80170000E+05 .10229000E+04 .77833000E+05 .11593000E+04 .10229000E+04 + -.31474000E+06 .10229000E+04 .31153000E+06 .46369000E+04 .10229000E+04 + -.12527000E+07 .10229000E+04 .12460000E+07 .18536000E+05 .10229000E+04 + -.50005000E+07 .34724000E+03 .49805000E+07 .75682000E+05 .34710000E+03 + -.27150000E+08 .13908000E+04 .27075000E+08 .41574000E+08 .13891000E+04 + -.90850000E+08 .49273000E+08 .11876000E+01 -.19842000E+03 .19612000E+03 + .11083000E+01 .47505000E+01 .19612000E+03 -.40143000E+03 .19612000E+03 + .44330000E+01 .19002000E+02 .19612000E+03 -.42898000E+03 .19612000E+03 + .17732000E+02 .76008000E+02 .19612000E+03 -.53918000E+03 .19612000E+03 + .70928000E+02 .30403000E+03 .19612000E+03 -.97999000E+03 .19612000E+03 + .28371000E+03 .12161000E+04 .19612000E+03 -.27432000E+04 .19612000E+03 + .11348000E+04 .48645000E+04 .19612000E+03 -.97962000E+04 .19612000E+03 + .45394000E+04 .19458000E+05 .19612000E+03 -.38008000E+05 .19612000E+03 + .18158000E+05 .77832000E+05 .19612000E+03 -.15086000E+06 .19612000E+03 + .72630000E+05 .31152000E+06 .19612000E+03 -.60243000E+06 .19612000E+03 + .29051000E+06 .12460000E+07 .19612000E+03 -.24083000E+07 .19611000E+03 + .11619000E+07 .49805000E+07 .19610000E+03 -.96025000E+07 .19986000E+03 + .46215000E+07 .27072000E+08 .19977000E+03 -.52340000E+08 .26683000E+03 + .25265000E+08 .49269000E+08 .26651000E+03 -.20234000E+09 .15307000E+09 + .11082000E+01 -.61428000E+02 .59668000E+02 .65184000E+00 .44330000E+01 + .59668000E+02 -.12638000E+03 .59667000E+02 .26074000E+01 .17732000E+02 + .59667000E+02 -.14750000E+03 .59667000E+02 .10429000E+02 .70928000E+02 + .59667000E+02 -.23198000E+03 .59667000E+02 .41718000E+02 .28371000E+03 + .59667000E+02 -.56992000E+03 .59667000E+02 .16687000E+03 .11348000E+04 + .59667000E+02 -.19217000E+04 .59668000E+02 .66748000E+03 .45394000E+04 + .59668000E+02 -.73287000E+04 .59667000E+02 .26699000E+04 .18158000E+05 + .59667000E+02 -.28957000E+05 .59668000E+02 .10680000E+05 .72630000E+05 + .59668000E+02 -.11547000E+06 .59667000E+02 .42719000E+05 .29051000E+06 + .59667000E+02 -.46144000E+06 .59645000E+02 .17081000E+06 .11619000E+07 + .59645000E+02 -.18448000E+07 .59602000E+02 .68272000E+06 .46215000E+07 + .59601000E+02 -.73360000E+07 .60828000E+02 .27143000E+07 .25264000E+08 + .60800000E+02 -.40130000E+08 .81211000E+02 .14866000E+08 .15306000E+09 + .81113000E+02 -.30614000E+09 .15307000E+09 .65184000E+00 -.60995000E+02 + .59561000E+02 .78233000E+00 .26073000E+01 .59561000E+02 -.12486000E+03 + .59561000E+02 .31293000E+01 .10429000E+02 .59561000E+02 -.14207000E+03 + .59561000E+02 .12517000E+02 .41718000E+02 .59561000E+02 -.21091000E+03 + .59561000E+02 .50069000E+02 .16687000E+03 .59561000E+02 -.48627000E+03 + .59561000E+02 .20028000E+03 .66748000E+03 .59561000E+02 -.15877000E+04 + .59561000E+02 .80110000E+03 .26699000E+04 .59561000E+02 -.59935000E+04 + .59561000E+02 .32044000E+04 .10680000E+05 .59561000E+02 -.23616000E+05 + .59561000E+02 .12818000E+05 .42719000E+05 .59561000E+02 -.94109000E+05 + .59561000E+02 .51271000E+05 .17081000E+06 .59561000E+02 -.37593000E+06 + .59539000E+02 .20500000E+06 .68272000E+06 .59539000E+02 -.15022000E+07 + .59496000E+02 .81940000E+06 .27143000E+07 .59495000E+02 -.59721000E+07 + .60830000E+02 .32577000E+07 .14865000E+08 .60802000E+02 -.32739000E+08 + .81214000E+02 .17875000E+08 .15307000E+09 .81116000E+02 -.21674000E+09 + .63673000E+08 .78232000E+00 -.66882000E+03 .66802000E+03 .10723000E-01 + .31293000E+01 .66802000E+03 -.13392000E+04 .66802000E+03 .42892000E-01 + .12517000E+02 .66802000E+03 -.13487000E+04 .66802000E+03 .17157000E+00 + .50069000E+02 .66802000E+03 -.13868000E+04 .66802000E+03 .68627000E+00 + .20027000E+03 .66802000E+03 -.15391000E+04 .66802000E+03 .27451000E+01 + .80110000E+03 .66802000E+03 -.21482000E+04 .66803000E+03 .10980000E+02 + .32044000E+04 .66803000E+03 -.45844000E+04 .66802000E+03 .43921000E+02 + .12818000E+05 .66802000E+03 -.14330000E+05 .66803000E+03 .17569000E+03 + .51270000E+05 .66803000E+03 -.53311000E+05 .66802000E+03 .70274000E+03 + .20500000E+06 .66802000E+03 -.20915000E+06 .66777000E+03 .28099000E+04 + .81939000E+06 .66777000E+03 -.83198000E+06 .66729000E+03 .11231000E+05 + .32577000E+07 .66729000E+03 -.33028000E+07 .68526000E+03 .43718000E+05 + .17873000E+08 .68492000E+03 -.18122000E+08 .91488000E+03 .24607000E+06 + .63668000E+08 .91379000E+03 -.11417000E+09 .50497000E+08 .10723000E-01 + -.73415000E+02 .73396000E+02 .79713000E-02 .42892000E-01 .73396000E+02 + -.14687000E+03 .73396000E+02 .31885000E-01 .17157000E+00 .73396000E+02 + -.14709000E+03 .73396000E+02 .12754000E+00 .68626000E+00 .73396000E+02 + -.14799000E+03 .73396000E+02 .51016000E+00 .27451000E+01 .73396000E+02 + -.15158000E+03 .73396000E+02 .20406000E+01 .10980000E+02 .73396000E+02 + -.16594000E+03 .73396000E+02 .81626000E+01 .43921000E+02 .73396000E+02 + -.22340000E+03 .73395000E+02 .32650000E+02 .17568000E+03 .73395000E+02 + -.45321000E+03 .73396000E+02 .13060000E+03 .70273000E+03 .73396000E+02 + -.13725000E+04 .73396000E+02 .52240000E+03 .28099000E+04 .73396000E+02 + -.50431000E+04 .73214000E+02 .20845000E+04 .11231000E+05 .73214000E+02 + -.19682000E+05 .72862000E+02 .82963000E+04 .43717000E+05 .72861000E+02 + -.75025000E+05 .76553000E+02 .31124000E+05 .24605000E+06 .76514000E+02 + -.43229000E+06 .10220000E+03 .18599000E+06 .50492000E+08 .10208000E+03 + -.14275000E+09 .92259000E+08 .79712000E-02 -.18212000E+02 .18188000E+02 + .16022000E-01 .31885000E-01 .18188000E+02 -.36471000E+02 .18188000E+02 + .64087000E-01 .12754000E+00 .18188000E+02 -.36759000E+02 .18188000E+02 + .25635000E+00 .51016000E+00 .18188000E+02 -.37911000E+02 .18188000E+02 + .10254000E+01 .20406000E+01 .18188000E+02 -.42518000E+02 .18188000E+02 + .41016000E+01 .81625000E+01 .18188000E+02 -.60947000E+02 .18188000E+02 + .16406000E+02 .32650000E+02 .18188000E+02 -.13466000E+03 .18187000E+02 + .65625000E+02 .13060000E+03 .18187000E+02 -.42953000E+03 .18188000E+02 + .26250000E+03 .52240000E+03 .18188000E+02 -.16090000E+04 .18188000E+02 + .10500000E+04 .20845000E+04 .18188000E+02 -.63057000E+04 .17983000E+02 + .41843000E+04 .82963000E+04 .17983000E+02 -.24946000E+05 .17992000E+02 + .16611000E+05 .31123000E+05 .17992000E+02 -.91145000E+05 .19391000E+02 + .59971000E+05 .18598000E+06 .19380000E+02 -.56810000E+06 .25884000E+02 + .38205000E+06 .92255000E+08 .25853000E+02 -.23912000E+09 .14687000E+09 + .16022000E-01 -.17169000E+02 .17139000E+02 .13402000E-01 .64087000E-01 + .17139000E+02 -.34396000E+02 .17139000E+02 .53610000E-01 .25635000E+00 + .17139000E+02 -.34750000E+02 .17139000E+02 .21444000E+00 .10254000E+01 + .17139000E+02 -.36162000E+02 .17139000E+02 .85776000E+00 .41015000E+01 + .17139000E+02 -.41812000E+02 .17139000E+02 .34310000E+01 .16406000E+02 + .17139000E+02 -.64412000E+02 .17139000E+02 .13724000E+02 .65625000E+02 + .17139000E+02 -.15481000E+03 .17139000E+02 .54897000E+02 .26250000E+03 + .17139000E+02 -.51641000E+03 .17139000E+02 .21959000E+03 .10500000E+04 + .17139000E+02 -.19628000E+04 .17139000E+02 .87835000E+03 .41842000E+04 + .17139000E+02 -.77191000E+04 .16943000E+02 .35000000E+04 .16611000E+05 + .16943000E+02 -.29996000E+05 .16965000E+02 .13348000E+05 .59971000E+05 + .16965000E+02 -.10824000E+06 .18620000E+02 .48224000E+05 .38204000E+06 + .18610000E+02 -.70770000E+06 .24850000E+02 .32559000E+06 .14686000E+09 + .24820000E+02 -.27202000E+09 .12516000E+09 .13402000E-01 -.23312000E+02 + .23288000E+02 .10209000E-01 .53610000E-01 .23288000E+02 -.46670000E+02 + .23288000E+02 .40838000E-01 .21444000E+00 .23288000E+02 -.46954000E+02 + .23288000E+02 .16335000E+00 .85776000E+00 .23288000E+02 -.48087000E+02 + .23288000E+02 .65341000E+00 .34310000E+01 .23288000E+02 -.52622000E+02 + .23288000E+02 .26136000E+01 .13724000E+02 .23288000E+02 -.70759000E+02 + .23288000E+02 .10454000E+02 .54896000E+02 .23288000E+02 -.14331000E+03 + .23288000E+02 .41818000E+02 .21959000E+03 .23288000E+02 -.43350000E+03 + .23288000E+02 .16727000E+03 .87834000E+03 .23288000E+02 -.15943000E+04 + .23289000E+02 .66909000E+03 .35000000E+04 .23289000E+02 -.62015000E+04 + .22727000E+02 .26543000E+04 .13348000E+05 .22727000E+02 -.23849000E+05 + .22786000E+02 .10451000E+05 .48224000E+05 .22786000E+02 -.82693000E+05 + .26002000E+02 .34403000E+05 .32558000E+06 .25988000E+02 -.58040000E+06 + .34688000E+02 .25473000E+06 .12516000E+09 .34646000E+02 -.22308000E+09 + .97921000E+08 .10209000E-01 -.26199000E+02 .26172000E+02 .17566000E-01 + .40838000E-01 .26172000E+02 -.52454000E+02 .26171000E+02 .70262000E-01 + .16335000E+00 .26171000E+02 -.52787000E+02 .26171000E+02 .28105000E+00 + .65340000E+00 .26171000E+02 -.54121000E+02 .26172000E+02 .11242000E+01 + .26136000E+01 .26172000E+02 -.59455000E+02 .26171000E+02 .44968000E+01 + .10454000E+02 .26171000E+02 -.80790000E+02 .26172000E+02 .17987000E+02 + .41818000E+02 .26172000E+02 -.16613000E+03 .26171000E+02 .71949000E+02 + .16727000E+03 .26171000E+02 -.50749000E+03 .26172000E+02 .28779000E+03 + .66908000E+03 .26172000E+02 -.18729000E+04 .26173000E+02 .11512000E+04 + .26543000E+04 .26173000E+02 -.72783000E+04 .25355000E+02 .45712000E+04 + .10451000E+05 .25355000E+02 -.28384000E+05 .25518000E+02 .17877000E+05 + .34402000E+05 .25518000E+02 -.91977000E+05 .31083000E+02 .57497000E+05 + .25472000E+06 .31065000E+02 -.72041000E+06 .41421000E+02 .46560000E+06 + .97916000E+08 .41371000E+02 -.18360000E+09 .85686000E+08 .17566000E-01 + -.20525000E+03 .20514000E+03 .10188000E+00 .70262000E-01 .20514000E+03 + -.41075000E+03 .20513000E+03 .40752000E+00 .28105000E+00 .20513000E+03 + -.41218000E+03 .20513000E+03 .16301000E+01 .11242000E+01 .20513000E+03 + -.41791000E+03 .20513000E+03 .65203000E+01 .44968000E+01 .20513000E+03 + -.44085000E+03 .20513000E+03 .26081000E+02 .17987000E+02 .20513000E+03 + -.53259000E+03 .20514000E+03 .10433000E+03 .71948000E+02 .20514000E+03 + -.89955000E+03 .20513000E+03 .41730000E+03 .28779000E+03 .20513000E+03 + -.23674000E+04 .20514000E+03 .16692000E+04 .11512000E+04 .20514000E+03 + -.82388000E+04 .20519000E+03 .66768000E+04 .45711000E+04 .20519000E+03 + -.31292000E+05 .19413000E+03 .26319000E+05 .17877000E+05 .19413000E+03 + -.11990000E+06 .20783000E+03 .10161000E+06 .57497000E+05 .20783000E+03 + -.62841000E+06 .27437000E+03 .57044000E+06 .46557000E+06 .27421000E+03 + -.34580000E+07 .35999000E+03 .29918000E+07 .85682000E+08 .35955000E+03 + -.16566000E+09 .79979000E+08 .10188000E+00 -.64083000E+01 .62616000E+01 + .44813000E-01 .40752000E+00 .62616000E+01 -.13110000E+02 .62616000E+01 + .17925000E+00 .16301000E+01 .62616000E+01 -.14870000E+02 .62616000E+01 + .71701000E+00 .65203000E+01 .62616000E+01 -.21912000E+02 .62616000E+01 + .28681000E+01 .26081000E+02 .62616000E+01 -.50077000E+02 .62616000E+01 + .11472000E+02 .10432000E+03 .62616000E+01 -.16274000E+03 .62617000E+01 + .45889000E+02 .41730000E+03 .62617000E+01 -.61339000E+03 .62616000E+01 + .18356000E+03 .16692000E+04 .62616000E+01 -.24160000E+04 .62617000E+01 + .73422000E+03 .66768000E+04 .62617000E+01 -.96263000E+04 .62676000E+01 + .29369000E+04 .26319000E+05 .62676000E+01 -.38082000E+05 .57582000E+01 + .11750000E+05 .10161000E+06 .57582000E+01 -.14865000E+06 .98239000E+01 + .47020000E+05 .57041000E+06 .98231000E+01 -.82070000E+06 .13079000E+02 + .25026000E+06 .29917000E+07 .13071000E+02 -.39935000E+07 .13096000E+02 + .10017000E+07 .79974000E+08 .13080000E+02 -.13032000E+09 .50342000E+08 + .44811000E-01 -.15302000E+03 .15298000E+03 .17261000E-02 .17924000E+00 + .15298000E+03 -.30614000E+03 .15298000E+03 .69044000E-02 .71697000E+00 + .15298000E+03 -.30670000E+03 .15298000E+03 .27618000E-01 .28679000E+01 + .15298000E+03 -.30893000E+03 .15298000E+03 .11047000E+00 .11472000E+02 + .15298000E+03 -.31787000E+03 .15298000E+03 .44188000E+00 .45886000E+02 + .15298000E+03 -.35362000E+03 .15298000E+03 .17675000E+01 .18354000E+03 + .15298000E+03 -.49660000E+03 .15298000E+03 .70701000E+01 .73418000E+03 + .15298000E+03 -.10685000E+04 .15298000E+03 .28280000E+02 .29367000E+04 + .15298000E+03 -.33563000E+04 .15298000E+03 .11312000E+03 .11749000E+05 + .15298000E+03 -.12510000E+05 .15298000E+03 .45249000E+03 .47017000E+05 + .15298000E+03 -.49142000E+05 .15300000E+03 .18100000E+04 .25023000E+06 + .15298000E+03 -.25783000E+06 .15310000E+03 .72408000E+04 .10016000E+07 + .15301000E+03 -.10311000E+07 .15331000E+03 .28983000E+05 .50337000E+08 + .15312000E+03 -.87166000E+08 .36828000E+08 .17259000E-02 -.27385000E+02 + .27382000E+02 .12300000E-02 .69035000E-02 .27382000E+02 -.54775000E+02 + .27382000E+02 .49201000E-02 .27614000E-01 .27382000E+02 -.54811000E+02 + .27382000E+02 .19680000E-01 .11046000E+00 .27382000E+02 -.54953000E+02 + .27382000E+02 .78722000E-01 .44183000E+00 .27382000E+02 -.55521000E+02 + .27382000E+02 .31489000E+00 .17673000E+01 .27382000E+02 -.57794000E+02 + .27382000E+02 .12595000E+01 .70692000E+01 .27382000E+02 -.66887000E+02 + .27381000E+02 .50382000E+01 .28277000E+02 .27381000E+02 -.10326000E+03 + .27382000E+02 .20153000E+02 .11311000E+03 .27382000E+02 -.24875000E+03 + .27382000E+02 .80611000E+02 .45243000E+03 .27381000E+02 -.83072000E+03 + .27382000E+02 .32245000E+03 .18098000E+04 .27382000E+02 -.31587000E+04 + .27385000E+02 .12898000E+04 .72399000E+04 .27382000E+02 -.12472000E+05 + .27403000E+02 .51598000E+04 .28980000E+05 .27387000E+02 -.49758000E+05 + .27440000E+02 .20654000E+05 .36824000E+08 .27407000E+02 -.87893000E+08 + .51069000E+08 .12299000E-02 -.11818000E+02 .11816000E+02 .71977000E-03 + .49197000E-02 .11816000E+02 -.23639000E+02 .11816000E+02 .28791000E-02 + .19679000E-01 .11816000E+02 -.23662000E+02 .11816000E+02 .11516000E-01 + .78714000E-01 .11816000E+02 -.23756000E+02 .11816000E+02 .46065000E-01 + .31486000E+00 .11816000E+02 -.24131000E+02 .11816000E+02 .18426000E+00 + .12594000E+01 .11816000E+02 -.25630000E+02 .11816000E+02 .73704000E+00 + .50377000E+01 .11816000E+02 -.31624000E+02 .11816000E+02 .29482000E+01 + .20151000E+02 .11816000E+02 -.55603000E+02 .11816000E+02 .11793000E+02 + .80604000E+02 .11816000E+02 -.15152000E+03 .11816000E+02 .47171000E+02 + .32242000E+03 .11816000E+02 -.53519000E+03 .11816000E+02 .18868000E+03 + .12897000E+04 .11816000E+02 -.20699000E+04 .11817000E+02 .75475000E+03 + .51594000E+04 .11816000E+02 -.82096000E+04 .11825000E+02 .30193000E+04 + .20652000E+05 .11818000E+02 -.32791000E+05 .11841000E+02 .12086000E+05 + .51064000E+08 .11827000E+02 -.80948000E+08 .29884000E+08 .71965000E-03 + -.55197000E+02 .55196000E+02 .28786000E-02 .55196000E+02 -.11039000E+03 + .55196000E+02 .11514000E-01 .55196000E+02 -.11040000E+03 .55196000E+02 + .46058000E-01 .55196000E+02 -.11044000E+03 .55196000E+02 .18423000E+00 + .55196000E+02 -.11058000E+03 .55196000E+02 .73693000E+00 .55196000E+02 + -.11114000E+03 .55196000E+02 .29477000E+01 .55196000E+02 -.11337000E+03 + .55195000E+02 .11791000E+02 .55195000E+02 -.12232000E+03 .55196000E+02 + .47163000E+02 .55196000E+02 -.15809000E+03 .55196000E+02 .18865000E+03 + .55195000E+02 -.30120000E+03 .55197000E+02 .75463000E+03 .55196000E+02 + -.87365000E+03 .55203000E+02 .30189000E+04 .55197000E+02 -.31638000E+04 + .55240000E+02 .12084000E+05 .55206000E+02 -.12333000E+05 .55315000E+02 + .29879000E+08 .55248000E+02 -.29912000E+08 diff --git a/LGPL b/LGPL new file mode 100644 index 0000000..b1e3f5a --- /dev/null +++ b/LGPL @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/MATGEN/FDIF/README b/MATGEN/FDIF/README new file mode 100644 index 0000000..0abf798 --- /dev/null +++ b/MATGEN/FDIF/README @@ -0,0 +1,31 @@ +This directory contains the routines that generate finite difference +matrices from a second order elliptic operator. + + 1) 5-pt and 7-pt matrices on rectangular regions discretizing + elliptic operators of the form: + + L u == delx( a delx u ) + dely ( b dely u) + delz ( c delz u ) + + delx ( d u ) + dely (e u) + delz( f u ) + g u = h u + + with Boundary conditions, + alpha del u / del n + beta u = gamma + on a rectangular 1-D, 2-D or 3-D grid using centered + difference scheme or upwind scheme. + + The functions a, b, ..., h are known through the + subroutines afun, bfun, ..., hfun in the file + functns.f. The alpha is a constant on each side of the + rectanglar domain. the beta and the gamma are defined + by the functions betfun and gamfun (see functns.f for + examples). + + 2) block version of the finite difference matrices (several degrees of + freedom per grid point. ) It only generates the matrix (without + the right-hand-side), only Dirichlet Boundary conditions are used. + +genmat.f ---- the matrix generation routines. +functns.f --- functions used by the genmat.f + +to test the 5-point/7-point matrix please see mak57pt +to test the block version of the 5-point/7-point matrix see mak57bl + diff --git a/MATGEN/FDIF/functns.f b/MATGEN/FDIF/functns.f new file mode 100644 index 0000000..329f1ef --- /dev/null +++ b/MATGEN/FDIF/functns.f @@ -0,0 +1,171 @@ +c----------------------------------------------------------------------- +c contains the functions needed for defining the PDE poroblems. +c +c first for the scalar 5-point and 7-point PDE +c----------------------------------------------------------------------- + function afun (x,y,z) + real*8 afun, x,y,z + afun = -1.0d0 + return + end + + function bfun (x,y,z) + real*8 bfun, x,y,z + bfun = -1.0d0 + return + end + + function cfun (x,y,z) + real*8 cfun, x,y,z + cfun = -1.0d0 + return + end + + function dfun (x,y,z) + real*8 dfun, x,y,z + data gamma /100.0/ +c dfun = gamma * exp( x * y ) + dfun = 10.d0 + return + end + + function efun (x,y,z) + real*8 efun, x,y,z + data gamma /100.0/ +c efun = gamma * exp( (- x) * y ) + efun = 0.d0 + return + end + + function ffun (x,y,z) + real*8 ffun, x,y,z + ffun = 0.0 + return + end + + function gfun (x,y,z) + real*8 gfun, x,y,z + gfun = 0.0 + return + end + + function hfun(x, y, z) + real*8 hfun, x, y, z + hfun = 0.0 + return + end + + function betfun(side, x, y, z) + real*8 betfun, x, y, z + character*2 side + betfun = 1.0 + return + end + + function gamfun(side, x, y, z) + real*8 gamfun, x, y, z + character*2 side + if (side.eq.'x2') then + gamfun = 5.0 + else if (side.eq.'y1') then + gamfun = 2.0 + else if (side.eq.'y2') then + gamfun = 7.0 + else + gamfun = 0.0 + endif + return + end + +c----------------------------------------------------------------------- +c functions for the block PDE's +c----------------------------------------------------------------------- + subroutine afunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + coeff((j-1)*nfree+j) = -1.0d0 + 2 continue + return + end + + subroutine bfunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + coeff((j-1)*nfree+j) = -1.0d0 + 2 continue + return + end + + subroutine cfunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + coeff((j-1)*nfree+j) = -1.0d0 + 2 continue + return + end + + subroutine dfunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + 2 continue + return + end + + subroutine efunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + 2 continue + return + end + + subroutine ffunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + 2 continue + return + end + + subroutine gfunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + 2 continue + return + end +c----------------------------------------------------------------------- +c The material property function xyk for the +c finite element problem +c----------------------------------------------------------------------- + subroutine xyk(nel,xyke,x,y,ijk,node) + implicit real*8 (a-h,o-z) + dimension xyke(2,2), x(*), y(*), ijk(node,*) +c +c this is the identity matrix. +c + xyke(1,1) = 1.0d0 + xyke(2,2) = 1.0d0 + xyke(1,2) = 0.0d0 + xyke(2,1) = 0.0d0 + + return + end diff --git a/MATGEN/FDIF/genmat.f b/MATGEN/FDIF/genmat.f new file mode 100644 index 0000000..9d648e9 --- /dev/null +++ b/MATGEN/FDIF/genmat.f @@ -0,0 +1,1279 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c MATRIX GENERATION ROUTINES -- FINITE DIFFERENCE MATRICES c +c----------------------------------------------------------------------c +c contents: c +c---------- c +c gen57pt : generates 5-point and 7-point matrices. c +c gen57bl : generates block 5-point and 7-point matrices. c +c c +c supporting routines: c +c--------- c +c gensten : generate the stencil (point version) c +c bsten : generate the stencil (block version) c +c fdaddbc : finite difference add boundary conditions c +c fdreduce : reduce the system to eliminate node with known values c +c clrow : clear a row of a CSR matrix c +c lctcsr : locate the position of A(i,j) in CSR format c +c----------------------------------------------------------------------c + subroutine gen57pt(nx,ny,nz,al,mode,n,a,ja,ia,iau,rhs) + integer ja(*),ia(*),iau(*), nx, ny, nz, mode, n + real*8 a(*), rhs(*), al(6) +c----------------------------------------------------------------------- +c On entry: +c +c nx = number of grid points in x direction +c ny = number of grid points in y direction +c nz = number of grid points in z direction +c al = array of size 6, carries the coefficient alpha of the +c boundary conditions +c mode = what to generate: +c < 0 : generate the graph only, +c = 0 : generate the matrix, +c > 0 : generate the matrix and the right-hand side. +c +c On exit: +c +c n = number of nodes with unknown values, ie number of rows +c in the matrix +c +c a,ja,ia = resulting matrix in row-sparse format +c +c iau = integer*n, containing the poisition of the diagonal element +c in the a, ja, ia structure +c +c rhs = the right-hand side +c +c External functions needed (must be supplied by caller) +c afun, bfun, cfun, dfun, efun, ffun, gfun, hfun +c betfun, gamfun +c They have the following prototype: +c real*8 function xfun(x, y, z) +c real*8 x, y, z +c----------------------------------------------------------------------- +c This subroutine computes the sparse matrix in compressed sparse row +c format for the elliptic equation: +c d du d du d du du du du +c L u = --(A --) + --(B --) + --(C --) + D -- + E -- + F -- + G u = H u +c dx dx dy dy dz dz dx dy dz +c +c with general Mixed Boundary conditions, on a rectangular 1-D, +c 2-D or 3-D grid using 2nd order centered difference schemes. +c +c The functions a, b, ..., g, h are known through the +c as afun, bfun, ..., gfun, hfun in this subroutine. +c NOTE: To obtain the correct matrix, any function that is not +c needed should be set to zero. For example for two-dimensional +c problems, nz should be set to 1 and the functions cfun and ffun +c should be zero functions. +c +c The Boundary condition is specified in the following form: +c du +c alpha -- + beta u = gamma +c dn +c Where alpha is constant at each side of the boundary surfaces. Alpha +c is represented by parameter al. It is expected to an array that +c contains enough elements to specify the boundaries for the problem, +c 1-D case needs two elements, 2-D needs 4 and 3-D needs 6. The order +c of the boundaries in the array is left(west), right(east), +c bottom(south), top(north), front, rear. Beta and gamma are functions +c of type real with three arguments x, y, z. These two functions are +c known subroutine 'addbc' as betfun and gamfun. They should following +c the same notion as afun ... hfun. For more restriction on afun ... +c hfun, please read the documentation follows the subroutine 'getsten', +c and, for more on betfun and gamfun, please refer to the documentation +c under subroutine 'fdaddbc'. +c +c The nodes are ordered using natural ordering, first x direction, then +c y, then z. The mesh size h is uniform and determined by grid points +c in the x-direction. +c +c The domain specified for the problem is [0 .ge. x .ge. 1], +c [0 .ge. y .ge. (ny-1)*h] and [0 .ge. z .ge. (nz-1)*h], where h is +c 1 / (nx-1). Thus if non-Dirichlet boundary condition is specified, +c the mesh will have nx points along the x direction, ny along y and +c nz along z. For 1-D case, both y and z value are assumed to zero +c when calling relavent functions that have three parameters. +c Similarly, for 2-D case, z is assumed to be zero. +c +c About the expectation of nx, ny and nz: +c nx is required to be .gt. 1 always; +c if the second dimension is present in the problem, then ny should be +c .gt. 1, else 1; +c if the third dimension is present in the problem, nz .gt. 1, else 1. +c when ny is 1, nz must be 1. +c----------------------------------------------------------------------- +c +c stencil [1:7] has the following meaning: +c +c center point = stencil(1) +c west point = stencil(2) +c east point = stencil(3) +c south point = stencil(4) +c north point = stencil(5) +c front point = stencil(6) +c back point = stencil(7) +c +c al[1:6] carry the coefficient alpha in the similar order +c +c west side = al(1) +c east side = al(2) +c south side = al(3) +c north side = al(4) +c front side = al(5) +c back side = al(6) +c +c al(4) +c st(5) +c | +c | +c | al(6) +c | .st(7) +c | . +c al(1) | . al(2) +c st(2) ----------- st(1) ---------- st(3) +c . | +c . | +c . | +c st(6) | +c al(5) | +c | +c st(4) +c al(3) +c +c------------------------------------------------------------------- +c some constants +c + real*8 one + parameter (one=1.0D0) +c +c local variables +c + integer ix, iy, iz, kx, ky, kz, node, iedge + real*8 r, h, stencil(7) + logical value, genrhs +c +c nx has to be larger than 1 +c + if (nx.le.1) return + h = one / dble(nx-1) +c +c the mode +c + value = (mode.ge.0) + genrhs = (mode.gt.0) +c +c first generate the whole matrix as if the boundary condition does +c not exist +c + kx = 1 + ky = nx + kz = nx*ny + iedge = 1 + node = 1 + do 100 iz = 1,nz + do 90 iy = 1,ny + do 80 ix = 1,nx + ia(node) = iedge +c +c compute the stencil at the current node +c + if (value) call + & getsten(nx,ny,nz,mode,ix-1,iy-1,iz-1,stencil,h,r) +c west + if (ix.gt.1) then + ja(iedge)=node-kx + if (value) a(iedge) = stencil(2) + iedge=iedge + 1 + end if +c south + if (iy.gt.1) then + ja(iedge)=node-ky + if (value) a(iedge) = stencil(4) + iedge=iedge + 1 + end if +c front plane + if (iz.gt.1) then + ja(iedge)=node-kz + if (value) a(iedge) = stencil(6) + iedge=iedge + 1 + endif +c center node + ja(iedge) = node + iau(node) = iedge + if (value) a(iedge) = stencil(1) + iedge = iedge + 1 +c east + if (ix.lt.nx) then + ja(iedge)=node+kx + if (value) a(iedge) = stencil(3) + iedge=iedge + 1 + end if +c north + if (iy.lt.ny) then + ja(iedge)=node+ky + if (value) a(iedge) = stencil(5) + iedge=iedge + 1 + end if +c back plane + if (iz.lt.nz) then + ja(iedge)=node+kz + if (value) a(iedge) = stencil(7) + iedge=iedge + 1 + end if +c the right-hand side + if (genrhs) rhs(node) = r + node=node+1 + 80 continue + 90 continue + 100 continue + ia(node)=iedge +c +c Add in the boundary conditions +c + call fdaddbc(nx,ny,nz,a,ja,ia,iau,rhs,al,h) +c +c eliminate the boudary nodes from the matrix +c + call fdreduce(nx,ny,nz,al,n,a,ja,ia,iau,rhs,stencil) +c +c done +c + return +c-----end-of-gen57pt---------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine getsten (nx,ny,nz,mode,kx,ky,kz,stencil,h,rhs) + integer nx,ny,nz,mode,kx,ky,kz + real*8 stencil(*),h,rhs,afun,bfun,cfun,dfun,efun,ffun,gfun,hfun + external afun,bfun,cfun,dfun,efun,ffun,gfun,hfun +c----------------------------------------------------------------------- +c This subroutine calculates the correct stencil values for +c centered difference discretization of the elliptic operator +c and the right-hand side +c +c L u = delx( A delx u ) + dely ( B dely u) + delz ( C delz u ) + +c delx ( D u ) + dely (E u) + delz( F u ) + G u = H +c +c For 2-D problems the discretization formula that is used is: +c +c h**2 * Lu == A(i+1/2,j)*{u(i+1,j) - u(i,j)} + +c A(i-1/2,j)*{u(i-1,j) - u(i,j)} + +c B(i,j+1/2)*{u(i,j+1) - u(i,j)} + +c B(i,j-1/2)*{u(i,j-1) - u(i,j)} + +c (h/2)*D(i,j)*{u(i+1,j) - u(i-1,j)} + +c (h/2)*E(i,j)*{u(i,j+1) - u(i,j-1)} + +c (h/2)*E(i,j)*{u(i,j+1) - u(i,j-1)} + +c (h**2)*G(i,j)*u(i,j) +c----------------------------------------------------------------------- +c some constants +c + real*8 zero, half + parameter (zero=0.0D0,half=0.5D0) +c +c local variables +c + integer k + real*8 hhalf,cntr, x, y, z, coeff +c +c if mode < 0, we shouldn't have come here +c + if (mode .lt. 0) return +c + do 200 k=1,7 + stencil(k) = zero + 200 continue +c + hhalf = h*half + x = h*dble(kx) + y = h*dble(ky) + z = h*dble(kz) + cntr = zero +c differentiation wrt x: + coeff = afun(x+hhalf,y,z) + stencil(3) = stencil(3) + coeff + cntr = cntr + coeff +c + coeff = afun(x-hhalf,y,z) + stencil(2) = stencil(2) + coeff + cntr = cntr + coeff +c + coeff = dfun(x,y,z)*hhalf + stencil(3) = stencil(3) + coeff + stencil(2) = stencil(2) - coeff + if (ny .le. 1) goto 99 +c +c differentiation wrt y: +c + coeff = bfun(x,y+hhalf,z) + stencil(5) = stencil(5) + coeff + cntr = cntr + coeff +c + coeff = bfun(x,y-hhalf,z) + stencil(4) = stencil(4) + coeff + cntr = cntr + coeff +c + coeff = efun(x,y,z)*hhalf + stencil(5) = stencil(5) + coeff + stencil(4) = stencil(4) - coeff + if (nz .le. 1) goto 99 +c +c differentiation wrt z: +c + coeff = cfun(x,y,z+hhalf) + stencil(7) = stencil(7) + coeff + cntr = cntr + coeff +c + coeff = cfun(x,y,z-hhalf) + stencil(6) = stencil(6) + coeff + cntr = cntr + coeff +c + coeff = ffun(x,y,z)*hhalf + stencil(7) = stencil(7) + coeff + stencil(6) = stencil(6) - coeff +c +c contribution from function G: +c + 99 coeff = gfun(x,y,z) + stencil(1) = h*h*coeff - cntr +c +c the right-hand side +c + if (mode .gt. 0) rhs = h*h*hfun(x,y,z) +c + return +c------end-of-getsten--------------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine gen57bl (nx,ny,nz,nfree,na,n,a,ja,ia,iau,stencil) +c implicit real*8 (a-h,o-z) + integer ja(*),ia(*),iau(*),nx,ny,nz,nfree,na,n + real*8 a(na,1), stencil(7,1) +c-------------------------------------------------------------------- +c This subroutine computes the sparse matrix in compressed +c format for the elliptic operator +c +c L u = delx( a . delx u ) + dely ( b . dely u) + delz ( c . delz u ) + +c delx ( d . u ) + dely (e . u) + delz( f . u ) + g . u +c +c Here u is a vector of nfree componebts and each of the functions +c a, b, c, d, e, f, g is an (nfree x nfree) matrix depending of +c the coordinate (x,y,z). +c with Dirichlet Boundary conditions, on a rectangular 1-D, +c 2-D or 3-D grid using centered difference schemes. +c +c The functions a, b, ..., g are known through the +c subroutines afunbl, bfunbl, ..., gfunbl. (user supplied) . +c +c uses natural ordering, first x direction, then y, then z +c mesh size h is uniform and determined by grid points +c in the x-direction. +c +c The output matrix is in Block -- Sparse Row format. +c +c-------------------------------------------------------------------- +c parameters: +c------------- +c Input: +c ------ +c nx = number of points in x direction +c ny = number of points in y direction +c nz = number of points in z direction +c nfree = number of degrees of freedom per point +c na = first dimension of array a as declared in calling +c program. Must be .ge. nfree**2 +c +c Output: +c ------ +c n = dimension of matrix (output) +c +c a, ja, ia = resulting matrix in Block Sparse Row format +c a(1:nfree**2, j ) contains a nonzero block and ja(j) +c contains the (block) column number of this block. +c the block dimension of the matrix is n (output) and +c therefore the total number of (scalar) rows is n x nfree. +c +c iau = integer*n containing the position of the diagonal element +c in the a, ja, ia structure +c +c Work space: +c------------ +c stencil = work array of size (7,nfree**2) [stores local stencils] +c +c-------------------------------------------------------------------- +c +c stencil (1:7,*) has the following meaning: +c +c center point = stencil(1) +c west point = stencil(2) +c east point = stencil(3) +c south point = stencil(4) +c north point = stencil(5) +c front point = stencil(6) +c back point = stencil(7) +c +c +c st(5) +c | +c | +c | +c | .st(7) +c | . +c | . +c st(2) ----------- st(1) ---------- st(3) +c . | +c . | +c . | +c st(6) | +c | +c | +c st(4) +c +c------------------------------------------------------------------- +c some constants +c + real*8 one + parameter (one=1.0D0) +c +c local variables +c + integer iedge,ix,iy,iz,k,kx,ky,kz,nfree2,node + real*8 h +c + h = one/dble(nx+1) + kx = 1 + ky = nx + kz = nx*ny + nfree2 = nfree*nfree + iedge = 1 + node = 1 + do 100 iz = 1,nz + do 90 iy = 1,ny + do 80 ix = 1,nx + ia(node) = iedge + call bsten(nx,ny,nz,ix,iy,iz,nfree,stencil,h) +c west + if (ix.gt.1) then + ja(iedge)=node-kx + do 4 k=1,nfree2 + a(k,iedge) = stencil(2,k) + 4 continue + iedge=iedge + 1 + end if +c south + if (iy.gt.1) then + ja(iedge)=node-ky + do 5 k=1,nfree2 + a(k,iedge) = stencil(4,k) + 5 continue + iedge=iedge + 1 + end if +c front plane + if (iz.gt.1) then + ja(iedge)=node-kz + do 6 k=1,nfree2 + a(k,iedge) = stencil(6,k) + 6 continue + iedge=iedge + 1 + endif +c center node + ja(iedge) = node + iau(node) = iedge + do 7 k=1,nfree2 + a(k,iedge) = stencil(1,k) + 7 continue + iedge = iedge + 1 +c -- upper part +c east + if (ix.lt.nx) then + ja(iedge)=node+kx + do 8 k=1,nfree2 + a(k,iedge) = stencil(3,k) + 8 continue + iedge=iedge + 1 + end if +c north + if (iy.lt.ny) then + ja(iedge)=node+ky + do 9 k=1,nfree2 + a(k,iedge) = stencil(5,k) + 9 continue + iedge=iedge + 1 + end if +c back plane + if (iz.lt.nz) then + ja(iedge)=node+kz + do 10 k=1,nfree2 + a(k,iedge) = stencil(7,k) + 10 continue + iedge=iedge + 1 + end if +c------next node ------------------------- + node=node+1 + 80 continue + 90 continue + 100 continue +c +c -- new version of BSR -- renumbering removed. +c change numbering of nodes so that each ja(k) will contain the +c actual column number in the original matrix of entry (1,1) of each +c block (k). +c do 101 k=1,iedge-1 +c ja(k) = (ja(k)-1)*nfree+1 +c 101 continue +c +c n = (node-1)*nfree + n = node-1 + ia(node)=iedge + return +c--------------end-of-gen57bl------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine bsten (nx,ny,nz,kx,ky,kz,nfree,stencil,h) +c----------------------------------------------------------------------- +c This subroutine calcultes the correct block-stencil values for +c centered difference discretization of the elliptic operator +c (block version of stencil) +c +c L u = delx( a delx u ) + dely ( b dely u) + delz ( c delz u ) + +c d delx ( u ) + e dely (u) + f delz( u ) + g u +c +c For 2-D problems the discretization formula that is used is: +c +c h**2 * Lu == a(i+1/2,j)*{u(i+1,j) - u(i,j)} + +c a(i-1/2,j)*{u(i-1,j) - u(i,j)} + +c b(i,j+1/2)*{u(i,j+1) - u(i,j)} + +c b(i,j-1/2)*{u(i,j-1) - u(i,j)} + +c (h/2)*d(i,j)*{u(i+1,j) - u(i-1,j)} + +c (h/2)*e(i,j)*{u(i,j+1) - u(i,j-1)} + +c (h/2)*e(i,j)*{u(i,j+1) - u(i,j-1)} + +c (h**2)*g(i,j)*u(i,j) +c----------------------------------------------------------------------- +c some constants +c + real*8 zero,half + parameter(zero=0.0D0,half=0.5D0) +c +c local variables +c + integer i,k,kx,ky,kz,nfree,nfree2,nx,ny,nz + real*8 stencil(7,*), cntr(225), coeff(225),h,h2,hhalf,x,y,z +c------------ + if (nfree .gt. 15) then + print *, ' ERROR ** nfree too large ' + stop + endif +c + nfree2 = nfree*nfree + do 200 k=1, nfree2 + cntr(k) = zero + do 199 i=1,7 + stencil(i,k) = zero + 199 continue + 200 continue +c------------ + hhalf = h*half + h2 = h*h + x = h*dble(kx) + y = h*dble(ky) + z = h*dble(kz) +c differentiation wrt x: + call afunbl(nfree,x+hhalf,y,z,coeff) + do 1 k=1, nfree2 + stencil(3,k) = stencil(3,k) + coeff(k) + cntr(k) = cntr(k) + coeff(k) + 1 continue +c + call afunbl(nfree,x-hhalf,y,z,coeff) + do 2 k=1, nfree2 + stencil(2,k) = stencil(2,k) + coeff(k) + cntr(k) = cntr(k) + coeff(k) + 2 continue +c + call dfunbl(nfree,x,y,z,coeff) + do 3 k=1, nfree2 + stencil(3,k) = stencil(3,k) + coeff(k)*hhalf + stencil(2,k) = stencil(2,k) - coeff(k)*hhalf + 3 continue + if (ny .le. 1) goto 99 +c +c differentiation wrt y: +c + call bfunbl(nfree,x,y+hhalf,z,coeff) + do 4 k=1,nfree2 + stencil(5,k) = stencil(5,k) + coeff(k) + cntr(k) = cntr(k) + coeff(k) + 4 continue +c + call bfunbl(nfree,x,y-hhalf,z,coeff) + do 5 k=1, nfree2 + stencil(4,k) = stencil(4,k) + coeff(k) + cntr(k) = cntr(k) + coeff(k) + 5 continue +c + call efunbl(nfree,x,y,z,coeff) + do 6 k=1, nfree2 + stencil(5,k) = stencil(5,k) + coeff(k)*hhalf + stencil(4,k) = stencil(4,k) - coeff(k)*hhalf + 6 continue + if (nz .le. 1) goto 99 +c +c differentiation wrt z: +c + call cfunbl(nfree,x,y,z+hhalf,coeff) + do 7 k=1, nfree2 + stencil(7,k) = stencil(7,k) + coeff(k) + cntr(k) = cntr(k) + coeff(k) + 7 continue +c + call cfunbl(nfree,x,y,z-hhalf,coeff) + do 8 k=1, nfree2 + stencil(6,k) = stencil(6,k) + coeff(k) + cntr(k) = cntr(k) + coeff(k) + 8 continue +c + call ffunbl(nfree,x,y,z,coeff) + do 9 k=1, nfree2 + stencil(7,k) = stencil(7,k) + coeff(k)*hhalf + stencil(6,k) = stencil(6,k) - coeff(k)*hhalf + 9 continue +c +c discretization of product by g: +c + 99 call gfunbl(nfree,x,y,z,coeff) + do 10 k=1, nfree2 + stencil(1,k) = h2*coeff(k) - cntr(k) + 10 continue +c + return +c------------end of bsten----------------------------------------------- +c----------------------------------------------------------------------- + end + subroutine fdreduce(nx,ny,nz,alpha,n,a,ja,ia,iau,rhs,stencil) + implicit none + integer nx,ny, nz, n, ia(*), ja(*), iau(*) + real*8 alpha(*), a(*), rhs(*), stencil(*) +c----------------------------------------------------------------------- +c This subroutine tries to reduce the size of the matrix by looking +c for Dirichlet boundary conditions at each surface and solve the boundary +c value and modify the right-hand side of related nodes, then clapse all +c the boundary nodes. +c----------------------------------------------------------------------- +c parameters +c + real*8 zero + parameter(zero=0.0D0) +c +c local variables +c + integer i,j,k,kx,ky,kz,lx,ux,ly,uy,lz,uz,node,nbnode,lk,ld,iedge + real*8 val + integer lctcsr + external lctcsr +c +c The first half of this subroutine will try to change the right-hand +c side of all the nodes that has a neighbor with Dirichlet boundary +c condition, since in this case the value of the boundary point is +c known. +c Then in the second half, we will try to eliminate the boundary +c points with known values (with Dirichlet boundary condition). +c + kx = 1 + ky = nx + kz = nx*ny + lx = 1 + ux = nx + ly = 1 + uy = ny + lz = 1 + uz = nz +c +c Here goes the first part. ---------------------------------------- +c +c the left (west) side +c + if (alpha(1) .eq. zero) then + lx = 2 + do 10 k = 1, nz + do 11 j = 1, ny + node = (k-1)*kz + (j-1)*ky + 1 + nbnode = node + kx + lk = lctcsr(nbnode, node, ja, ia) + ld = iau(node) + val = rhs(node)/a(ld) +c modify the rhs + rhs(nbnode) = rhs(nbnode) - a(lk)*val + 11 continue + 10 continue + endif +c +c right (east) side +c + if (alpha(2) .eq. zero) then + ux = nx - 1 + do 20 k = 1, nz + do 21 j = 1, ny + node = (k-1)*kz + (j-1)*ky + nx + nbnode = node - kx + lk = lctcsr(nbnode, node, ja, ia) + ld = iau(node) + val = rhs(node)/a(ld) +c modify the rhs + rhs(nbnode) = rhs(nbnode) - a(lk)*val + 21 continue + 20 continue + endif +c +c if it's only 1-D, skip the following part +c + if (ny .le. 1) goto 100 +c +c the bottom (south) side +c + if (alpha(3) .eq. zero) then + ly = 2 + do 30 k = 1, nz + do 31 i = lx, ux + node = (k-1)*kz + i + nbnode = node + ky + lk = lctcsr(nbnode, node, ja, ia) + ld = iau(node) + val = rhs(node)/a(ld) +c modify the rhs + rhs(nbnode) = rhs(nbnode) - a(lk)*val + 31 continue + 30 continue + endif +c +c top (north) side +c + if (alpha(4) .eq. zero) then + uy = ny - 1 + do 40 k = 1, nz + do 41 i = lx, ux + node = (k-1)*kz + i + (ny-1)*ky + nbnode = node - ky + lk = lctcsr(nbnode, node, ja, ia) + ld = iau(node) + val = rhs(node)/a(ld) +c modify the rhs + rhs(nbnode) = rhs(nbnode) - a(lk)*val + 41 continue + 40 continue + endif +c +c if only 2-D skip the following section on z +c + if (nz .le. 1) goto 100 +c +c the front surface +c + if (alpha(5) .eq. zero) then + lz = 2 + do 50 j = ly, uy + do 51 i = lx, ux + node = (j-1)*ky + i + nbnode = node + kz + lk = lctcsr(nbnode, node, ja, ia) + ld = iau(node) + val = rhs(node)/a(ld) +c modify the rhs + rhs(nbnode) = rhs(nbnode) - a(lk)*val + 51 continue + 50 continue + endif +c +c rear surface +c + if (alpha(6) .eq. zero) then + uz = nz - 1 + do 60 j = ly, uy + do 61 i = lx, ux + node = (nz-1)*kz + (j-1)*ky + i + nbnode = node - kz + lk = lctcsr(nbnode, node, ja, ia) + ld = iau(node) + val = rhs(node)/a(ld) +c modify the rhs + rhs(nbnode) = rhs(nbnode) - a(lk)*val + 61 continue + 60 continue + endif +c +c now the second part ---------------------------------------------- +c +c go through all the actual nodes with unknown values, collect all +c of them to form a new matrix in compressed sparse row format. +c + 100 kx = 1 + ky = ux - lx + 1 + kz = (uy - ly + 1) * ky + node = 1 + iedge = 1 + do 80 k = lz, uz + do 81 j = ly, uy + do 82 i = lx, ux +c +c the corresponding old node number + nbnode = ((k-1)*ny + j-1)*nx + i +c +c copy the row into local stencil, copy is done is the exact +c same order as the stencil is written into array a + lk = ia(nbnode) + if (i.gt.1) then + stencil(2) = a(lk) + lk = lk + 1 + end if + if (j.gt.1) then + stencil(4) = a(lk) + lk = lk + 1 + end if + if (k.gt.1) then + stencil(6) = a(lk) + lk = lk + 1 + end if + stencil(1) = a(lk) + lk = lk + 1 + if (i.lt.nx) then + stencil(3) = a(lk) + lk = lk + 1 + endif + if (j.lt.ny) then + stencil(5) = a(lk) + lk = lk + 1 + end if + if (k.lt.nz) stencil(7) = a(lk) +c +c first the ia pointer -- points to the beginning of each row + ia(node) = iedge +c +c move the values from the local stencil to the new matrix +c +c the neighbor on the left (west) + if (i.gt.lx) then + ja(iedge)=node-kx + a(iedge) =stencil(2) + iedge=iedge + 1 + end if +c the neighbor below (south) + if (j.gt.ly) then + ja(iedge)=node-ky + a(iedge)=stencil(4) + iedge=iedge + 1 + end if +c the neighbor in the front + if (k.gt.lz) then + ja(iedge)=node-kz + a(iedge)=stencil(6) + iedge=iedge + 1 + endif +c center node (itself) + ja(iedge) = node + iau(node) = iedge + a(iedge) = stencil(1) + iedge = iedge + 1 +c the neighbor to the right (east) + if (i.lt.ux) then + ja(iedge)=node+kx + a(iedge)=stencil(3) + iedge=iedge + 1 + end if +c the neighbor above (north) + if (j.lt.uy) then + ja(iedge)=node+ky + a(iedge)=stencil(5) + iedge=iedge + 1 + end if +c the neighbor at the back + if (k.lt.uz) then + ja(iedge)=node+kz + a(iedge)=stencil(7) + iedge=iedge + 1 + end if +c the right-hand side + rhs(node) = rhs(nbnode) +c------next node ------------------------- + node=node+1 +c + 82 continue + 81 continue + 80 continue +c + ia(node) = iedge +c +c the number of nodes in the final matrix is stored in n +c + n = node - 1 + return +c----------------------------------------------------------------------- + end +c-----end of fdreduce----------------------------------------------------- +c----------------------------------------------------------------------- + subroutine fdaddbc(nx,ny,nz,a,ja,ia,iau,rhs,al,h) + integer nx, ny, nz, ia(nx*ny*nz), ja(7*nx*ny*nz), iau(nx*ny*nz) + real*8 h, al(6), a(7*nx*ny*nz), rhs(nx*ny*nz) +c----------------------------------------------------------------------- +c This subroutine will add the boundary condition to the linear system +c consutructed without considering the boundary conditions +c +c The Boundary condition is specified in the following form: +c du +c alpha -- + beta u = gamma +c dn +c Alpha is stored in array AL. The six side of the boundary appares +c in AL in the following order: left(west), right(east), bottom(south), +c top(north), front, back(rear). (see also the illustration in gen57pt) +c Beta and gamma appears as the functions, betfun and gamfun. +c They have the following prototype +c +c real*8 function xxxfun(x, y, z) +c real*8 x, y, z +c +c where x, y, z are vales in the range of [0, 1][0, (ny-1)*h] +c [0, (nz-1)*h] +c +c At the corners or boundary lines, the boundary conditions are applied +c in the follow order: +c 1) if one side is Dirichlet boundary condition, the Dirichlet boundary +c condition is used; +c 2) if more than one sides are Dirichlet, the Direichlet condition +c specified for X direction boundary will overwrite the one specified +c for Y direction boundary which in turn has priority over Z +c direction boundaries. +c 3) when all sides are non-Dirichlet, the average values are used. +c----------------------------------------------------------------------- +c some constants +c + real*8 half,zero,one,two + parameter(half=0.5D0,zero=0.0D0,one=1.0D0,two=2.0D0) +c +c local variables +c + character*2 side + integer i,j,k,kx,ky,kz,node,nbr,ly,uy,lx,ux + real*8 coeff, ctr, hhalf, x, y, z + real*8 afun, bfun, cfun, dfun, efun, ffun, gfun, hfun + external afun, bfun, cfun, dfun, efun, ffun, gfun, hfun + real*8 betfun, gamfun + integer lctcsr + external lctcsr, betfun, gamfun +c + hhalf = half * h + kx = 1 + ky = nx + kz = nx*ny +c +c In 3-D case, we need to go through all 6 faces one by one. If +c the actual dimension is lower, test on ny is performed first. +c If ny is less or equals to 1, then the value of nz is not +c checked. +c----- +c the surface on the left (west) side +c Concentrate on the contribution from the derivatives related to x, +c The terms with derivative of x was assumed to be: +c +c a(3/2,j,k)*[u(2,j,k)-u(1,j,k)] + a(1/2,j,k)*[u(0,j,k)-u(1,j,k)] + +c h*d(1,j,k)*[u(2,j,k)-u(0,j,k)]/2 +c +c But they actually are: +c +c 2*{a(3/2,j,k)*[u(2,j,k)-u(1,j,k)] - +c h*a(1,j,k)*[beta*u(1,j,k)-gamma]/alpha]} + +c h*h*d(1,j,k)*[beta*u(1,j,k)-gamma]/alpha +c +c Therefore, in terms of local stencil the right neighbor of a node +c should be changed to 2*a(3/2,j,k), +c The matrix never contains the left neighbor on this border, nothing +c needs to be done about it. +c The following terms should be added to the center stencil: +c -a(3/2,j,k) + a(1/2,j,k) + [h*d(1,j,k)-2*a(1,j,k)]*h*beta/alpha +c +c And these terms should be added to the corresponding right-hand side +c [h*d(1,j,k)-2*a(1,j,k)]*h*gamma/alpha +c +c Obviously, the formula do not apply for the Dirichlet Boundary +c Condition, where alpha will be zero. In that case, we simply set +c all the elements in the corresponding row to zero(0), then let +c the diagonal element be beta, and the right-hand side be gamma. +c Thus the value of u at that point will be set. Later on point +c like this will be removed from the matrix, since they are of +c know value before solving the system.(not done in this subroutine) +c + x = zero + side = 'x1' + do 20 k = 1, nz + z = (k-1)*h + do 21 j = 1, ny + y = (j-1)*h + node = 1+(j-1)*ky+(k-1)*kz +c +c check to see if it's Dirichlet Boundary condition here +c + if (al(1) .eq. zero) then + call clrow(node, a, ja, ia) + a(iau(node)) = betfun(side,x,y,z) + rhs(node) = gamfun(side,x,y,z) + else +c +c compute the terms formulated above to modify the matrix. +c +c the right neighbor is stroed in nbr'th posiiton in the a + nbr = lctcsr(node, node+kx, ja, ia) +c + coeff = two*afun(x,y,z) + ctr = (h*dfun(x,y,z) - coeff)*h/al(1) + rhs(node) = rhs(node) + ctr * gamfun(side,x,y,z) + ctr = afun(x-hhalf,y,z) + ctr * betfun(side,x,y,z) + coeff = afun(x+hhalf,y,z) + a(iau(node)) = a(iau(node)) - coeff + ctr + a(nbr) = two*coeff + end if + 21 continue + 20 continue +c +c the right (east) side boudary, similarly, the contirbution from +c the terms containing the derivatives of x were assumed to be +c +c a(nx+1/2,j,k)*[u(nx+1,j,k)-u(nx,j,k)] + +c a(nx-1/2,j,k)*[u(nx-1,j,k)-u(nx,j,k)] + +c d(nx,j,k)*[u(nx+1,j,k)-u(nx-1,j,k)]*h/2 +c +c Actualy they are: +c +c 2*{h*a(nx,j,k)*[gamma-beta*u(nx,j,k)]/alpha + +c a(nx-1/2,j,k)*[u(nx-1,j,k)-u(nx,j,k)]} + +c h*h*d(nx,j,k)*[gamma-beta*u(nx,j,k)]/alpha +c +c The left stencil has to be set to 2*a(nx-1/2,j,k) +c +c The following terms have to be added to the center stencil: +c +c -a(nx-1/2,j,k)+a(nx+1/2,j,k)-[2*a(nx,j,k)+h*d(nx,j,k)]*beta/alpha +c +c The following terms have to be added to the right-hand side: +c +c -[2*a(nx,j,k)+h*d(nx,j,k)]*h*gamma/alpha +c + x = one + side = 'x2' + do 22 k = 1, nz + z = (k-1)*h + do 23 j = 1, ny + y = (j-1)*h + node = (k-1)*kz + j*ky +c + if (al(2) .eq. zero) then + call clrow(node, a, ja, ia) + a(iau(node)) = betfun(side,x,y,z) + rhs(node) = gamfun(side,x,y,z) + else + nbr = lctcsr(node, node-kx, ja, ia) +c + coeff = two*afun(x,y,z) + ctr = (coeff + h*dfun(x,y,z))*h/al(2) + rhs(node) = rhs(node) - ctr * gamfun(side,x,y,z) + ctr = afun(x+hhalf,y,z) - ctr * betfun(side,x,y,z) + coeff = afun(x-hhalf,y,z) + a(iau(node)) = a(iau(node)) - coeff + ctr + a(nbr) = two*coeff + end if + 23 continue + 22 continue +c +c If only one dimension, return now +c + if (ny .le. 1) return +c +c the bottom (south) side suface, This similar to the situation +c with the left side, except all the function and realted variation +c should be on the y. +c +c These two block if statment here is to resolve the possible conflict +c of assign the boundary value differently by different side of the +c Dirichlet Boundary Conditions. They ensure that the edges that have +c be assigned a specific value will not be reassigned. +c + if (al(1) .eq. zero) then + lx = 2 + else + lx = 1 + end if + if (al(2) .eq. zero) then + ux = nx-1 + else + ux = nx + end if + y = zero + side = 'y1' + do 24 k = 1, nz + z = (k-1)*h + do 25 i = lx, ux + x = (i-1)*h + node = i + (k-1)*kz +c + if (al(3) .eq. zero) then + call clrow(node, a, ja, ia) + a(iau(node)) = betfun(side,x,y,z) + rhs(node) = gamfun(side,x,y,z) + else + nbr = lctcsr(node, node+ky, ja, ia) +c + coeff = two*bfun(x,y,z) + ctr = (h*efun(x,y,z) - coeff)*h/al(3) + rhs(node) = rhs(node) + ctr * gamfun(side,x,y,z) + ctr = bfun(x,y-hhalf,z) + ctr * betfun(side,x,y,z) + coeff = bfun(x,y+hhalf,z) + a(iau(node)) = a(iau(node)) - coeff + ctr + a(nbr) = two*coeff + end if + 25 continue + 24 continue +c +c The top (north) side, similar to the right side +c + y = (ny-1) * h + side = 'y2' + do 26 k = 1, nz + z = (k-1)*h + do 27 i = lx, ux + x = (i-1)*h + node = (k-1)*kz+(ny-1)*ky + i +c + if (al(4) .eq. zero) then + call clrow(node, a, ja, ia) + a(iau(node)) = betfun(side,x,y,z) + rhs(node) = gamfun(side,x,y,z) + else + nbr = lctcsr(node, node-ky, ja, ia) +c + coeff = two*bfun(x,y,z) + ctr = (coeff + h*efun(x,y,z))*h/al(4) + rhs(node) = rhs(node) - ctr * gamfun(side,x,y,z) + ctr = bfun(x,y+hhalf,z) - ctr * betfun(side,x,y,z) + coeff = bfun(x,y-hhalf,z) + a(iau(node)) = a(iau(node)) - coeff + ctr + a(nbr) = two*coeff + end if + 27 continue + 26 continue +c +c If only has two dimesion to work on, return now +c + if (nz .le. 1) return +c +c The front side boundary +c +c If the edges of the surface has been decided by Dirichlet Boundary +c Condition, then leave them alone. +c + if (al(3) .eq. zero) then + ly = 2 + else + ly = 1 + end if + if (al(4) .eq. zero) then + uy = ny-1 + else + uy = ny + end if +c + z = zero + side = 'z1' + do 28 j = ly, uy + y = (j-1)*h + do 29 i = lx, ux + x = (i-1)*h + node = i + (j-1)*ky +c + if (al(5) .eq. zero) then + call clrow(node, a, ja, ia) + a(iau(node)) = betfun(side,x,y,z) + rhs(node) = gamfun(side,x,y,z) + else + nbr = lctcsr(node, node+kz, ja, ia) +c + coeff = two*cfun(x,y,z) + ctr = (h*ffun(x,y,z) - coeff)*h/al(5) + rhs(node) = rhs(node) + ctr * gamfun(side,x,y,z) + ctr = cfun(x,y,z-hhalf) + ctr * betfun(side,x,y,z) + coeff = cfun(x,y,z+hhalf) + a(iau(node)) = a(iau(node)) - coeff + ctr + a(nbr) = two*coeff + end if + 29 continue + 28 continue +c +c Similiarly for the top side of the boundary suface +c + z = (nz - 1) * h + side = 'z2' + do 30 j = ly, uy + y = (j-1)*h + do 31 i = lx, ux + x = (i-1)*h + node = (nz-1)*kz + (j-1)*ky + i +c + if (al(6) .eq. zero) then + call clrow(node, a, ja, ia) + a(iau(node)) = betfun(side,x,y,z) + rhs(node) = gamfun(side,x,y,z) + else + nbr = lctcsr(node, node-kz, ja, ia) +c + coeff = two*cfun(x,y,z) + ctr = (coeff + h*ffun(x,y,z))*h/al(6) + rhs(node) = rhs(node) - ctr * gamfun(side,x,y,z) + ctr = cfun(x,y,z+hhalf) - ctr * betfun(side,x,y,z) + coeff = cfun(x,y,z-hhalf) + a(iau(node)) = a(iau(node)) - coeff + ctr + a(nbr) = two*coeff + end if + 31 continue + 30 continue +c +c all set +c + return +c----------------------------------------------------------------------- + end +c-----end of fdaddbc---------------------------------------------------- +c----------------------------------------------------------------------- + subroutine clrow(i, a, ja, ia) + integer i, ja(*), ia(*), k + real *8 a(*) +c----------------------------------------------------------------------- +c clear the row i to all zero, but still keep the structure of the +c CSR matrix +c----------------------------------------------------------------------- + do 10 k = ia(i), ia(i+1)-1 + a(k) = 0.0D0 + 10 continue +c + return +c-----end of clrow------------------------------------------------------ + end +c----------------------------------------------------------------------- + function lctcsr(i,j,ja,ia) + integer lctcsr, i, j, ja(*), ia(*), k +c----------------------------------------------------------------------- +c locate the position of a matrix element in a CSR format +c returns -1 if the desired element is zero +c----------------------------------------------------------------------- + lctcsr = -1 + k = ia(i) + 10 if (k .lt. ia(i+1) .and. (lctcsr .eq. -1)) then + if (ja(k) .eq. j) lctcsr = k + k = k + 1 + goto 10 + end if +c + return +c----------------------------------------------------------------------- + end +c-----end of lctcsr----------------------------------------------------- + + diff --git a/MATGEN/FDIF/makefile b/MATGEN/FDIF/makefile new file mode 100644 index 0000000..18978d2 --- /dev/null +++ b/MATGEN/FDIF/makefile @@ -0,0 +1,21 @@ +FFLAGS = +F77 = f77 + +#F77 = cf77 +#FFLAGS = -Wf"-dp" + +FILES1 = rgen5pt.o functns.o + +gen5.ex: $(FILES1) ../../libskit.a + $(F77) $(FFLAGS) -o gen5.ex $(FILES1) ../../libskit.a + +FILES2 = rgenblk.o functns.o +genbl.ex: $(FILES2) ../../libskit.a + $(F77) $(FFLAGS) -o genbl.ex $(FILES2) ../../libskit.a + +clean: + rm -f *.o *.ex core *.trace + +../../libskit.a: + (cd ../..; $(MAKE) $(MAKEFLAGS) libskit.a) + diff --git a/MATGEN/FDIF/rgen5pt.f b/MATGEN/FDIF/rgen5pt.f new file mode 100644 index 0000000..fb736f8 --- /dev/null +++ b/MATGEN/FDIF/rgen5pt.f @@ -0,0 +1,66 @@ + program fivept +c----------------------------------------------------------------------- +c main program for generating 5 point and 7-point matrices in the +c Harwell-Boeing format. Creates a file with containing a +c harwell-boeing matrix. typical session: +c user answer are after the colon +c Enter nx, ny, nz : 10 10 1 +c Filename for matrix: test.mat +c output matrix in data file : test.mat +c +c nz = 1 will create a 2-D problem +c +c----------------------------------------------------------------------- + integer nmx, nxmax + parameter (nxmax = 50, nmx = nxmax*nxmax) +c implicit none + integer ia(nmx),ja(7*nmx),iau(nmx) + real*8 a(7*nmx),rhs(nmx),al(6) + character title*72, key*8, type*3, matfile*50, guesol*2 +c----------------------------------------------------------------------- + integer nx, ny, nz, iout, n, ifmt, job + write (6,*) ' ' + write(6,'(22hEnter nx, ny, nz : ,$)') + read (5,*) nx, ny, nz + write(6,'(22hFilename for matrix : ,$)') + read(5,'(a50)') matfile + open (unit=7,file=matfile) +c +c boundary condition is partly specified here +c +c al(1) = 1.0D0 +c al(2) = 0.0D0 +c al(3) = 2.3D1 +c al(4) = 0.4D0 +c al(5) = 0.0D0 +c al(6) = 8.2D-2 + al(1) = 0.0D0 + al(2) = 0.0D0 + al(3) = 0.0D1 + al(4) = 0.0D0 + al(5) = 0.0D0 + al(6) = 0.0D0 +c + call gen57pt (nx,ny,nz,al,0,n,a,ja,ia,iau,rhs) + iout = 7 +c +c write out the matrix +c + guesol='NN' + title = + * ' 5-POINT TEST MATRIX FROM SPARSKIT ' +c '123456789012345678901234567890123456789012345678901234567890 + type = 'RUA' + key ='SC5POINT' +C 12345678 + ifmt = 15 + job = 2 +c upper part only?? +c call getu (n, a, ja, ia, a, ja, ia) + call prtmt (n,n,a,ja,ia,rhs,guesol,title,key,type, + 1 ifmt,job,iout) + write (6,*) ' output matrix in data file : ', matfile +c + stop + end + diff --git a/MATGEN/FDIF/rgenblk.f b/MATGEN/FDIF/rgenblk.f new file mode 100644 index 0000000..4df0c7a --- /dev/null +++ b/MATGEN/FDIF/rgenblk.f @@ -0,0 +1,63 @@ + program bfivept +c----------------------------------------------------------------------- +c main program for generating BLOCK 5 point and 7-point matrices in the +c Harwell-Boeing format. Creates a file with containing a +c harwell-boeing matrix. +c +c max block size = 5 +c max number of grid points = 8000 = ( nx * ny * nz .le. 8000) +c matrix dimension = (nx*ny*nz* Block-size**2) .le. 8000 * 25= 200,000 +c +c typical session: +c Enter nx, ny, nz : 10 10 1 +c enter block-size : 4 +c enter filename for matrix: test.mat +c output matrix in data file : test.mat +c +c nz =1 will create a 2-D problem +c----------------------------------------------------------------------- + parameter (nxmax = 20, nmx = nxmax*nxmax*nxmax, ntot=nmx*25) + integer ia(ntot),ja(ntot),iau(ntot), iao(ntot),jao(ntot) + real*8 stencil(7,100), a(ntot), ao(ntot) + character title*72,key*8,type*3, matfile*50, guesol*2 +c----------------------------------------------------------------------- + write (6,*) ' ' + write(6,'(22hEnter nx, ny, nz : ,$)') + read (5,*) nx, ny, nz + write(6,'(22hnfree (Block size) : ,$)') + read (5,*) nfree + + write(6,'(22hFilename for matrix : ,$)') + + read(5,'(a50)') matfile + open (unit=7,file=matfile) +c + write (6,*) ' output in data file : ', matfile + +c------------------------------------------------------ + na = nfree*nfree +c + call gen57bl (nx,ny,nz,nfree,na,n,a,ja,ia,iau,stencil) +c------------------------------------------------------ + + print *, ' n=', n, ' nfree ', nfree, ' na =', na + + call bsrcsr(1,n,nfree, na, a, ja, ia, ao, jao, iao) + n = n * nfree ! Apr. 21, 1995 + + guesol='NN' + + title = + * ' BLOCK 5-POINT TEST MATRIX FROM SPARSKIT ' + type = 'RUA' + key = 'BLOCK5PT' +C 12345678 + ifmt = 15 + job = 2 + iout = 7 + call prtmt (n,n,ao,jao,iao,rhs,guesol,title,key,type, + 1 ifmt,job,iout) + print *, ' output in data file : ', matfile +c + stop + end diff --git a/MATGEN/FEM/README b/MATGEN/FEM/README new file mode 100644 index 0000000..cd1745b --- /dev/null +++ b/MATGEN/FEM/README @@ -0,0 +1,26 @@ +--------------------------------------------------------------- + + SPARSKIT Modules FEM + +--------------------------------------------------------------- + + This directory contains the SPARSKIT FEM module, + a matrix generator for finite element matrices. + +contents: +========= + + convdif.f == a driver to generate a matrix and some associated plots + functns2.o == functions needed by the driver -- define the coefficients + of the PDE + meshes.f == set of sample meshes defined as inout to the driver + makefile == a makefile for an executable to generate a sample mesh + elmtlib2.f == a small finite element library + +mat.hb is a test matrix. + +Two output files are provided: mat.ps and msh.ps. You may wish to save +these to another name before running the test program so that you may +compare your output to these files. + +----------------------------------------------------------------------- diff --git a/MATGEN/FEM/convdif.f b/MATGEN/FEM/convdif.f new file mode 100644 index 0000000..e58fd8a --- /dev/null +++ b/MATGEN/FEM/convdif.f @@ -0,0 +1,131 @@ + program convdif +c----------------------------------------------------------------------- +c this driver will generate a finite element matrix for the +c convection-diffusion problem +c +c - Div ( K(x,y) Grad u ) + C grad u = f +c u = 0 on boundary +c +c (Dirichlet boundary conditions). +c----------------------------------------------------------------------- +c this code will prompt for desired mesh (from 0 to 9, with one being +c a user input one) and will general the matrix in harewell-Boeing format +c in the file mat.hb. It also generates two post script files, one +c showing the pattern of the matrix (mat.ps) and the other showing the +c corresponding mesh (msh.ps). +c----------------------------------------------------------------------- +c the structure and organization of the fem codes follow very closely +c that of the book by Noborou Kikuchi (Finite element methods in +c mechanics, Cambridge Univ. press, 1986). +c----------------------------------------------------------------------- +c coded Y. Saad and S. Ma -- this version dated August 11, 1993 +c----------------------------------------------------------------------- + implicit none + integer maxnx, maxnel + parameter (maxnx = 8000, maxnel = 15000) + real*8 a(7*maxnx),x(maxnx),y(maxnx),f(3*maxnx) + integer ijk(3,maxnel),ichild(12,maxnel),iparnts(2,maxnx), + * ia(maxnx),ja(7*maxnx),iwk(maxnx),jwk(maxnx),nodcode(maxnx), + * iperm(maxnx) +c + character matfile*20, title*72, munt*2,key*8, type*3 + real size +c + integer iin,node,nx,nelx,iout,ndeg,na,nmesh,nref,nxmax,nelmax,nb, + * ii,nxnew, nelxnew,ierr,job,n,ncol,mode,ptitle,ifmt + external xyk, funb, func, fung + data iin/7/,node/3/,nx/0/,nelx/0/,iout/8/,ndeg/12/, na/3000/ +c-------------------------------------------------------------- +c choose starting mesh --- +c-------------------------------------------------------------- +c files for output +c + open(unit=10,file='mat.hb') + open(unit=11,file='msh.ps') + open(unit=12,file='mat.ps') +c----------------------------------------------------------------------- + print *, ' enter chosen mesh ' + read (*,*) nmesh + if (nmesh .eq. 0) then + print *, 'enter input file for initial mesh ' + read(*,'(a20)') matfile + open (unit=7,file=matfile) + endif +c----------------------------------------------------------------------- + print *, ' Enter the number of refinements desired ' + read (*,*) nref + call inmesh (nmesh,iin,nx,nelx,node,x,y,nodcode,ijk,iperm) +c +c ...REFINE THE GRID +c + nxmax = maxnx + nelmax= maxnel + nb = 0 + do 10 ii = 1, nref +c +c estimate the number nx and nelx at next refinement level. +c + call checkref(nx,nelx,ijk,node,nodcode,nb,nxnew,nelxnew) + if (nxnew .gt. nxmax .or. nelxnew .gt. nelmax) then + print *, ' Was able to do only ', ii-1 ,' refinements' + goto 11 + endif +c +c ...if OK refine all elements +c + call refall(nx,nelx,ijk,node,ndeg,x,y,ichild,iparnts,nodcode, + * nxmax, nelmax, ierr) + if (ierr .ne. 0) print *, '** ERROR IN REFALL : ierr =',ierr + 10 continue + 11 continue +c----------------------------------------------------------------------- + job = 0 +c----------------------------------------------------------------------- +c assemble the matrix in CSR format +c----------------------------------------------------------------------- + call assmbo (nx,nelx,node,ijk,nodcode,x,y, + * a,ja,ia,f,iwk,jwk,ierr,xyk,funb,func,fung) + n = nx +c----------------------Harewell-Boeing matrix--------------------------- +c---------------------1---------2---------3---------5---------6 +c 12345678901234567890123456789012345678901234567890 + title='1Sample matrix from SPARSKIT ' + key = 'SPARSKIT' + type = 'rua' + ifmt = 6 + job = 2 + call prtmt (n,n,a,ja,ia,f,'NN',title,key,type,ifmt,job,10) +c----------------------Plot of mesh------------------------------------- +c----------------------------------------------------------------------- + size = 6.0 + munt = 'in' + mode = 0 + title ='Finite element mesh ' + ptitle = 1 + call psgrid (nx,ja,ia,x,y,title,ptitle,size,munt,11) +c hsize = 5.6 +c vsize = 5.6 +c xleft = 0.0 +c bot = 0.0 +c job = 30 +c call texgrd(nx,ja,ia,x,y,munt,size,vsize,hsize, +c * xleft,bot,job,title,ptitle,ijk,node,nelx,11) +c----------------------Plot of matrix-pattern--------------------------- +c----------------------------------------------------------------------- + size = 5.5 + mode = 0 + title = 'Assembled Matrix' + ptitle = 1 + ncol = 0 + iout = 12 + call pspltm(n,n,mode,ja,ia,title,ptitle,size,munt,ncol,iwk,12) +c xleft = 0.00 +c bot = 0.70 +c job = 0 +c call texplt(nx,nx,mode,ja,ia,munt,size,vsize,hsize,xleft,bot, +c * job,title,ptitle,ncol,iwk,12) + stop +c-----end-of-program-convdif-------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- diff --git a/MATGEN/FEM/elmtlib2.f b/MATGEN/FEM/elmtlib2.f new file mode 100644 index 0000000..90f4cec --- /dev/null +++ b/MATGEN/FEM/elmtlib2.f @@ -0,0 +1,1501 @@ + subroutine refall(nx, nelx,ijk,node,ndeg,x,y, + * ichild,iparnts,nodcode,nxmax,nelmax,ierr) + implicit real*8 (a-h,o-z) + integer nx, nelx, node, ndeg, nxmax, nelmax + integer ichild(ndeg,1),iparnts(2,nx),ijk(node,*), nodcode(nx) + integer midnode(20),inod(20) + real*8 x(*),y(*) +c------------------------------------------------------------- +c refines a finite element grid using triangular elements. +c uses mid points to refine all the elements of the grid. +c +c nx = number of nodes at input +c nelx = number of elements at input +c ijk = connectivity matrix: for node k, ijk(*,k) point to the +c nodes of element k. +c node = first dimension of array ijk [should be >=3] +c ndeg = first dimension of array ichild which is at least as large +c as the max degree of each node +c x,y = real*8 arrays containing the x(*) and y(*) coordinates +c resp. of the nodes. +c ichild= list of the children of a node: ichild(1,k) stores +c the position in ichild(*,k) of the last child so far. +c (local use) +c iparnts= list of the 2 parents of each node. +c (local use) +c nodcode= boundary information list for each node with the +c following meaning: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point. +c corner elements are used only to generate the grid by refinement +c since they do not correspond to real elements. +c nxmax = maximum number of nodes allowed. If during the algorithm +c the number of nodes being created exceeds nxmax then +c refall quits without modifying the (x,y) xoordinates +c and nx, nelx. ijk is modified. Also ierr is set to 1. +c nelmax = same as above for number of elements allowed. See ierr.. +c ierr = error message: +c 0 --> normal return +c 1 --> refall quit because nxmax was exceeded. +c 2 --> refall quit because nelmax was exceeded. +c-------------------------------------------------------------- +c--------------------------------------------------------------- +c inilitialize lists of children and parents -- +c data structure is as follows +c ichild(1,k) stores the position of last child of node k so far in list +c ichild(j,k) , j .ge. 2 = list of children of node k. +c iparnts(1,k) and iparnts(2,k) are the two parents of node k. +c--------------------------------------------------------------- +c------ do a first check : + if (nx .ge. nxmax) goto 800 + if (nelx .ge. nelmax) goto 900 +c------ initialize + do 1 k=1,nx + do 2 j=2,ndeg + ichild(j,k) = 0 + 2 continue + ichild(1,k) = 1 + iparnts(1,k)= 0 + iparnts(2,k)= 0 + 1 continue +c------- initialize nelxnew and nxnew + nelxnew = nelx + nxnew = nx + ierr = 0 +c-------------------------------------------------------------- +c main loop: scan all elements +c-------------------------------------------------------------- +c do 100 nel = nelx,1,-1 + do 100 nel = 1, nelx +c note : interesting question which order is best for parallelism? +c alternative order: do 100 nel = nelx, 1, -1 +c +c------ unpack nodes of element + do 101 i=1,node + inod(i) = ijk(i,nel) +c convention: node after last node = first node. + inod(node+i) = inod(i) + midnode(i) = 0 + 101 continue +c-------------------------------------------------------------- +c for each new potential node determine if it has already been +c numbered. a potential node is the middle of any two nodes .. +c-------------------------------------------------------------- + do 80 ii=1,node + k1 = inod(ii) + k2 = inod(ii+1) +c------- test for current pair : + last = ichild(1,k1) + do 21 k=2,last + jchild = ichild(k,k1) + ipar1 = iparnts(1,jchild) + ipar2 = iparnts(2,jchild) + if( (ipar1 .eq. k1 .and. ipar2 .eq. k2) .or. + * (ipar2 .eq. k1 .and. ipar1 .eq. k2)) then +c node has already been created and numbered .... + midnode(ii) = jchild +c... therefore it must be an internal node + nodcode(jchild) = 0 +c... and no new node to create. + goto 80 + endif +c----------------------------------------------------- + 21 continue +c +c else create a new node +c + nxnew = nxnew + 1 + if (nxnew .gt. nxmax) goto 800 +c------- + x(nxnew) = (x(k1) + x(k2))*0.5 + y(nxnew) = (y(k1) + y(k2))*0.5 + midnode(ii) = nxnew +c +c update nodcode information -- normally min0(nodcode(k1),nodcode(k2)) +c + nodcode(nxnew) = min0(1,nodcode(k1),nodcode(k2)) +c +c update parents and children's lists +c + iparnts(1,nxnew) = k1 + iparnts(2,nxnew) = k2 +c + last = last+1 + ichild(last,k1) = nxnew + ichild(1,k1) = last +c + last = ichild(1,k2)+1 + ichild(last,k2) = nxnew + ichild(1,k2) = last +c + 80 continue +c +c------- replace current element by new one +c + do 81 i=1,node + jnod = midnode(i) + ijk(i,nel) = jnod + 81 continue +c-------create new elements + do 82 ii=1, node + nelxnew = nelxnew+1 + if (nelxnew .gt. nelmax) goto 900 + ijk(1,nelxnew) = inod(ii) + k = ii + do jj=2,node + ijk(jj,nelxnew) = midnode(k) + k = k+2 + if (k .gt. node) k = k-node + enddo + 82 continue +c------ done ! + 100 continue + nx = nxnew + nelx = nelxnew + return + 800 ierr = 1 + return + 900 ierr = 2 + return + end +c + subroutine checkref(nx,nelx,ijk,node,nodcode, + * nbound, nxnew,nelxnew) +c------------------------------------------------------------- +c returns the expected the new number of nodes and +c elemnts of refall is applied to current grid once. +c +c nx = number of nodes at input +c nelx = number of elements at input +c ijk = connectivity matrix: for node k, ijk(*,k) point to the +c nodes of element k. +c nbound = number of boundary points on entry - enter zero if +c unknown +c +c nodcode= boundary information list for each node with the +c following meaning: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point. +c +c nxnew = new number of nodes if refall were to be applied +c nelxnew = same for nelx. +c-------------------------------------------------------------- + integer ijk(node,1),nodcode(nx) +c + nelxnew = nelx*4 +c +c count the number of boundary nodes +c + if (nbound .ne. 0) goto 2 + do 1 j=1, nx + if (nodcode(j) .ge. 1) nbound = nbound+1 + 1 continue +c number of edges=[3*(number of elmts) + number of bound nodes ]/ 2 + 2 continue + nxnew = nx + (3*nelx+nbound)/2 + nbound = 2*nbound + return + end +c----------------------------------------------------------------------- + subroutine unassbl (a,na,f,nx,nelx,ijk,nodcode, + * node,x,y,ierr,xyk) +c----------------------------------------------------------------------- +c a = un-assembled matrix on output +c na = 1-st dimension of a. a(na,node,node) +c +c f = right hand side (global load vector) in un-assembled form +c nx = number of nodes at input +c nelx = number of elements at input +c ijk = connectivity matrix: for node k, ijk(*,k) point to the +c nodes of element k. +c node = total number of nodal points in each element +c also second dimension of a. +c +c nodcode= boundary information list for each node with the +c following meaning: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point (corner points +c +c x,y = real*8 arrays containing the $x$ and $y$ coordinates +c resp. of the nodes. +c K11, K22, and K12 at that element. +c ierr = error message integer . +c ierr = 0 --> normal return +c ierr = 1 --> negative area encountered (due to bad +c numbering of nodes of an element) +c +c xyk = subroutine defining the material properties at each +c element. Form: +c call xyk(nel,xyke,x,y,ijk,node) +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension a(na,node,node),ijk(node,1),x(1),y(1),f(node,1), + * ske(3,3),fe(3),xe(3),ye(3),xyke(2,2) + integer nodcode(1) + external xyk + +c-------------------------------------------------------------- +c initialize +c-------------------------------------------------------------- + do 100 i=1, node + do 100 j=1, nx + f(i,j) = 0.0d0 + 100 continue +c--------------------------------------------------- +c main loop +c--------------------------------------------------- + do 102 nel=1, nelx +c +c get coordinetes of nodal points +c + do 104 i=1, node + j = ijk(i,nel) + xe(i) = x(j) + ye(i) = y(j) + 104 continue +c +c compute determinant +c + det=xe(2)*(ye(3)-ye(1))+xe(3)*(ye(1)-ye(2))+xe(1)*(ye(2)-ye(3)) + if ( det .le. 0.) then + print *, 'nel', nel, ' det = ' , det + print *, xe(1), xe(2), xe(3) + print *, ye(1), ye(2), ye(3) + end if +c +c set material properties +c + call xyk(xyke,x,y) +c +c construct element stiffness matrix +c + ierr = 0 + call estif3(nel,ske,fe,det,xe,ye,xyke,ierr) + if (ierr .ne. 0) then + write (*,*) 'ERROR: estif3 gave an error',ierr + return + endif +c write (8,'(9f8.4)') ((ske(i,j),j=1,3),i=1,3) +c assemble: add element stiffness matrix to global matrix +c + do 120 ka=1, node + f(ka,nel) = fe(ka) + do 108 kb = 1,node + a(nel,ka,kb) = ske(ka,kb) + 108 continue + 120 continue + 102 continue + return + end +c----------------------------------------------------------------------- + subroutine unassbl_lstif(a, na, f, nx, nelx, ijk, nodcode, + * node, x, y, ierr, xyk, funb, func, fung) +c----------------------------------------------------------------------- +c a = un-assembled matrix on output +c +c na = 1-st dimension of a. a(na,node,node) +c +c f = right hand side (global load vector) in un-assembled form +c +c nx = number of nodes at input +c +c nelx = number of elements at input +c +c ijk = connectivity matrix: for node k, ijk(*,k) point to the +c nodes of element k. +c +c nodcode= boundary information list for each node with the +c following meaning: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point (corner points +c +c node = total number of nodal points in each element +c also second dimension of a. +c +c x,y = real*8 arrays containing the $x$ and $y$ coordinates +c resp. of the nodes. +c K11, K22, and K12 at that element. +c +c ierr = error message integer . +c ierr = 0 --> normal return +c ierr = 1 --> negative area encountered (due to bad +c numbering of nodes of an element) +c +c xyk = subroutine defining the material properties at each +c element. Form: call xyk(xyke,x,y) +c +c funb, = functions needed for the definition of lstif3 problem +c func, +c fung +c-------------------------------------------------------------- +c moulitsa@cs.umn.edu : It uses lstif3 problem +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension a(na,node,node), ijk(node,1), x(1), y(1), f(node,1), + & ske(3,3), fe(3), xe(3), ye(3) + integer nodcode(1) + external xyk, funb, func, fung +c-------------------------------------------------------------- +c initialize +c-------------------------------------------------------------- + do i=1, node + do j=1, nx + f(i,j) = 0.0d0 + end do + end do + +c--------------------------------------------------- +c main loop +c--------------------------------------------------- + do nel=1, nelx +c +c get coordinetes of nodal points +c + do i=1, node + j = ijk(i,nel) + xe(i) = x(j) + ye(i) = y(j) + end do +c +c compute determinant +c +c det=xe(2)*(ye(3)-ye(1))+xe(3)*(ye(1)-ye(2))+xe(1)*(ye(2)-ye(3)) +c if ( det .le. 0.) then +c print *, 'nel', nel, ' det = ' , det +c print *, xe(1), xe(2), xe(3) +c print *, ye(1), ye(2), ye(3) +c end if +c +c construct element stiffness matrix +c + ierr = 0 + + call lstif3(ske, fe, xe, ye, xyk, funb, func, fung) +c write (8,'(9f8.4)') ((ske(i,j),j=1,3),i=1,3) +c +c assemble: add element stiffness matrix to global matrix +c + do ka=1, node + f(ka,nel) = fe(ka) + do kb = 1,node + a(nel,ka,kb) = ske(ka,kb) + end do + end do + + end do + + return + end +c----------------------------------------------------------------------- + subroutine assmbo (nx, nelx, node, ijk, nodcode, x, y, a, ja, + * ia, f, iwk, jwk, ierr, xyk, funb, func, fung) +c----------------------------------------------------------------------- +c nx = number of nodes at input +c +c nelx = number of elements at input +c +c node = total number of nodal points in each element +c +c ijk = connectivity matrix: for node k, ijk(*,k) point to the +c nodes of element k. +c +c nodcode= boundary information list for each node with the +c following meaning: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point (corner points +c +c x,y = real arrays containing the $x$ and $y$ coordinates +c resp. of the nodes. +c +c a,ja,ia= assembled matrix on output +c +c f = right hand side (global load vector) +c +c iwk,jwk = two integer work arrays. +c +c ierr = error message integer . +c ierr = 0 --> normal return +c ierr = 1 --> negative area encountered (due to bad +c numbering of nodes of an element) +c +c xyk = subroutine defining the material properties at each +c element. Form: +c call xyk(nel,xyke,x,y,ijk,node) with on return +c xyke = material constant matrices. +c for each element nel, xyke(1,nel),xyke(2,nel) +c and xyke(3,nel) represent the constants +c K11, K22, and K12 at that element. +c-------------------------------------------------------------- +c moulitsa@cs.umn.edu : It has been modified so as to handle +c more types of domains/meshes i.e. |\ /| +c | X | +c |/ \| +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension a(*),ijk(node,1),x(1),y(1),f(1),ske(3,3),fe(3), + * xe(3),ye(3),iwk(1),jwk(1) + integer ia(1), ja(*), nodcode(1) + external xyk, funb, func, fung + +c-------------------------------------------------------------- +c initialize +c-------------------------------------------------------------- + do i=1,nx + f(i) = 0.0 + end do +c initialize pointer arrays. + do k=1,nx+1 + ia(k) = 1 + jwk(k) = 0 + end do + do k=1,nelx + do j=1,node + knod = ijk(j,k) + ia(knod) = ia(knod) + 2 + end do + end do +c--------------------------------------------------- + do k=1, nx + if (nodcode(k) .ge.1 ) ia(k)=ia(k)+1 + end do +c + ksav = ia(1) + ia(1) = 1 + do j=2, nx+1 + ksavn = ia(j) + ia(j) = ia(j-1) + ksav + iwk(j-1) = ia(j-1)-1 + ksav = ksavn + end do + +c----------------- +c main loop +c----------------- + do nel=1, nelx +c +c get coordinates of nodal points +c + do i=1, node + j = ijk(i,nel) + xe(i) = x(j) + ye(i) = y(j) + end do +c +c compute determinant +c +c det=xe(2)*(ye(3)-ye(1))+xe(3)*(ye(1)-ye(2))+xe(1)*(ye(2)-ye(3)) +c +c set material properties +c +c call xyk(nel,xyke,x,y,ijk,node) +c +c construct element stiffness matrix +c + ierr = 0 +c +c call evalg(nel, fe, xe, ye, fung, ierr) +c call estif3(nel,ske,fe,det,xe,ye,xyke,ierr) + call lstif3(ske, fe, xe, ye, xyk, funb, func, fung) + if (ierr .ne. 0) return +c +c assemble: add element stiffness matrix to global matrix +c + do ka=1, node + ii = ijk(ka,nel) + f(ii) = f(ii) + fe(ka) +c +c unpack row into jwk1 +c + irowst = ia(ii) + ilast = iwk(ii) + do k=irowst,ilast + jwk(ja(k)) = k + end do +c + do kb = 1,node +c +c column number = jj +c + jj = ijk(kb,nel) + k = jwk(jj) + if (k .eq. 0) then + ilast = ilast+1 + jwk(jj) = ilast + ja(ilast) = jj + a(ilast) = ske(ka,kb) + else + a(k) = a(k) + ske(ka,kb) + endif + end do +c refresh jwk + do k=irowst,ilast + jwk(ja(k)) = 0 + end do + iwk(ii) = ilast + end do +c + end do + +c squeeze away the zero entries +c added so as to handle more type of domains/meshes + do i=1, nx + ista=ia(i) + isto=ia(i+1)-1 + do j=ista, isto + if (ja(j) .EQ. 0) then + iwk(i)=j-ista + go to 200 + end if + end do + 200 continue + end do + + do i=2, nx + ksav=ia(i) + ia(i)=ia(i-1)+iwk(i-1) + ksavn=ia(i) + do j=0, iwk(i)-1 + ja(ksavn+j)=ja(ksav+j) + a(ksavn+j) = a(ksav+j) + end do + end do + ia(nx+1)=ia(nx)+iwk(nx) + + return + end +c----------------------------------------------------------------------- + subroutine assmbo2 (nx, nelx, node, ijk, nodcode, x, y, a, ja, + * ia, f, iwk, jwk, ierr, xyk, funb, func, fung) +c----------------------------------------------------------------------- +c nx = number of nodes at input +c +c nelx = number of elements at input +c +c node = total number of nodal points in each element +c +c ijk = connectivity matrix: for node k, ijk(*,k) point to the +c nodes of element k. +c +c nodcode= boundary information list for each node with the +c following meaning: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point (corner points +c +c x,y = real arrays containing the $x$ and $y$ coordinates +c resp. of the nodes. +c +c a,ja,ia= assembled matrix on output +c +c f = right hand side (global load vector) +c +c iwk,jwk = two integer work arrays. +c +c ierr = error message integer . +c ierr = 0 --> normal return +c ierr = 1 --> negative area encountered (due to bad +c numbering of nodes of an element) +c +c xyk = subroutine defining the material properties at each +c element. Form: +c call xyk(nel,xyke,x,y,ijk,node) with on return +c xyke = material constant matrices. +c for each element nel, xyke(1,nel),xyke(2,nel) +c and xyke(3,nel) represent the constants +c K11, K22, and K12 at that element. +c-------------------------------------------------------------- +c +c moulitsa@cs.umn.edu : This routine yields the same results +c as assmbo. It differs in that it constructs the ia array +c by creating a list with the adjacent nodes for each node +c +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension a(*),ijk(node,1),x(1),y(1),f(1),ske(3,3),fe(3), + * xe(3),ye(3),iwk(1),jwk(1), kwk(500) + integer ia(1), ja(*), nodcode(1) + external xyk, funb, func, fung + +c-------------------------------------------------------------- +c initialize +c-------------------------------------------------------------- + do i=1,nx + f(i) = 0.0 + iwk(i) = 0 + kwk(i) = 0 + end do + +c iwk : how many elements a node belongs to + do k=1,nelx + do j=1,node + knod = ijk(j,k) + iwk(knod) = iwk(knod) + 1 + end do + end do +c +c iwk : prepare for csr like format + ksav=iwk(1) + iwk(1)=1 + do j=2, nx+1 + ksavn = iwk(j) + iwk(j) = iwk(j-1) + ksav + ksav = ksavn + end do +c +c jwk : list of elements a node belongs to + k=1 + do i=1,nelx + do j=1,node + knod = ijk(j,i) + k=iwk(knod) + jwk(k)=i + iwk(knod)=iwk(knod)+1 + end do + end do + +c iwk : transform iwk back to what it was + do i=nx+1,2,-1 + iwk(i)=iwk(i-1) + end do + iwk(1)=1 + +c kwk : mark edges that a node is associated with + nedges=1 + ia(1)=1 + do i=1,nx + kwk(i)=i + do j=iwk(i), iwk(i+1)-1 + do k=1, node + knod = ijk(k,jwk(j)) + if ( kwk(knod) .NE. i) then + kwk(knod) = i + nedges=nedges+1 + end if + end do + end do + ia(i+1)=nedges + end do + do i=2,nx+1 + ia(i)=ia(i)+i-1 + iwk(i-1)=ia(i-1)-1 + jwk(i)=0 + end do + jwk(1)=0 + +c----------------- +c main loop +c----------------- + do nel=1, nelx +c +c get coordinates of nodal points +c + do i=1, node + j = ijk(i,nel) + xe(i) = x(j) + ye(i) = y(j) + end do +c +c compute determinant +c +c det=xe(2)*(ye(3)-ye(1))+xe(3)*(ye(1)-ye(2))+xe(1)*(ye(2)-ye(3)) +c +c set material properties +c +c call xyk(nel,xyke,x,y,ijk,node) +c +c construct element stiffness matrix +c + ierr = 0 +c +c call evalg(nel, fe, xe, ye, fung, ierr) +c call estif3(nel,ske,fe,det,xe,ye,xyke,ierr) + call lstif3(ske, fe, xe, ye, xyk, funb, func, fung) + if (ierr .ne. 0) return +c +c assemble: add element stiffness matrix to global matrix +c + do ka=1, node + ii = ijk(ka,nel) + f(ii) = f(ii) + fe(ka) +c +c unpack row into jwk1 +c + irowst = ia(ii) + ilast = iwk(ii) + do k=irowst,ilast + jwk(ja(k)) = k + end do +c + do kb = 1,node +c +c column number = jj +c + jj = ijk(kb,nel) + k = jwk(jj) + if (k .eq. 0) then + ilast = ilast+1 + jwk(jj) = ilast + ja(ilast) = jj + a(ilast) = ske(ka,kb) + else + a(k) = a(k) + ske(ka,kb) + endif + end do +c refresh jwk + do k=irowst,ilast + jwk(ja(k)) = 0 + end do + iwk(ii) = ilast + end do +c + end do + + return + end +c----------------------------------------------------------------------- + subroutine chkelmt (nx, x, y, nelx, ijk, node) + implicit real*8 (a-h,o-z) + dimension ijk(node,1),x(1),y(1) +c----------------------------------------------------------------------- +c this subsourine checks the labeling within each elment and reorders +c the nodes in they ar not correctly ordered. +c----------------------------------------------------------------------- + do 1 nel =1, nelx + det = x(ijk(2,nel))*(y(ijk(3,nel))-y(ijk(1,nel)))+ + * x(ijk(3,nel))*(y(ijk(1,nel))-y(ijk(2,nel)))+ + * x(ijk(1,nel))*(y(ijk(2,nel))-y(ijk(3,nel))) +c +c if determinant negative exchange last two nodes of elements. +c + if (det .lt. 0.0d0) then + j = ijk(2,nel) + ijk(2,nel) = ijk(3,nel) + ijk(3,nel) = j + endif + 1 continue +c + return + end +c----------------------------------------------------------------------- + SUBROUTINE DLAUNY(X,Y,NODES,ELMNTS,NEMAX,NELMNT) + IMPLICIT DOUBLE PRECISION (A-H,O-Z) +c +C code written by P.K. Sweby +c simple delauney triangulation routine (non optimal) +c +C ****************************************************************** +C * * +C * Performs a Delaunay triangularisation of a region given a set * +C * of mesh points. * +C * X,Y :- 1D arrays holding coordinates of mesh points. * +C * dimensioned AT LEAST NODES+3. * +C * NODES :- number of mesh points. * +C * ELMNTS :- INTEGER array, dimensioned NEMAX x 3, which on exit* +C * contains the index of global nodes associated with * +C * each element. * +C * NELMNT :- on exit contains the number of elements in the * +C * triangularisation. * +C * * +C * P.K.Sweby * +C * * +C ****************************************************************** +C + INTEGER ELMNTS + DIMENSION X(NODES),Y(NODES),ELMNTS(NEMAX,3) +C + PI=4.0*ATAN(1.0) +C +C Calculate artificial nodes NODES+i i=1,2,3,4 and construct first +C two (artificial) elements. +C + XMIN=X(1) + XMAX=X(1) + YMIN=Y(1) + YMAX=Y(1) + DO 10 I=2,NODES + XMIN=MIN(XMIN,X(I)) + XMAX=MAX(XMAX,X(I)) + YMIN=MIN(YMIN,Y(I)) + YMAX=MAX(YMAX,Y(I)) + 10 CONTINUE + DX=XMAX-XMIN + DY=YMAX-YMIN + XL=XMIN-4.0*DX + XR=XMAX+4.0*DX + YL=YMIN-4.0*DY + YR=YMAX+4.0*DY + X(NODES+1)=XL + Y(NODES+1)=YL + X(NODES+2)=XL + Y(NODES+2)=YR + X(NODES+3)=XR + Y(NODES+3)=YR + X(NODES+4)=XR + Y(NODES+4)=YL + ELMNTS(1,1)=NODES+1 + ELMNTS(1,2)=NODES+2 + ELMNTS(1,3)=NODES+3 + ELMNTS(2,1)=NODES+3 + ELMNTS(2,2)=NODES+4 + ELMNTS(2,3)=NODES+1 + NELMNT=2 + DO 90 IN=1,NODES +C +C Add one mesh point at a time and remesh locally if necessary +C + NDEL=0 + NEWEL=0 + DO 40 IE=1,NELMNT +C +C Is point IN insided circumcircle of element IE ? +C + I1=ELMNTS(IE,1) + I2=ELMNTS(IE,2) + I3=ELMNTS(IE,3) + X2=X(I2)-X(I1) + X3=X(I3)-X(I1) + Y2=Y(I2)-Y(I1) + Y3=Y(I3)-Y(I1) + Z=(X2*(X2-X3)+Y2*(Y2-Y3))/(Y2*X3-Y3*X2) + CX=0.5*(X3-Z*Y3) + CY=0.5*(Y3+Z*X3) + R2=CX**2+CY**2 + RN2=((X(IN)-X(I1)-CX)**2+(Y(IN)-Y(I1)-CY)**2) + IF(RN2.GT.R2)GOTO 40 +C +C Yes it is inside,create new elements and mark old for deletion. +C + DO 30 J=1,3 + DO 20 K=1,3 + ELMNTS(NELMNT+NEWEL+J,K)=ELMNTS(IE,K) + 20 CONTINUE + ELMNTS(NELMNT+NEWEL+J,J)=IN + 30 CONTINUE + NEWEL=NEWEL+3 + ELMNTS(IE,1)=0 + NDEL=NDEL+1 +C + 40 CONTINUE +C +C If IN was inside circumcircle of more than 1 element then will +C have created 2 identical new elements: delete them both. +C + IF(NDEL.GT.1)THEN + DO 60 IE=NELMNT+1,NELMNT+NEWEL-1 + DO 60 JE=IE+1,NELMNT+NEWEL + MATCH=0 + DO 50 K=1,3 + DO 50 L=1,3 + IF(ELMNTS(IE,K).EQ.ELMNTS(JE,L))MATCH=MATCH+1 + 50 CONTINUE + IF(MATCH.EQ.3)THEN + ELMNTS(IE,1)=0 + ELMNTS(JE,1)=0 + NDEL=NDEL+2 + ENDIF + 60 CONTINUE + ENDIF +C +C Delete any elements +C + NN=NELMNT+NEWEL + IE=1 + 70 CONTINUE + IF(ELMNTS(IE,1).EQ.0)THEN + DO 80 J=IE,NN-1 + DO 80 K=1,3 + ELMNTS(J,K)=ELMNTS(J+1,K) + 80 CONTINUE + NN=NN-1 + IE=IE-1 + ENDIF + IE=IE+1 + IF(IE.LE.NN)GOTO 70 + NELMNT=NN + 90 CONTINUE +C +C Finally remove elements containing artificial nodes +C + IE=1 + 100 CONTINUE + NART=0 + DO 110 L=1,3 + IF(ELMNTS(IE,L).GT.NODES)NART=NART+1 + 110 CONTINUE + IF(NART.GT.0)THEN + DO 120 J=IE,NN-1 + DO 120 K=1,3 + ELMNTS(J,K)=ELMNTS(J+1,K) + 120 CONTINUE + NELMNT=NELMNT-1 + IE=IE-1 + ENDIF + IE=IE+1 + IF(IE.LE.NELMNT)GOTO 100 + RETURN + END +c----------------------------------------------------------------------- + subroutine estif3(nel,ske,fe,det,xe,ye,xyke,ierr) +c----------------------------------------------------------------------- +c this subroutine constructs the element stiffness matrix for heat +c condution problem +c +c - Div ( K(x,y) Grad u ) = f +c u = 0 on boundary +c +c using 3-node triangular elements arguments: +c nel = element number +c ske = element stiffness matrix +c fe = element load vector +c det = 2*area of the triangle +c xy, ye= coordinates of the three nodal points in an element. +c xyke = material constants (kxx, kxy, kyx, kyy) +c +c------------------------------------------------------------------------ + implicit real*8 (a-h,o-z) + dimension ske(3,3), fe(3), xe(3), ye(3), dn(3,2),xyke(2,2) +c +c initialize +c + area = 0.5*det +c + do 200 i=1,3 + do 200 j=1,3 + ske(i,j) = 0.0d0 + 200 continue +c +c get first gradient of shape function +c + call gradi3(nel,xe,ye,dn,det,ierr) + if (ierr .ne. 0) return +c + do 100 i=1,3 + do 100 j=1,3 + t = 0.0d0 + do 102 k=1,2 + do 102 l=1,2 + 102 t = t+xyke(k,l)*dn(i,k)*dn(j,l) + 100 ske(i,j) = t*area +c + return + end +c------------------------------------------------------- + subroutine gradi3(nel, xe, ye, dn, det,ierr) +c------------------------------------------------------- +c constructs the first derivative of the shape functions. +c arguments: +c nel = element nuumber +c xy, ye= coordinates of the three nodal points in an element. +c dn = gradients (1-st derivatives) of the shape functions. +c area = area of the triangle +c +c------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension xe(3), ye(3), dn(3,2) + data eps/1.d-17/ +c compute area + ierr = 0 + if (det .le. eps) goto 100 +c + dn(1,1) = (ye(2)-ye(3))/det + dn(2,1) = (ye(3)-ye(1))/det + dn(3,1) = (ye(1)-ye(2))/det + dn(1,2) = (xe(3)-xe(2))/det + dn(2,2) = (xe(1)-xe(3))/det + dn(3,2) = (xe(2)-xe(1))/det +c + return +c + 100 continue + ierr = 3 + write(iout,*) 'ERROR:negative area encountered at elmt: ',nel +c write(iout,*) det,(xe(i),ye(i),i=1,3) + return + end +c----------------------------------------------------------------------- + subroutine hsourc (indic,nx,nelx,node,x,y,ijk,fs,f) + implicit real*8 (a-h,o-z) + real*8 x(*),y(*),fs(*),f(*),xe(3),ye(3),det,areao3 + integer ijk(node,*) +c +c generates the load vector f in assembled/unassembled form from the +c the element contributions fs. +c indic = indicates if f is to be assembled (1) or not (zero) +c note: f(*) not initilazed. because might use values from boundary +c conditions. +c + jnod = 0 + do 130 nel = 1,nelx +c +c get coordinates of nodal points +c + do 104 i=1, node + j = ijk(i,nel) + xe(i) = x(j) + ye(i) = y(j) + 104 continue +c +c compute determinant +c + det=xe(2)*(ye(3)-ye(1))+xe(3)*(ye(1)-ye(2))+xe(1)*(ye(2)-ye(3)) +c area3 = area/3 + areao3 = det/6.0 +c +c contributions to nodes in the element +c + if (indic .eq. 0) then + do 115 ka=1,node + jnod = jnod+1 + f(jnod) = fs(nel)*areao3 + 115 continue + else + do 120 ka=1, node + ii = ijk(ka,nel) + f(ii) = f(ii) + fs(nel)*areao3 + 120 continue + endif +c + 130 continue + return + end +c----- end of hsourc --------------------------------------------------- +c----------------------------------------------------------------------- + subroutine bound (nx,nelx,ijk,nodcode,node,nint,iperm, + * x,y,wk,iwk) +c----------------------------------------------------------------------- +c this routine counts the number of boundary points and +c reorders the points in such a way that the boundary nodes +c are last. +c +c nx, nelx, ijk, nodcode, node: see other subroutines +c iperm = permutation array from old orderin to new ordering, +c iwk = reverse permutation array or return. +c wk = real work array +c On return +c x, y, nodecode, are permuted +c ijk is updated according to new oerdering. +c nint = number of interior points. +c +c----------------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension ijk(node,1),x(1),y(1),wk(1),iwk(1),iperm(1), + * nodcode(1) + +c put all boundary points at the end, backwards + nint = 1 + nbound = nx + do 1 j=1, nx + if (nodcode(j) .eq. 0) then + iperm(nint) = j + nint = nint+1 + else + iperm(nbound) = j + nbound = nbound-1 + endif + 1 continue +c------------------------------------------------------------------- + nint = nint-1 +c +c permute x's +c + do 2 k=1, nx + wk(k) = x(k) + 2 continue + do 3 k=1,nx + x(k) = wk(iperm(k)) + 3 continue +c +c permute the y's +c + do 4 k=1, nx + wk(k) = y(k) + 4 continue + do 5 k=1, nx + y(k) = wk(iperm(k)) + 5 continue +c +c permute the boundary information +c + do 6 k=1, nx + iwk(k) = nodcode(k) + 6 continue + do 7 k=1,nx + nodcode(k) = iwk(iperm(k)) + 7 continue +c +c get reverse permutation +c + do 8 k=1, nx + iwk(iperm(k)) = k + 8 continue +c +c update the elements connectivity matrix +c + do 10 nel = 1, nelx + do 9 j=1, node + knod = ijk(j,nel) + ijk(j,nel) = iwk(knod) + 9 continue + 10 continue + return + end +c----------------------------------------------------------------------- + subroutine symbound (nx,nelx,ijk,nodcode,node,nint, + * iperm,wk,iwk) +c----------------------------------------------------------------------- +c this routine is a symbolic version of routine bound. +c +c nx, nelx, ijk, nodcode, node: see other subroutines +c iperm = permutation array from old orderin to new ordering, +c iwk = reverse permutation array or return. +c wk = real work array +c On return +c ijk = is updated according to new oerdering. +c nint = number of interior points. +c +c----------------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension ijk(node,1),wk(1),iwk(1),iperm(1), + * nodcode(1) + +c put all boundary points at the end, backwards + nint = 1 + nbound = nx + do 1 j=1, nx + if (nodcode(j) .eq. 0) then + iperm(nint) = j + nint = nint+1 + else + iperm(nbound) = j + nbound = nbound-1 + endif + 1 continue +c------------------------------------------------------------------- + nint = nint-1 +c +c permute the boundary information +c + do 6 k=1, nx + iwk(k) = nodcode(k) + 6 continue + do 7 k=1,nx + nodcode(k) = iwk(iperm(k)) + 7 continue +c +c get reverse permutation +c + do 8 k=1, nx + iwk(iperm(k)) = k + 8 continue +c +c update the elements connectivity matrix +c + do 10 nel = 1, nelx + do 9 j=1, node + knod = ijk(j,nel) + ijk(j,nel) = iwk(knod) + 9 continue + 10 continue + return + end +c----------------------------------------------------------------------- + subroutine diric (nx,nint,a,ja,ia, f) +c-------------------------------------------------------------- +c this routine takes into account the boundary conditions +c and removes the unnecessary boundary points. +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension a(*),ia(*),ja(*),f(*) +c call extract from UNARY + call submat (nx,1,1,nint,1,nint,a,ja,ia,nr,nc,a,ja,ia) + write (*,*) 'nr=',nr,'nc=',nc + return +c----------- end of diric ------------------------------------- + end +c----------------------------------------------------------------------- + subroutine symdiric (nx,nint,a,ja,ia, f) +c-------------------------------------------------------------- +c this routine takes into account the boundary conditions +c and removes the unnecessary boundary points. +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension a(*),ia(*),ja(*),f(*) +c call submat from UNARY, with job = 0, +c meaning no movement of real values. + call submat (nx,0,1,nint,1,nint,a,ja,ia,nr,nc,a,ja,ia) + return +c----------- end of symdiric ------------------------------------- + end +c----------------------------------------------------------------------- + subroutine cleannods (nx,x,y,nelx,ijk,node,nodcode,iperm) +c implicit none + integer nx,nelx,node,ijk(node,nelx),nodcode(*),iperm(nx) + real*8 x(nx),y(nx) +c----------------------------------------------------------------------- +c this routine removes the nodes that do not belong to any element +c (spurious points) and relabels the ijk array accordingly. +c----------------------------------------------------------------------- + integer nel,i,k,j,indx +c + do j=1, nx + iperm(j) = 0 + enddo +c + do nel = 1, nelx + do i=1,node + k = ijk(i,nel) + iperm(k) = nel + enddo + enddo +c + indx = 0 + do j =1, nx + if (iperm(j) .ne. 0) then + indx = indx+1 + iperm(indx) = j + x(indx) = x(j) + y(indx) = y(j) + nodcode(indx) = nodcode(j) + endif + enddo +c +c update nx +c + nx = indx +c +c old number to new numbers +c + do j =1, nx + iperm(nx+iperm(j)) = j + enddo +c +c +c change all node numbers in ijk +c + do nel = 1, nelx + do i=1,node + k = ijk(i,nel) + k = iperm(nx+k) + ijk(i,nel) = k + enddo + enddo + return +c----------------------------------------------------------------------- +c-----end-of-cleannod--------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine cleanel (nelx,ijk,node,nodcode,nodexc) +c implicit none + integer nelx,node,nodexc,ijk(node,nelx),nodcode(*) +c----------------------------------------------------------------------- +c this routine remove certain types of elements from the mesh +c An element whose nodes are all labelled by the same label +c nodexc are removed. nelx is changed accordingly on return. +c----------------------------------------------------------------------- + logical exclude + integer nel, i,k + nel = 1 + 1 continue + exclude = .true. + do i=1,node + k = ijk(i,nel) + exclude = (exclude .and. nodcode(k).eq. nodexc) + enddo +c + if (exclude) then + do i=1,node + ijk(i,nel) = ijk(i,nelx) + enddo + nelx = nelx - 1 + else + nel = nel+1 + endif + if (nel .le. nelx) goto 1 + return +c----------------------------------------------------------------------- +c-----end-of-cleanel---------------------------------------------------- + end + + subroutine lstif3(ske, fe, xe, ye, + 1 xyk, funb, func, fung) +c--------------------------------------------------------------------------- +c +c This subroutine computes the local stiffness matrix for the +c Diffusion-Convection Equation with the +c variable cofficients, 'K(x,y), B(x,y), C(x,y) ' +c +c -Div( K(x,y) T(x,y)) + B(x,y) Tx + C(x,y) Ty = G +c +c Here K(x,y) is a 2x2 Matrix, where each entry is a function of x and y. +c +c K, B, C and G need to be supplied by user. +c They need to be defined as externals in the calling routines. +c +c PSI(i,x,y) : i-th shape fucntions on the standard triangle N, i=1, 2, 3 +c where N is the following. +c +c (-1,1) +c . +c . . +c . . +c . . +c . . . . . . (1,-1) +c (-1,-1) +c +c Local stiffness matrix is obtained by integral on the current +c element. To do so, change the current coordinates to N +c by Affine mapping, sending +c +c (xe(1),ye(1)) ---> (-1,-1) +c (xe(2),ye(2)) ---> (1,-1) +c (xe(3),ye(3)) ---> (-1,1) . +c +c Then we perform the integration on N +c by Gaussian Quadrature with 9 points. +c +c--------------------------------------------------------------------------- +c +c on entry +c --------- +c +c xe = x coordinates of the nodes in the current element. +c ye = y coordinates of the nodes in the current element. +c xyk = subroutine defining the function K(x,y). +c funb = function defining the function b(x,y). +c func = function defining the function c(x,y). +c fung = function defining the function g(x,y). +c +c--------------------------------------------------------------------------- +c +c on return +c --------- +c +c ske : Local Stiffness Matrix.( 3x3 in this subroutine.) +c fe : Local Load Vector. +c +c--------------------------------------------------------------------------- + implicit real*8(a-h,o-z) + dimension ske(3,3), fe(3), xe(3), ye(3), dn(3,2), + 1 xyke(2,2), wei(9), gau1(9), gau2(9) + external xyk, funb, func, fung + +c Gau1 and Gau2 are the Gaussian Quadrature Points for the Traingle N, +c and Wei, are the corresponding weights. +c +c They are derived from the 1-D case by Reiterated integrals. +c + data gau1/-0.8, -0.1127016654, 0.5745966692, -0.8872983346, -0.5, + 1 -0.1127016654, -0.9745966692, -0.8872983346, -0.8 / + data gau2/3*-0.7745966692, 3*0., 3*0.7745966692 / + data wei/0.2738575107, 0.4381720172, 0.2738551072, 0.2469135803, + 1 0.3950617284, 0.2469135803, 0.03478446464, + 2 0.05565514341, 0.03478446464 / + + npt = 9 + +c +c Compute the Affine mappings from the current triangle to the +c standard triangle N. Integration will be performed on that +c triangle by Gaussian quadrature. +c +c T = A X + B +c +c A11, A12, A21, A22, B1, B2 will denote the entries of +c A & B. +c + x1 = xe(1) + x2 = xe(2) + x3 = xe(3) + y1 = ye(1) + y2 = ye(2) + y3 = ye(3) + + rj1 = (x3-x1)*(y2-y3) - (x2-x3)*(y3-y1) + rj2 = (x3-x1)*(y1-y2) - (x1-x2)*(y3-y1) + a11 = 2*(y1-y3)/rj1 + a12 = 2*(x3-x1)/rj1 + a21 = 2*(y1-y2)/rj2 + a22 = 2*(x2-x1)/rj2 + b1 = 1. - a11*x2 - a12*y2 + b2 = -1. - a21*x2 - a22*y2 + +c +c Compute the first order partial derivatives of the shape functions. +c dn(i,1) and dn(i,2) are the first order partial derivativ of i-th shape function +c with respect to x and y, respectively. +c + dn(1,1) = -0.5*(a11+a21) + dn(1,2) = -0.5*(a12+a22) + dn(2,1) = 0.5*a11 + dn(2,2) = 0.5*a12 + dn(3,1) = 0.5*a21 + dn(3,2) = 0.5*a22 +c Compute the Jacobian associated with T. + Rja = a11*a22 - a12*a21 +c +c Find the inverse mapping of T +c + + u11 = a22/rja + u12 = -a12/Rja + u21 = -a21/rja + u22 = a11/rja + v1 = -u11*b1 - u12*b2 + v2 = -u21*b1 - u22*b2 + + do 200 i = 1 , 3 + T4 = 0. + do 220 j = 1 , 3 + T1 = 0. + T2 = 0. + T3 = 0. + do 250 k = 1, npt + r = gau1(k) + s = gau2(k) + w = wei(k) + + x = u11*r + u12*s + v1 + y = u21*r + u22*s + v2 + + call xyk(xyke, x, y) + + derv2 = dn(i,1)*dn(j,1)*xyke(1,1) + 1 + dn(i,2)*dn(j,2)*xyke(2,2) + 2 + dn(i,1)*dn(j,2)*xyke(1,2) + 3 + dn(i,2)*dn(j,1)*xyke(2,1) + if(j .eq. 1) then + T4 = T4 + w*fung(x,y)*psi(i,r,s) + endif + + T1 = T1 + w*derv2 + T2 = T2 + w*funb(x,y)*psi(i,r,s) + T3 = T3 + w*func(x,y)*psi(i,r,s) +250 continue + + ske(i,j) = (T1 + T2*dn(j,1) + T3*dn(j,2))/Rja +220 continue + fe(i) = T4/Rja +200 continue + + return + end +c--- end of lstif3 --------------------------------------------------------- +c--------------------------------------------------------------------------- +C Piecewise linear fucntions on triangle. + function psi(i,r,s) + implicit real*8(a-h,o-z) + + goto (100,200,300) ,i + +100 psi = -(r+s)/2. + return +200 psi = (r+1.)/2. + return +300 psi = (s+1.)/2. + return + end diff --git a/MATGEN/FEM/femgen.f b/MATGEN/FEM/femgen.f new file mode 100644 index 0000000..41cf66c --- /dev/null +++ b/MATGEN/FEM/femgen.f @@ -0,0 +1,620 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c MATRIX GENERATION ROUTINES - FINITE ELEMENT MATRICES c +c----------------------------------------------------------------------c +c contents: c +c---------- c +c genfea : generates finite element matrices in assembled form c +c genfea_wbc : generates finite element matrices in assembled form c +c without applying the boundary conditions c +c genfeu : generates finite element matrices in unassembled form c +c genfeu_wbc : generates finite element matrices in unassembled form c +c without applying the boundary conditions c +c genfeu_lstif : generates finite element matrices in unassembled form c +c using the lstif problem appearing in elmtlib2.f c +c assmb1 : assembles an unassembled matrix (produced by genfeu) c +c----------------------------------------------------------------------c + subroutine genfea (nx,nelx,node,job,x,y,ijk,nodcode,fs,nint, + * a,ja,ia,f,iwk,jwk,ierr,xyk) +c----------------------------------------------------------------------- +c this subroutine generates a finite element matrix in assembled form. +c the matrix is assembled in compressed sparse row format. See genfeu +c for matrices in unassembled form. The user must provide the grid, +c (coordinates x, y and connectivity matrix ijk) as well as some +c information on the nodes (nodcode) and the material properties +c (the function K(x,y) above) in the form of a subroutine xyk. +c---------------------------------------------------------------------- +c +c on entry: +c --------- +c +c nx = integer . the number of nodes in the grid . +c nelx = integer . the number of elements in the grid. +c node = integer = the number of nodes per element (should be +c set to three in this version). also the first dimension +c of ijk +c job = integer. If job=0, it is assumed that there is no heat +c source (i.e. fs = 0) and the right hand side +c produced will therefore be a zero vector. +c If job = 1 on entry then the contributions from the +c heat source in each element are taken into account. +c +c x, y = two real arrays containing the coordinates of the nodes. +c +c ijk = an integer array containing the connectivity matrix. +c ijk(i,nel), i=1,2,..node, is the list of the nodes +c constituting the element nel, ans listed in +c counter clockwise order. +c +c nodcode = an integer array containing the boundary information for +c each node with the following meaning. +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner node. [This node and the +c corresponmding element are discarded.] +c +c fs = real array of length nelx on entry containing the heat +c source for each element (job = 1 only) +c +c xyk = subroutine defining the material properties at each +c element. Form: +c call xyk(nel,xyke,x,y,ijk,node) with on return +c xyke = material constant matrices. +c for each element nel, xyke(1,nel),xyke(2,nel) +c and xyke(3,nel) represent the constants +c K11, K22, and K12 at that element. +c +c on return +c --------- +c nint = integer. The number of active (nonboundary) nodes. Also +c equal to the dimension of the assembled matrix. +c +c a, ja, ia = assembled matrix in compressed sparse row format. +c +c f = real array containing the right hand for the linears +c system to solve. +c +c ierr = integer. Error message. If (ierr .ne. 0) on return +c it means that one of the elements has a negative or zero +c area probably because of a bad ordering of the nodes +c (see ijk above). Use the subroutine chkelmt to reorder +c the nodes properly if necessary. +c iwk, jwk = two integer work arrays of length nx each. +c +c----------------------------------------------------------------------- + real*8 a(*),x(*),y(*),f(*),fs(*) + integer ijk(node,*), nodcode(*),ia(*),ja(*),iwk(*),jwk(*) + external xyk, funb, func, fung +c + ierr = 0 +c +c take into boundary conditions to remove boundary nodes. +c + call bound (nx,nelx,ijk,nodcode,node,nint,jwk, + * x,y,f,iwk) +c +c assemble the matrix +c + call assmbo (nx,nelx,node,ijk,nodcode,x,y, + * a,ja,ia,f,iwk,jwk,ierr,xyk, funb, func, fung) +c +c if applicable (job .eq. 1) get heat source function +c + indic = 1 + if (job .eq. 1) + * call hsourc (indic,nx,nelx,node,x,y,ijk,fs,f) +c +c call diric for Dirichlet conditions +c + call diric(nx,nint,a,ja,ia,f) +c done + return +c------end of genfea --------------------------------------------------- +c----------------------------------------------------------------------- + end + subroutine genfea_wbc (nx,nelx,node,job,x,y,ijk,nodcode,fs, + * a,ja,ia,f,iwk,jwk,ierr,xyk) +c----------------------------------------------------------------------- +c this subroutine generates a finite element matrix in assembled form. +c the matrix is assembled in compressed sparse row format. See genfeu +c for matrices in unassembled form. The user must provide the grid, +c (coordinates x, y and connectivity matrix ijk) as well as some +c information on the nodes (nodcode) and the material properties +c (the function K(x,y) above) in the form of a subroutine xyk. +c---------------------------------------------------------------------- +c Irene Moulitsas, moulitsa@cs.umn.edu : It does not apply boundary +c conditions; variable nint is eliminated +c---------------------------------------------------------------------- +c +c on entry: +c --------- +c +c nx = integer . the number of nodes in the grid . +c nelx = integer . the number of elements in the grid. +c node = integer = the number of nodes per element (should be +c set to three in this version). also the first dimension +c of ijk +c job = integer. If job=0, it is assumed that there is no heat +c source (i.e. fs = 0) and the right hand side +c produced will therefore be a zero vector. +c If job = 1 on entry then the contributions from the +c heat source in each element are taken into account. +c +c x, y = two real arrays containing the coordinates of the nodes. +c +c ijk = an integer array containing the connectivity matrix. +c ijk(i,nel), i=1,2,..node, is the list of the nodes +c constituting the element nel, ans listed in +c counter clockwise order. +c +c nodcode = an integer array containing the boundary information for +c each node with the following meaning. +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner node. [This node and the +c corresponmding element are discarded.] +c +c fs = real array of length nelx on entry containing the heat +c source for each element (job = 1 only) +c +c xyk = subroutine defining the material properties at each +c element. Form: +c call xyk(nel,xyke,x,y,ijk,node) with on return +c xyke = material constant matrices. +c for each element nel, xyke(1,nel),xyke(2,nel) +c and xyke(3,nel) represent the constants +c K11, K22, and K12 at that element. +c +c on return +c --------- +c a, ja, ia = assembled matrix in compressed sparse row format. +c +c f = real array containing the right hand for the linears +c system to solve. +c +c ierr = integer. Error message. If (ierr .ne. 0) on return +c it means that one of the elements has a negative or zero +c area probably because of a bad ordering of the nodes +c (see ijk above). Use the subroutine chkelmt to reorder +c the nodes properly if necessary. +c iwk, jwk = two integer work arrays of length nx each. +c +c----------------------------------------------------------------------- + real*8 a(*),x(*),y(*),f(*),fs(*) + integer ijk(node,*), nodcode(*),ia(*),ja(*),iwk(*),jwk(*) + external xyk, funb, func, fung +c + ierr = 0 +c +c assemble the matrix +c + call assmbo (nx,nelx,node,ijk,nodcode,x,y, + * a,ja,ia,f,iwk,jwk,ierr,xyk, funb, func, fung) +c +c if applicable (job .eq. 1) get heat source function +c + indic = 1 + if (job .eq. 1) + * call hsourc (indic,nx,nelx,node,x,y,ijk,fs,f) +c +c done + return +c------end of genfea_wbc ----------------------------------------------- +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine genfeu (nx,nelx,node,job,x,y,ijk,nodcode,fs, + * nint,a,na,f,iwk,jwk,ierr,xyk) +c----------------------------------------------------------------------- +c this subroutine generates finite element matrices for heat +c condution problem +c +c - Div ( K(x,y) Grad u ) = f +c u = 0 on boundary +c +c (with Dirichlet boundary conditions). The matrix is returned +c in unassembled form. The user must provide the grid, +c (coordinates x, y and connectivity matrix ijk) as well as some +c information on the nodes (nodcode) and the material properties +c (the function K(x,y) above) in the form of a subroutine xyk. +c +c---------------------------------------------------------------------- +c +c on entry: +c --------- +c +c nx = integer . the number of nodes in the grid . +c nelx = integer . the number of elements in the grid. +c node = integer = the number of nodes per element (should be +c set to three in this version). also the first dimension +c of ijk +c job = integer. If job=0, it is assumed that there is no heat +c source (i.e. fs = 0) and the right hand side +c produced will therefore be a zero vector. +c If job = 1 on entry then the contributions from the +c heat source in each element are taken into account. +c +c na = integer. The first dimension of the array a. +c a is declared as an array of dimension a(na,node,node). +c +c x, y = two real arrays containing the coordinates of the nodes. +c +c ijk = an integer array containing the connectivity matrix. +c ijk(i,nel), i=1,2,..node, is the list of the nodes +c constituting the element nel, ans listed in +c counter clockwise order. +c +c xyk = subroutine defining the material properties at each +c element. Form: +c call xyk(nel,xyke,x,y,ijk,node) with on return +c xyke = material constant matrices. +c for each element nel, xyke(1,nel),xyke(2,nel) +c and xyke(3,nel) represent the constants +c K11, K22, and K12 at that element. +c +c nodcode = an integer array containing the boundary information for +c each node with the following meaning. +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner node. [This node and the +c corresponmding element are discarded.] +c +c fs = real array of length nelx on entry containing the heat +c source for each element (job = 1 only) +c +c on return +c --------- +c nint = integer. The number of active (nonboundary) nodes. Also +c equal to the dimension of the assembled matrix. +c +c a = matrix in unassembled form. a(nel,*,*) contains the +c element matrix for element nel. +c +c f = real array containing the right hand for the linears +c system to solve, in assembled form. +c +c ierr = integer. Error message. If (ierr .ne. 0) on return +c it means that one of the elements has a negative or zero +c area probably because of a bad ordering of the nodes +c (see ijk above). Use the subroutine chkelmt to reorder +c the nodes properly if necessary. +c iwk, jwk = two integer work arrays of length nx each. +c +c----------------------------------------------------------------------- + real*8 a(na,node,node),x(*),y(*),f(*), fs(*) + integer ijk(node,*), nodcode(*),iwk(*),jwk(*) + external xyk +c + ierr = 0 +c +c take boundary conditions into account to move boundary nodes to +c the end.. +c + call bound (nx,nelx,ijk,nodcode,node,nint,jwk, + * x,y,f,iwk) +c +c assemble the matrix +c + call unassbl (a,na,f,nx,nelx,ijk,nodcode, + * node,x,y,ierr,xyk) +c +c if applicable (job .eq. 1) get heat source function +c + indic = 0 + if (job .eq. 1) + * call hsourc (indic,nx,nelx,node,x,y,ijk,fs,f) +c +c done +c + return + end +c----- end of genfeu ---------------------------------------------------- + subroutine genfeu_wbc (nx,nelx,node,job,x,y,ijk,nodcode,fs, + * a,na,f,iwk,jwk,ierr,xyk) +c----------------------------------------------------------------------- +c this subroutine generates finite element matrices for heat +c condution problem +c +c - Div ( K(x,y) Grad u ) = f +c u = 0 on boundary +c +c (with Dirichlet boundary conditions). The matrix is returned +c in unassembled form. The user must provide the grid, +c (coordinates x, y and connectivity matrix ijk) as well as some +c information on the nodes (nodcode) and the material properties +c (the function K(x,y) above) in the form of a subroutine xyk. +c +c---------------------------------------------------------------------- +c moulitsa@cs : It does not apply boundary conditions +c variable nint is eliminated +c---------------------------------------------------------------------- +c +c on entry: +c --------- +c +c nx = integer . the number of nodes in the grid . +c nelx = integer . the number of elements in the grid. +c node = integer = the number of nodes per element (should be +c set to three in this version). also the first dimension +c of ijk +c job = integer. If job=0, it is assumed that there is no heat +c source (i.e. fs = 0) and the right hand side +c produced will therefore be a zero vector. +c If job = 1 on entry then the contributions from the +c heat source in each element are taken into account. +c +c na = integer. The first dimension of the array a. +c a is declared as an array of dimension a(na,node,node). +c +c x, y = two real arrays containing the coordinates of the nodes. +c +c ijk = an integer array containing the connectivity matrix. +c ijk(i,nel), i=1,2,..node, is the list of the nodes +c constituting the element nel, ans listed in +c counter clockwise order. +c +c xyk = subroutine defining the material properties at each +c element. Form: +c call xyk(nel,xyke,x,y,ijk,node) with on return +c xyke = material constant matrices. +c for each element nel, xyke(1,nel),xyke(2,nel) +c and xyke(3,nel) represent the constants +c K11, K22, and K12 at that element. +c +c nodcode = an integer array containing the boundary information for +c each node with the following meaning. +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner node. [This node and the +c corresponmding element are discarded.] +c +c fs = real array of length nelx on entry containing the heat +c source for each element (job = 1 only) +c +c on return +c --------- +c a = matrix in unassembled form. a(nel,*,*) contains the +c element matrix for element nel. +c +c f = real array containing the right hand for the linears +c system to solve, in assembled form. +c +c ierr = integer. Error message. If (ierr .ne. 0) on return +c it means that one of the elements has a negative or zero +c area probably because of a bad ordering of the nodes +c (see ijk above). Use the subroutine chkelmt to reorder +c the nodes properly if necessary. +c iwk, jwk = two integer work arrays of length nx each. +c +c----------------------------------------------------------------------- + real*8 a(na,node,node),x(*),y(*),f(*), fs(*) + integer ijk(node,*), nodcode(*),iwk(*),jwk(*) + external xyk +c + ierr = 0 +c +c assemble the matrix +c + call unassbl (a,na,f,nx,nelx,ijk,nodcode, + * node,x,y,ierr,xyk) +c +c if applicable (job .eq. 1) get heat source function +c + indic = 0 + if (job .eq. 1) + * call hsourc (indic,nx,nelx,node,x,y,ijk,fs,f) +c +c done +c + return + end +c----- end of genfeu_wbc ----------------------------------------------- + subroutine genfeu_lstif (nx,nelx,node,job,x,y,ijk,nodcode,fs, + * a,na,f,iwk,jwk,ierr,xyk) +c----------------------------------------------------------------------- +c this subroutine generates finite element matrices using unassmbl_lstif. +c The matrix is returned in unassembled form. +c The user must provide the grid, coordinates x, y and connectivity matrix +c ijk) as well as some information on the nodes (nodcode) and the material +c properties (the function K(x,y) above) in the form of a subroutine xyk. +c +c---------------------------------------------------------------------- +c moulitsa@cs.umn.edu : It does not apply boundary conditions +c variable nint is eliminated +c---------------------------------------------------------------------- +c +c on entry: +c --------- +c +c nx = integer . the number of nodes in the grid . +c nelx = integer . the number of elements in the grid. +c node = integer = the number of nodes per element (should be +c set to three in this version). also the first dimension +c of ijk +c job = integer. If job=0, it is assumed that there is no heat +c source (i.e. fs = 0) and the right hand side +c produced will therefore be a zero vector. +c If job = 1 on entry then the contributions from the +c heat source in each element are taken into account. +c +c na = integer. The first dimension of the array a. +c a is declared as an array of dimension a(na,node,node). +c +c x, y = two real arrays containing the coordinates of the nodes. +c +c ijk = an integer array containing the connectivity matrix. +c ijk(i,nel), i=1,2,..node, is the list of the nodes +c constituting the element nel, ans listed in +c counter clockwise order. +c +c xyk = subroutine defining the material properties at each +c element. Form: +c call xyk(nel,xyke,x,y,ijk,node) with on return +c xyke = material constant matrices. +c for each element nel, xyke(1,nel),xyke(2,nel) +c and xyke(3,nel) represent the constants +c K11, K22, and K12 at that element. +c +c nodcode = an integer array containing the boundary information for +c each node with the following meaning. +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner node. [This node and the +c corresponmding element are discarded.] +c +c fs = real array of length nelx on entry containing the heat +c source for each element (job = 1 only) +c +c on return +c --------- +c a = matrix in unassembled form. a(nel,*,*) contains the +c element matrix for element nel. +c +c f = real array containing the right hand for the linears +c system to solve, in assembled form. +c +c ierr = integer. Error message. If (ierr .ne. 0) on return +c it means that one of the elements has a negative or zero +c area probably because of a bad ordering of the nodes +c (see ijk above). Use the subroutine chkelmt to reorder +c the nodes properly if necessary. +c iwk, jwk = two integer work arrays of length nx each. +c +c----------------------------------------------------------------------- + real*8 a(na,node,node),x(*),y(*),f(*), fs(*) + integer ijk(node,*), nodcode(*),iwk(*),jwk(*) + external xyk, funb, func, fung +c + ierr = 0 +c +c assemble the matrix +c + call unassbl_lstif (a,na,f,nx,nelx,ijk,nodcode, + * node,x,y,ierr,xyk,funb,func,fung) +c +c if applicable (job .eq. 1) get heat source function +c + indic = 0 + if (job .eq. 1) + * call hsourc (indic,nx,nelx,node,x,y,ijk,fs,f) +c +c done +c + return + end +c----- end of genfeu_lstif --------------------------------------------- +c----------------------------------------------------------------------- + subroutine assmb1 (u,nu,a,ja,ia,fu,f,nx,nelx,ijk,nodcode, + * node,iwk,jwk) +c-------------------------------------------------------------- +c u = unassembled matrix u(na,node,node) +c nu = 1-st dimension of u +c a,ja,ia= assembled matrix on output +c fu = unassembled right hand side +c f = right hand side (global load vector) assembled +c nx = number of nodes at input +c nelx = number of elements at input +c ijk = connectivity matrix: for node k, ijk(*,k) point to the +c nodes of element k. +c node = total number of nodal points in each element +c +c nodcode= boundary information list for each node with the +c following meaning: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point (corner points +c +c x,y = real*8 arrays containing the $x$ and $y$ coordinates +c resp. of the nodes. +c K11, K22, and K12 at that element. +c iwk,jwk = two integer work arrays. +c ierr = error message integer . +c ierr = 0 --> normal return +c ierr = 1 --> negative area encountered (due to bad +c numbering of nodes of an element- see +c message printed in unit iout). not used.. +c iout = output unit (not used here). +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + real*8 u(nu,node,node),a(*),fu(node,*),f(*) + integer ja(*),ia(*),ijk(node,*),iwk(*),jwk(*),nodcode(*) +c max number of nonzeros per row allowed = 200 +c-------------------------------------------------------------- +c initialize +c-------------------------------------------------------------- + do 100 i=1,nx + f(i) = 0.0d0 + 100 continue +c +c initialize pointer arrays. +c + do 5 k=1,nx+1 + ia(k) = 1 + jwk(k) = 0 + 5 continue + do 6 k=1,nelx + do 59 j=1,node + knod = ijk(j,k) + ia(knod) = ia(knod) + 1 + 59 continue + 6 continue +c--------------------------------------------------- + do 7 k=1, nx + if (nodcode(k) .ge.1 ) ia(k)=ia(k)+1 + 7 continue +c + ksav = ia(1) + ia(1) = 1 + do 101 j=2, nx+1 + ksavn = ia(j) + ia(j) = ia(j-1) + ksav + iwk(j-1) = ia(j-1)-1 + ksav = ksavn + 101 continue +c----------------- +c main loop +c----------------- + do 102 nel=1, nelx +c +c get nodal points +c + do 120 ka=1, node + ii = ijk(ka,nel) + f(ii) = f(ii) + fu(ka,nel) +c +c unpack row into jwk1 +c + irowst = ia(ii) + ilast = iwk(ii) + do 109 k=irowst,ilast + jwk(ja(k)) = k + 109 continue +c + do 108 kb = 1,node +c +c column number = jj +c + jj = ijk(kb,nel) + k = jwk(jj) + if (k .eq. 0) then + ilast = ilast+1 + jwk(jj) = ilast + ja(ilast) = jj + a(ilast) = u(nel,ka,kb) + else + a(k) = a(k) + u(nel,ka,kb) + endif + 108 continue +c refresh jwk + do 119 k=irowst,ilast + jwk(ja(k)) = 0 + 119 continue + iwk(ii) = ilast + 120 continue +c + 102 continue + return +c---------end-of-assmb1---------------------------------------------- + end +c-------------------------------------------------------------------- diff --git a/MATGEN/FEM/functns2.f b/MATGEN/FEM/functns2.f new file mode 100644 index 0000000..090536c --- /dev/null +++ b/MATGEN/FEM/functns2.f @@ -0,0 +1,225 @@ +c----------------------------------------------------------------------- +c contains the functions needed for defining the PDE poroblems. +c +c first for the scalar 5-point and 7-point PDE +c----------------------------------------------------------------------- + function afun (x,y,z) + real*8 afun, x,y,z + afun = -1.0 + return + end + + function bfun (x,y,z) + real*8 bfun, x,y,z + bfun = -1.0 + return + end + + function cfun (x,y,z) + real*8 cfun, x,y,z + cfun = -1.0d0 + return + end + + function dfun (x,y,z) + real*8 dfun, x,y,z + dfun = 10.d0 + return + end + + function efun (x,y,z) + real*8 efun, x,y,z + efun = 0.0d0 + return + end + + function ffun (x,y,z) + real*8 ffun, x,y,z + ffun = 0.0 + return + end + + function gfun (x,y,z) + real*8 gfun, x,y,z + gfun = 0.0 + return + end + + function hfun(x, y, z) + real*8 hfun, x, y, z + hfun = 0.0 + return + end + + function betfun(side, x, y, z) + real*8 betfun, x, y, z + character*2 side + betfun = 1.0 + return + end + + function gamfun(side, x, y, z) + real*8 gamfun, x, y, z + character*2 side + if (side.eq.'x2') then + gamfun = 5.0 + else if (side.eq.'y1') then + gamfun = 2.0 + else if (side.eq.'y2') then + gamfun = 7.0 + else + gamfun = 0.0 + endif + return + end + +c----------------------------------------------------------------------- +c functions for the block PDE's +c----------------------------------------------------------------------- + subroutine afunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + coeff((j-1)*nfree+j) = -1.0d0 + 2 continue + return + end + + subroutine bfunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + coeff((j-1)*nfree+j) = -1.0d0 + 2 continue + return + end + + subroutine cfunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + coeff((j-1)*nfree+j) = -1.0d0 + 2 continue + return + end + + subroutine dfunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + 2 continue + return + end + + subroutine efunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + 2 continue + return + end + + subroutine ffunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + 2 continue + return + end + + subroutine gfunbl (nfree,x,y,z,coeff) + real*8 x, y, z, coeff(100) + do 2 j=1, nfree + do 1 i=1, nfree + coeff((j-1)*nfree+i) = 0.0d0 + 1 continue + 2 continue + return + end +c----------------------------------------------------------------------- +c The material property function xyk for the +c finite element problem +c----------------------------------------------------------------------- +c subroutine xyk(nel,xyke,x,y,ijk,node) +c implicit real*8 (a-h,o-z) +c dimension xyke(2,2), x(*), y(*), ijk(node,*) +cc +cc this is the identity matrix. +cc +c xyke(1,1) = 1.0d0 +c xyke(2,2) = 1.0d0 +c xyke(1,2) = 0.0d0 +c xyke(2,1) = 0.0d0 +cc +c return +c end +c + subroutine xyk (xyke, x, y) + implicit real*8(a-h,o-z) + dimension xyke(2,2) + + xyke(1,1) = 1. + xyke(1,1) = exp(x+y) + xyke(1,2) = 0. + xyke(2,1) = 0. + xyke(2,2) = 1. + xyke(2,2) = exp(x+y) + return + end + + function funb(x,y) + implicit real*8(a-h,o-z) + + funb = 0. + funb = 2.5 + funb = 2*x + return + end + + function func(x,y) + implicit real*8(a-h,o-z) + + func = 0. + func = -1.5 + func = -5*y + return + end + + function fung(x,y) +c Right hand side corresponding to the exact solution of +c u = exp(x+y)*x*(1.-x)*y*(1.-y) +c (That exact solution is defined in the function exact) + implicit real*8(a-h,o-z) + +c fung = 1. + x +c fung = 2*y*(1.-y) + 2*x*(1.-x) +c fung = 2*y*(1.-y) + 2*x*(1.-x) +2.5*(1-2*x)*y*(1-y) +c 1 - 1.5*(1.-2*y)*x*(1-x) + r = exp(x+y) + fung = r*r*((x*x+3.*x)*y*(1.-y) + + 1 (y*y+3.*y)*x*(1.-x)) + 2 + r*(r-2.*x)*(x*x+x-1.)*y*(1.-y) + 3 + r*(r+5.*y)*(y*y+y-1.)*x*(1.-x) + return + end + + function exact(x,y) +C Exact Solution. + implicit real*8(a-h,o-z) + + exact = exp(x+y)*x*(1.-x)*y*(1.-y) + + return + end diff --git a/MATGEN/FEM/makefile b/MATGEN/FEM/makefile new file mode 100644 index 0000000..2bc6e21 --- /dev/null +++ b/MATGEN/FEM/makefile @@ -0,0 +1,20 @@ +FFLAGS = +F77 = f77 + +#F77 = cf77 +#FFLAGS = -Wf"-dp" + +FILES = convdif.o functns2.o + +fem.ex: $(FILES) ../../UNSUPP/PLOTS/psgrd.o ../../libskit32.a + $(F77) $(FFLAGS) -o fem.ex $(FILES) ../../UNSUPP/PLOTS/psgrd.o ../../libskit32.a + +clean: + rm -f *.o *.ex core *.trace + +../../libskit.a: + (cd ../..; $(MAKE) $(MAKEFLAGS) libskit.a) + +../../UNSUPP/PLOTS/psgrd.o: ../../UNSUPP/PLOTS/psgrd.f + (cd ../../UNSUPP/PLOTS; $(F77) $(FFLAGS) -c psgrd.f) + diff --git a/MATGEN/FEM/mat.hb b/MATGEN/FEM/mat.hb new file mode 100644 index 0000000..1444ca1 --- /dev/null +++ b/MATGEN/FEM/mat.hb @@ -0,0 +1,513 @@ +1Sample matrix from SPARSKIT SPARSKIT + 509 19 92 398 0 +rua 369 369 2385 0 +(20I4) (26I3) (6D12.6) (6D12.6) + 1 5 9 13 18 25 28 32 40 43 47 51 55 62 69 74 79 86 91 98 + 103 108 115 122 127 132 139 144 151 156 163 168 173 178 185 192 199 206 213 220 + 227 234 241 248 255 262 269 276 283 290 297 304 311 318 325 332 339 346 353 360 + 367 374 381 388 395 400 407 414 419 426 431 438 443 450 455 462 467 474 479 484 + 489 494 501 506 513 520 525 532 537 542 547 554 559 566 571 578 583 590 597 602 + 609 614 619 624 629 634 641 648 655 662 669 676 683 690 697 704 711 718 725 732 + 739 746 753 760 767 774 781 788 795 802 809 816 823 830 837 844 851 858 865 872 + 879 886 893 900 907 914 921 928 935 942 949 956 963 970 977 984 991 99810051012 +10191026103310401047105410611068107510821089109611031110111711241131113811451152 +11591166117311801187119412011208121512221229123612431250125712641271127812851292 +12991306131313201327133413411348135513621369137613831390139714041411141814251432 +14391446145314601467147414811488149515021509151615231530153715441551155815651572 +15791586159316001607161416211628163516421649165616631670167716841691169817051712 +17191726173317401747175417611768177517821789179618031810181718241831183818451852 +18591866187318801887189419011906191319181925193219391946195119581963197019751980 +19871992199920042011201820232028203520402047205220592066207120762081208620912096 +21012106211321182125213021372144215121582163217021752182218721922197220222072212 +22192226223122382243225022552260226722742279228622912298230523122317232423292336 +2341234623512356236123662371237623812386 + 1286287298 2300301306 3308309316 4294295322323 5290291304312314334 6318 +319 7330331338 8326327336340348354362 9364365 10342343346 11350351360 12356 +357368 13226227236237288293 14228229256257292297 15230231289296 16232233299303 + 17234235242243302305 18238239307311 19240241244245310313 20246247317321 21248 +249315320 22250251260261324329 23252253262263328333 24254255325332 25258259335 +337 26264265268269341345 27266267339344 28270271278279349353 29272273347352 30 +274275284285355359 31276277358361 32280281363367 33282283366369 34106108140139 +226229 35107106143142228231 36108107137136227230 37109111149148232235 38110109 +152151234237 39111110146145233236 40112114158157238241 41113112161160240243 42 +114113155154239242 43115117167166244247 44116115170169246249 45117116164163245 +248 46118120176175250253 47119118179178252255 48120119173172251254 49121123185 +184256259 50122121188187258261 51123122182181257260 52124126194193262265 53125 +124197196264267 54126125191190263266 55127129203202268271 56128127206205270273 + 57129128200199269272 58130132212211274277 59131130215214276279 60132131209208 +275278 61133135221220280283 62134133224223282285 63135134218217281284 64136138 +147146286288 65138137287289 66139141186185290292 67141140151153291293 68142144 +294296 69144143181183295297 70145147298299 71148150156155300302 72150149301303 + 73153152160162304305 74154156306307 75157159168167308310 76159158309311 77162 +161163165312313 78165164314315 79166168316317 80169171318320 81171170319321 82 +172174183182322324 83174173323325 84175177195194326328 85177176187189327329 86 +178180330332 87180179190192331333 88184186334335 89189188336337 90192191338339 + 91193195204203340341 92196198342344 93198197199201343345 94201200346347 95202 +204210209348349 96205207350352 97207206214216351353 98208210219218354355 99211 +213356358100213212223225357359101216215360361102217219362363103220222364366104 +222221365367105225224368369106107108228229 34 35106107108230231 35 36106107108 +226227 34 36109110111234235 37 38109110111236237 38 39109110111232233 37 39112 +113114240241 40 41112113114242243 41 42112113114238239 40 42115116117246247 43 + 44115116117248249 44 45115116117244245 43 45118119120252253 46 47118119120254 +255 47 48118119120250251 46 48121122123258259 49 50121122123260261 50 51121122 +123256257 49 51124125126264265 52 53124125126266267 53 54124125126262263 52 54 +127128129270271 55 56127128129272273 56 57127128129268269 55 57130131132276277 + 58 59130131132278279 59 60130131132274275 58 60133134135282283 61 62133134135 +284285 62 63133134135280281 61 63136137138227288 64 36136137138289230 36 65136 +137138286287 64 65139140141229292 66 34139140141293226 34 67139140141290291 66 + 67142143144231296 68 35142143144297228 35 69142143144294295 68 69145146147233 +299 70 39145146147288236 39 64145146147298286 70 64148149150235302 71 37148149 +150303232 37 72148149150300301 71 72151152153237293 67 38151152153305234 38 73 +151152153291304 67 73154155156239307 74 42154155156302242 42 71154155156306300 + 74 71157158159241310 75 40157158159311238 40 76157158159308309 75 76160161162 +243305 73 41160161162313240 41 77160161162304312 73 77163164165245313 77 45163 +164165315248 45 78163164165312314 77 78166167168247317 79 43166167168310244 43 + 75166167168316308 79 75169170171249320 80 44169170171321246 44 81169170171318 +319 80 81172173174251324 82 48172173174325254 48 83172173174322323 82 83175176 +177253328 84 46175176177329250 46 85175176177326327 84 85178179180255332 86 47 +178179180333252 47 87178179180330331 86 87181182183257297 69 51181182183324260 + 51 82181182183295322 69 82184185186259335 88 49184185186292256 49 66184185186 +334290 88 66187188189261329 85 50187188189337258 50 89187188189327336 85 89190 +191192263333 87 54190191192339266 54 90190191192331338 87 90193194195265341 91 + 52193194195328262 52 84193194195340326 91 84196197198267344 92 53196197198345 +264 53 93196197198342343 92 93199200201269345 93 57199200201347272 57 94199200 +201343346 93 94202203204271349 95 55202203204341268 55 91202203204348340 95 91 +205206207273352 96 56205206207353270 56 97205206207350351 96 97208209210275355 + 98 60208209210349278 60 95208209210354348 98 95211212213277358 99 58211212213 +359274 58100211212213356357 99100214215216279353 97 59214215216361276 59101214 +215216351360 97101217218219281363102 63217218219355284 63 98217218219362354102 + 98220221222283366103 61220221222367280 61104220221222364365103104223224225285 +359100 62223224225369282 62105223224225357368100105226108227293140 13 34226108 +227136288 13 36228106229297143 14 35228106229139292 14 34230107231289137 15 36 +230107231142296 15 35232111233303149 16 37232111233145299 16 39234109235305152 + 17 38234109235148302 17 37236110237288146 13 39236110237151293 13 38238114239 +311158 18 40238114239154307 18 42240112241313161 19 41240112241157310 19 40242 +113243302155 17 42242113243160305 17 41244117245310167 19 43244117245163313 19 + 45246115247321170 20 44246115247166317 20 43248116249315164 21 45248116249169 +320 21 44250120251329176 22 46250120251172324 22 48252118253333179 23 47252118 +253175328 23 46254119255325173 24 48254119255178332 24 47256123257292185 14 49 +256123257181297 14 51258121259337188 25 50258121259184335 25 49260122261324182 + 22 51260122261187329 22 50262126263328194 23 52262126263190333 23 54264124265 +345197 26 53264124265193341 26 52266125267339191 27 54266125267196344 27 53268 +129269341203 26 55268129269199345 26 57270127271353206 28 56270127271202349 28 + 55272128273347200 29 57272128273205352 29 56274132275359212 30 58274132275208 +355 30 60276130277361215 31 59276130277211358 31 58278131279349209 28 60278131 +279214353 28 59280135281367221 32 61280135281217363 32 63282133283369224 33 62 +282133283220366 33 61284134285355218 30 63284134285223359 30 62286138287298147 + 1 64286138287 1 65227136288146236 13 64289137230 15 65290141291334186 5 66 +290141291153304 5 67229139292185256 14 66293140226237151 13 67294144295 4 68 +294144295183322 4 69231142296 15 68297143228257181 14 69298147286 1 70233145 +299 16 70300150301306156 2 71300150301 2 72235148302155242 17 71303149232 16 + 72291153304162312 5 73305152234243160 17 73306156300 2 74239154307 18 74308 +159309316168 3 75308159309 3 76241157310167244 19 75311158238 18 76304162312 +165314 5 77313161240245163 19 77312165314 5 78315164248 21 78316168308 3 79 +247166317 20 79318171319 6 80318171319 6 81249169320 21 80321170246 20 81322 +174323295183 4 82322174323 4 83251172324182260 22 82325173254 24 83326177327 +340195 8 84326177327189336 8 85253175328194262 23 84329176250261187 22 85330 +180331 7 86330180331192338 7 87255178332 24 86333179252263190 23 87334186290 + 5 88259184335 25 88327189336 8 89337188258 25 89331192338 7 90339191266 27 + 90340195326348204 8 91265193341203268 26 91342198343 10 92342198343201346 10 + 93267196344 27 92345197264269199 26 93343201346 10 94347200272 29 94348204340 +354210 8 95271202349209278 28 95350207351 11 96350207351216360 11 97273205352 + 29 96353206270279214 28 97354210348362219 8 98275208355218284 30 98356213357 + 12 99356213357225368 12100277211358 31 99359212274285223 30100351216360 11101 +361215276 31101362219354 8102281217363 32102364222365 9103364222365 9104283 +220366 33103367221280 32104357225368 12105369224282 33105 +0.113853E+01-.195313E-02-.575124E+00-.561452E+000.422461E+01-.138777E+01 +-.140127E+01-.143557E+010.109521E+02-.363284E+01-.354984E+01-.376946E+01 +0.581191E+01-.126000E+01-.279169E+01-.106120E+00-.165409E+010.212429E+02 +-.714433E+010.605469E-01-.309815E+01-.345169E+01-.380250E+01-.380676E+01 +0.116662E+02-.587421E+01-.579202E+010.154372E+02-.349426E+01-.771406E+01 +-.422891E+010.596294E+02-.185829E+020.164713E+00-.863206E+01-.251953E+00 +-.107769E+02-.109829E+02-.105675E+020.332621E+02-.166681E+02-.165940E+02 +0.198031E+02-.933238E+010.310547E+00-.107813E+020.760070E+02-.251677E+02 +-.246854E+02-.261539E+020.779786E+02-.263571E+02-.261276E+02-.254939E+02 +0.109416E+02-.303909E+01-.264850E+01-.244798E+01-.280211E+010.292969E-01 +-.332031E-010.180320E+020.813802E-01-.400577E+01-.852864E-01-.502651E+01 +-.463328E+01-.436254E+010.352740E+01-.170153E+01-.540364E-01-.776606E+00 +-.995235E+000.352740E+010.188802E-01-.179267E+01-.844965E+00-.908646E+00 +0.177179E+02-.435213E+010.846354E-02-.439768E+01-.473607E+01-.189173E+01 +-.234874E+010.915553E+01-.315755E-01-.457737E+01-.216269E+01-.238390E+01 +0.292905E+02-.698365E+010.725911E-01-.761003E+01-.767969E+01-.345430E+01 +-.363545E+010.186563E+02-.708008E-01-.921896E+01-.451251E+01-.485402E+01 +0.184896E+02-.912196E+010.776367E-01-.457647E+01-.486883E+010.297222E+02 +-.823563E+01-.715474E+01-.664173E+01-.768616E+010.133463E+00-.137370E+00 +0.484203E+020.185547E+00-.110552E+02-.133835E+02-.231120E+00-.126784E+02 +-.112576E+020.957841E+01-.462286E+01-.158203E+00-.209077E+01-.270658E+01 +0.230525E+02-.117141E+020.112630E+00-.519240E+01-.625868E+010.805632E+02 +-.186550E+02-.183919E+02-.216064E+02-.219059E+020.279297E+00-.283203E+00 +0.254511E+020.258463E+00-.132299E+02-.559257E+01-.688712E+010.132081E+03 +-.304036E+00-.309451E+02-.329645E+02-.353405E+02-.148767E+02-.176501E+02 +0.630204E+02-.305362E+020.331380E+00-.152600E+02-.175555E+020.133373E+03 +-.239909E+00-.333526E+02-.318650E+02-.340234E+02-.158228E+02-.180697E+02 +0.103485E+03-.512571E+020.280924E+00-.261435E+02-.263649E+020.534711E+02 +-.786133E-01-.268678E+02-.129251E+02-.135996E+020.825567E+02-.414242E+02 +0.854492E-01-.198324E+02-.213854E+020.140459E+02-.340219E+010.553385E-01 +-.360060E+01-.592448E-01-.312354E+01-.391571E+010.109416E+02-.240631E+01 +-.279690E+01-.308076E+01-.265371E+01-.696614E-010.657552E-010.852390E+01 +-.436198E-01-.238653E+010.397135E-01-.189170E+01-.218080E+01-.206097E+01 +0.109416E+02-.299742E+01-.264329E+01-.248964E+01-.280732E+01-.716146E-02 +0.325521E-020.140459E+020.188802E-01-.316521E+01-.227865E-01-.387404E+01 +-.360581E+01-.339698E+010.852390E+01-.218601E+01-.716146E-02-.205576E+01 +0.325521E-02-.193337E+01-.234486E+010.230692E+02-.586496E+01-.546024E+01 +-.565662E+01-.607634E+010.465495E-01-.576172E-010.230692E+020.595703E-01 +-.565793E+01-.706380E-01-.586365E+01-.609066E+01-.544592E+010.179676E+02 +-.472175E+01-.445963E-01-.426237E+010.335286E-01-.439638E+01-.457606E+01 +0.335163E+02-.869232E+01-.681966E-01-.806989E+010.672200E-01-.813304E+01 +-.862006E+010.379785E+02-.920724E+01-.913758E+01-.977698E+01-.985576E+01 +0.737304E-01-.747070E-010.335163E+020.711263E-01-.863178E+01-.721028E-01 +-.812132E+01-.805426E+01-.870795E+010.381607E+02-.915874E+010.159505E+00 +-.990143E+01-.163411E+00-.856759E+01-.105290E+020.297222E+02-.660006E+01 +-.768095E+01-.827730E+01-.715995E+01-.173828E+000.169922E+000.231502E+02 +-.147786E+00-.647968E+010.143880E+00-.511171E+01-.596146E+01-.559348E+01 +0.297222E+02-.819397E+01-.714954E+01-.668339E+01-.769137E+010.970052E-01 +-.100911E+000.381607E+020.123047E+00-.860926E+01-.126953E+00-.104874E+02 +-.990663E+01-.915353E+010.231502E+02-.596666E+01-.111328E+00-.558827E+01 +0.107422E+00-.515338E+01-.643802E+010.627452E+02-.257161E+00-.145046E+02 +0.253255E+00-.168479E+02-.142676E+02-.171213E+020.627452E+02-.142051E+02 +0.268880E+00-.171838E+02-.272786E+00-.168947E+02-.144577E+020.488686E+02 +-.131830E+02-.134460E+02-.112311E+02-.110046E+020.242838E+00-.246745E+00 +0.103442E+03-.279722E+02-.293620E+00-.237650E+020.289713E+00-.240385E+02 +-.276623E+020.132819E+03-.308982E+02-.305987E+02-.354909E+02-.358269E+02 +0.315755E+00-.319661E+000.103442E+030.305338E+00-.277091E+02-.309245E+00 +-.239916E+02-.237025E+02-.280347E+020.170422E+03-.427835E+02-.399174E+02 +-.423668E+02-.453437E+020.254883E+00-.265950E+000.170422E+030.267904E+00 +-.423681E+02-.278971E+00-.427822E+02-.453580E+02-.399031E+020.132726E+03 +-.353262E+02-.252930E+00-.310746E+020.241862E+00-.329632E+02-.333513E+02 +0.132637E+03-.344472E+02-.322889E+02-.318755E+02-.340247E+020.815429E-01 +-.825195E-010.150297E+030.880534E-01-.361395E+02-.890299E-01-.390131E+02 +-.385711E+02-.365725E+020.117052E+03-.300119E+02-.851237E-01-.285091E+02 +0.841471E-01-.281035E+02-.304266E+020.664102E+01-.183434E+01-.159359E+01 +-.150244E+01-.170674E+010.136719E-01-.175781E-010.274844E+01-.133809E+01 +-.279948E-01-.620062E+00-.762297E+000.231502E+020.709635E-01-.519505E+01 +-.748698E-01-.639635E+01-.597187E+01-.558307E+010.180320E+02-.498484E+01 +-.435734E+01-.404744E+01-.463849E+01-.488281E-010.449219E-010.452761E+01 +-.217559E+01-.800781E-01-.128694E+01-.985008E+000.140459E+020.917968E-01 +-.308187E+01-.957031E-01-.395737E+01-.340739E+01-.359539E+010.274844E+01 +0.846354E-02-.139278E+01-.651963E+00-.712167E+000.138007E+02-.339177E+01 +-.175781E-01-.341806E+01-.366708E+01-.149280E+01-.181336E+010.452761E+01 +0.292969E-01-.230319E+01-.116389E+01-.108983E+010.227477E+02-.557786E+01 +0.345052E-01-.565923E+01-.610498E+01-.302509E+01-.241507E+010.713003E+01 +-.185547E-01-.357041E+01-.169095E+01-.185012E+010.292905E+02-.699797E+01 +0.595703E-01-.759831E+01-.766407E+01-.345560E+01-.363414E+010.117511E+02 +-.445963E-01-.586626E+01-.307075E+01-.276953E+010.292905E+02-.696933E+01 +0.856120E-01-.762175E+01-.769532E+01-.363675E+01-.345299E+010.163050E+02 +-.803864E+010.750325E-01-.403914E+01-.430222E+010.164716E+02-.642903E-01 +-.814476E+01-.398429E+01-.427830E+010.209652E+02-.103492E+020.802409E-01 +-.551123E+01-.518500E+010.211318E+02-.773112E-01-.104371E+02-.550554E+01 +-.511193E+010.180320E+02-.506818E+01-.436775E+01-.396411E+01-.462807E+01 +0.117838E+00-.121745E+000.746097E+01-.359019E+01-.132161E+00-.162049E+01 +-.211813E+010.621696E+020.175130E+00-.143059E+02-.170588E+02-.241536E+00 +-.162711E+02-.144674E+020.489960E+02-.134173E+02-.117193E+02-.110969E+02 +-.127585E+02-.152995E+000.149088E+000.122973E+02-.595625E+01-.184245E+00 +-.345476E+01-.270201E+010.377124E+020.195963E+00-.852593E+01-.105235E+02 +-.220703E+00-.875324E+01-.988495E+010.179731E+02-.914832E+010.865885E-01 +-.402784E+01-.488351E+010.295747E+02-.150012E+020.138672E+00-.801704E+01 +-.669513E+010.198226E+020.232422E+00-.103334E+02-.432566E+01-.539598E+01 +0.805632E+02-.187018E+02-.184544E+02-.215596E+02-.218434E+020.263672E+00 +-.267578E+000.326782E+020.284505E+00-.169416E+02-.879439E+01-.722671E+01 +0.805632E+02-.186081E+02-.183294E+02-.216533E+02-.219684E+02-.298828E+00 +0.294922E+000.489434E+02-.236400E+020.320963E+00-.118784E+02-.137459E+02 +0.102867E+03-.277995E+00-.240853E+02-.256429E+02-.275249E+02-.115446E+02 +-.137910E+020.810956E+02-.393881E+020.341797E+00-.224502E+02-.195991E+02 +0.169593E+03-.330078E+00-.397605E+02-.423694E+02-.453723E+02-.225942E+02 +-.191663E+020.103872E+03-.226888E+00-.260036E+02-.247751E+02-.264713E+02 +-.123095E+02-.140858E+020.103503E+03-.512715E+020.267904E+00-.261383E+02 +-.263610E+020.171253E+03-.252930E+00-.427848E+02-.409731E+02-.437237E+02 +-.231847E+02-.203343E+020.103466E+03-.512428E+020.293945E+00-.263688E+02 +-.261487E+020.472127E+02-.812174E-01-.237360E+02-.114068E+02-.119888E+02 +0.728635E+02-.365712E+020.789388E-01-.174914E+02-.188799E+020.605627E+02 +-.760091E-01-.304162E+02-.154253E+02-.146452E+020.935404E+02-.469226E+02 +0.919596E-01-.242237E+02-.224861E+020.123969E+020.605469E-01-.274222E+01 +-.347250E+01-.644531E-01-.317302E+01-.300524E+01-.566405E-010.965729E+01 +-.246881E+010.527342E-01-.233965E+01-.271360E+01-.213132E+01-.305992E+01 +-.265110E+010.109416E+02-.279951E+01-.242714E+01-.514321E-010.475259E-01 +0.123969E+02-.299742E+010.585945E-02-.976560E-02-.318083E+01-.280472E+01 +-.341000E+01-.280472E+010.109416E+02-.246881E+01-.264589E+01-.301826E+01 +-.149739E-010.110676E-01-.195312E-02-.265110E+010.965729E+01-.219382E+01 +-.195306E-02-.247662E+01-.233184E+010.230692E+02-.545308E+010.530599E-01 +-.641274E-01-.608350E+01-.565727E+01-.586431E+01-.536389E+010.203592E+02 +-.498737E+01-.481680E+01-.518008E+01-.576170E-010.465493E-01-.511067E-01 +-.518073E+010.203592E+02-.498672E+010.400391E-01-.535673E+01-.482396E+01 +0.356777E+02-.714518E-01-.865326E+01-.918055E+010.704751E-01-.858685E+01 +-.925607E+010.724282E-010.356777E+02-.857904E+01-.734047E-01-.926388E+01 +-.918641E+01-.864740E+01-.862592E+01-.870014E+010.335163E+02-.806208E+01 +-.812718E+010.691731E-01-.701496E-010.336781E+020.164713E+00-.752209E+01 +-.933322E+01-.168620E+00-.872124E+01-.809761E+01-.160807E+000.262311E+02 +-.676672E+010.156901E+00-.632864E+01-.732402E+01-.580781E+01-.825647E+01 +-.715735E+010.297222E+02-.768355E+01-.662089E+01-.155598E+000.151692E+00 +0.336781E+02-.808980E+010.110026E+00-.113932E+00-.872905E+01-.758459E+01 +-.927072E+01-.768876E+010.297222E+02-.666256E+01-.715214E+01-.821480E+01 +-.119140E+000.115234E+00-.106120E+00-.726152E+010.262311E+02-.587031E+01 +0.102214E+00-.677454E+01-.632083E+010.627452E+02-.144811E+02-.142363E+02 +-.171526E+02-.168713E+020.261068E+00-.264974E+00-.149238E+020.553739E+02 +0.255859E+00-.127429E+02-.259765E+00-.151999E+02-.125033E+02-.151686E+02 +-.251952E+000.553739E+020.248046E+00-.125346E+02-.149004E+02-.127663E+02 +0.117213E+03-.306641E+00-.272534E+02-.313331E+020.302734E+00-.269670E+02 +-.316560E+020.310546E+000.117213E+03-.269357E+02-.314452E+00-.316873E+02 +-.313565E+02-.272300E+02-.276857E+02-.280034E+020.103442E+03-.237338E+02 +-.240150E+020.297526E+00-.301432E+000.170422E+03-.399103E+020.261393E+00 +-.272460E+00-.453508E+02-.423674E+02-.427828E+02-.400294E+020.150398E+03 +-.373717E+02-.352129E+02-.377728E+02-.265950E+000.254882E+00-.259440E+00 +-.377734E+020.150398E+03-.373711E+020.248372E+00-.400223E+02-.352201E+02 +0.141191E+03-.343639E+020.847982E-01-.857745E-01-.362268E+02-.339407E+02 +-.366591E+02-.340240E+020.132637E+03-.318702E+02-.322895E+02-.344524E+02 +-.870765E-010.860999E-01-.838216E-01-.323742E+020.124601E+03-.299305E+02 +0.828451E-01-.319555E+02-.303400E+020.752370E+01-.181351E+010.266927E-01 +-.305989E-01-.192816E+01-.168330E+01-.209483E+01-.170413E+010.664102E+01 +-.148161E+01-.159619E+01-.185517E+01-.358072E-010.319009E-01-.227864E-01 +-.162224E+010.586205E+01-.132507E+010.188802E-01-.151026E+01-.140059E+01 +0.180320E+02-.402661E+01-.463589E+01-.435994E+01-.500568E+01-.670570E-01 +0.631508E-01-.441723E+010.159146E+02-.540365E-01-.355633E+010.501303E-01 +-.385060E+01-.408650E+01-.493276E+010.579428E-010.204314E+02-.618488E-01 +-.526275E+01-.564817E+01-.458380E+010.965729E+01-.748698E-01-.273443E+01 +-.211049E+010.709635E-01-.234226E+01-.246621E+010.787758E-010.123969E+02 +-.300784E+01-.826821E-01-.317042E+01-.272138E+01-.349333E+01-.238548E+01 +-.279430E+010.109416E+02-.265631E+01-.310159E+010.839841E-01-.878904E-01 +0.664102E+01-.181351E+01-.159099E+01-.170934E+01-.152328E+01-.455732E-02 +0.651076E-03-.170413E+010.752370E+010.846358E-02-.207399E+01-.123698E-01 +-.193076E+01-.181090E+01-.151286E+01-.455731E-020.586205E+010.651036E-03 +-.139798E+01-.134590E+01-.160140E+010.123969E+02-.123698E-01-.282555E+01 +-.338917E+010.846345E-02-.318344E+01-.299482E+010.162760E-010.965729E+01 +-.247923E+01-.201822E-01-.232924E+01-.263027E+01-.221465E+01-.297659E+01 +-.264068E+010.109416E+02-.280992E+01-.251048E+010.214844E-01-.253906E-01 +0.159146E+02-.408911E+01-.358074E-010.319009E-01-.384800E+01-.439640E+01 +-.357716E+01-.435473E+010.180320E+02-.496401E+01-.464109E+01-.406827E+01 +0.266925E-01-.305988E-010.397135E-01-.460464E+010.204314E+02-.562734E+01 +-.436199E-01-.493016E+01-.526536E+010.158571E+02-.404226E+01-.377385E+01 +-.415430E+01-.387559E+010.205077E-01-.315754E-01-.387624E+010.158571E+02 +0.270182E-01-.404160E+01-.380859E-01-.416146E+01-.376669E+01-.365992E+01 +-.250651E-010.139945E+020.139973E-01-.333634E+01-.341741E+01-.356976E+01 +0.261401E+020.530599E-01-.641668E+01-.663933E+01-.641276E-01-.689185E+01 +-.618116E+01-.511066E-010.230692E+02-.606918E+010.400389E-01-.546741E+01 +-.586561E+01-.565597E+01-.663998E+01-.618832E+010.261401E+02-.688469E+01 +-.641603E+01-.576170E-010.465493E-010.230692E+02-.609782E+01-.771484E-01 +0.660805E-01-.543876E+01-.586300E+01-.565858E+01-.615967E+010.261401E+02 +-.663738E+01-.691334E+01-.641863E+010.725910E-01-.836587E-010.791015E-01 +-.641928E+010.261401E+02-.663673E+01-.901692E-01-.615251E+01-.692050E+01 +0.314858E+02-.818577E+01-.708006E-010.698240E-01-.756120E+01-.762696E+01 +-.811091E+01-.804645E+010.335163E+02-.811546E+01-.871576E+01-.863764E+01 +0.730793E-01-.740559E-010.717773E-01-.811676E+010.314858E+02-.762110E+01 +-.727538E-01-.755339E+01-.819359E+010.335163E+02-.813890E+01-.807770E+01 +-.868451E+01-.861420E+010.652668E-01-.662434E-01-.809333E+010.314858E+02 +0.639647E-01-.764454E+01-.649413E-01-.816234E+01-.758464E+01-.815452E+01 +-.629882E-010.314858E+020.620115E-01-.759245E+01-.808747E+01-.765040E+01 +0.404278E+020.769856E-01-.104117E+02-.979716E+01-.779621E-01-.104937E+02 +-.972425E+01-.760089E-010.404278E+02-.104859E+020.750323E-01-.973206E+01 +-.980302E+01-.104058E+02-.104312E+02-.103570E+020.430349E+02-.111646E+02 +-.110812E+02-.792642E-010.782877E-010.204314E+02-.494318E+010.130859E+00 +-.134765E+00-.525234E+01-.450047E+01-.573150E+01-.462547E+010.180320E+02 +-.394327E+01-.437036E+01-.508901E+01-.139974E+000.136067E+00-.126953E+00 +-.450057E+010.159146E+02-.347300E+010.123047E+00-.407609E+01-.386102E+01 +0.489960E+02-.110761E+02-.127559E+02-.117219E+02-.134382E+02-.171223E+00 +0.167317E+00-.118834E+020.432402E+02-.158203E+00-.975299E+010.154297E+00 +-.103598E+02-.112401E+02-.132611E+020.162109E+000.555181E+02-.166015E+00 +-.144778E+02-.151757E+02-.125996E+020.262311E+02-.179036E+00-.734485E+01 +-.578698E+010.175130E+00-.633125E+01-.676412E+010.182942E+000.336781E+02 +-.810022E+01-.186848E+00-.871863E+01-.750126E+01-.935405E+01-.657922E+01 +-.767834E+010.297222E+02-.716256E+01-.829813E+010.188150E+00-.192057E+00 +0.180320E+02-.504734E+01-.436515E+01-.463068E+01-.398494E+010.996091E-01 +-.103515E+00-.452130E+010.204314E+020.112630E+00-.571067E+01-.116536E+00 +-.525494E+01-.494057E+01-.407869E+01-.108724E+000.159146E+020.104817E+00 +-.385841E+01-.349383E+01-.447973E+010.336781E+020.917968E-01-.760543E+01 +-.924988E+01-.957032E-01-.873165E+01-.808720E+01-.878904E-010.262311E+02 +-.677714E+010.839841E-01-.631823E+01-.724068E+01-.589114E+01-.817314E+01 +-.714693E+010.297222E+02-.769397E+01-.670422E+01-.826820E-010.787757E-01 +0.432402E+02-.112427E+02-.139974E+000.136067E+00-.103572E+02-.118625E+02 +-.977382E+01-.117167E+020.489960E+02-.133965E+02-.127611E+02-.111177E+02 +0.130859E+00-.134765E+000.143880E+00-.126205E+020.555181E+02-.151549E+02 +-.147786E+00-.132585E+02-.144804E+020.431278E+02-.233724E+00-.989852E+01 +-.116452E+020.229817E+00-.968498E+01-.118952E+020.237630E+000.431278E+02 +-.965373E+01-.241536E+00-.119264E+02-.116686E+02-.987509E+01-.103100E+02 +-.105548E+020.380615E+02-.849226E+01-.870060E+010.224609E+00-.228516E+00 +0.710981E+02-.162307E+020.258463E+00-.262369E+00-.193347E+02-.190560E+02 +-.164729E+02-.170901E+020.627452E+02-.168244E+02-.142988E+02-.145280E+02 +-.249349E+000.245443E+00-.254557E+00-.164963E+020.710981E+02-.190326E+02 +0.250650E+00-.193034E+02-.162619E+020.627452E+02-.169182E+02-.172151E+02 +-.141738E+02-.144343E+02-.280599E+000.276693E+00-.164026E+020.710981E+02 +-.285807E+00-.191263E+020.281900E+00-.161369E+02-.194284E+02-.161057E+02 +0.289713E+000.710981E+02-.293619E+00-.194597E+02-.163791E+02-.191498E+02 +0.912885E+02-.248119E+02-.304036E+000.300129E+00-.208486E+02-.211325E+02 +-.244916E+02-.236713E+020.103442E+03-.239681E+02-.280659E+02-.277326E+02 +0.313151E+00-.317057E+000.307943E+00-.245150E+020.912885E+02-.211090E+02 +-.311848E+00-.208174E+02-.248431E+020.103442E+03-.240619E+02-.237963E+02 +-.279409E+02-.276388E+020.281901E+00-.285807E+00-.244213E+020.912885E+02 +0.276692E+00-.212028E+02-.280598E+00-.247181E+02-.209424E+02-.246869E+02 +-.272786E+000.912885E+020.268879E+00-.209736E+02-.243978E+02-.212262E+02 +0.150502E+030.328776E+00-.402006E+02-.350300E+02-.332681E+00-.405496E+02 +-.347175E+02-.324869E+000.150502E+03-.405183E+020.320963E+00-.347487E+02 +-.350534E+02-.401772E+02-.397371E+02-.394194E+020.170539E+03-.458664E+02 +-.455123E+02-.337890E+000.333984E+000.117131E+03-.294485E+02-.274233E+02 +-.311749E+02-.290735E+020.228841E+00-.239908E+00-.290742E+020.117131E+03 +0.235351E+00-.294479E+02-.246419E+00-.311820E+02-.274162E+02-.275177E+02 +-.233398E+000.103369E+030.222330E+00-.241947E+02-.256423E+02-.260029E+02 +0.193113E+030.261393E+00-.480286E+02-.484596E+02-.272461E+00-.513737E+02 +-.452401E+02-.259439E+000.170422E+03-.453365E+020.248372E+00-.399246E+02 +-.427841E+02-.423661E+02-.484603E+02-.452473E+020.193113E+03-.513665E+02 +-.480280E+02-.265950E+000.254882E+000.170422E+03-.453651E+02-.285481E+00 +0.274413E+00-.398960E+02-.427815E+02-.423687E+02-.452187E+020.193113E+03 +-.484577E+02-.513952E+02-.480306E+020.280924E+00-.291992E+000.287435E+00 +-.480312E+020.193113E+03-.484570E+02-.298502E+00-.452115E+02-.514023E+02 +0.103299E+03-.268730E+02-.251723E+02-.264720E+02-.247804E+020.821937E-01 +-.831703E-01-.263873E+020.109961E+030.854492E-01-.285970E+02-.864258E-01 +-.281862E+02-.267890E+02-.248611E+02-.844727E-010.970402E+020.834959E-01 +-.236540E+02-.232659E+02-.252582E+020.141191E+030.802409E-01-.339459E+02 +-.366538E+02-.812175E-01-.362274E+02-.343632E+02-.792641E-010.124601E+03 +-.319562E+020.782875E-01-.303394E+02-.323689E+02-.299357E+02-.344420E+02 +-.322882E+020.132637E+03-.340253E+02-.318807E+02-.779619E-010.769854E-01 +0.159990E+03-.410668E+02-.922852E-010.913083E-01-.389233E+02-.415186E+02 +-.384806E+02-.414249E+020.170309E+03-.441801E+02-.437244E+02-.409783E+02 +0.900062E-01-.909827E-010.932617E-01-.436319E+020.181292E+03-.470183E+02 +-.942383E-01-.440883E+02-.465528E+020.123969E+02-.300263E+010.423177E-01 +-.317562E+01-.462240E-01-.276305E+01-.345167E+01-.384114E-01-.269277E+01 +0.965729E+010.345052E-01-.215215E+01-.247141E+01-.233705E+010.140459E+02 +-.310271E+01-.359800E+01-.393654E+01-.340479E+01-.774737E-010.735675E-01 +-.385321E+010.683594E-010.159146E+02-.408390E+01-.722657E-01-.443807E+01 +-.353550E+010.752370E+01-.488281E-01-.211566E+010.449219E-01-.166247E+01 +-.181611E+01-.192555E+01-.187087E+01-.217819E+010.852390E+01-.240736E+01 +-.206358E+010.579425E-01-.618488E-010.852390E+01-.232403E+01-.205316E+01 +-.195420E+01-.218861E+01-.149740E-010.110677E-01-.193337E+010.585932E-02 +0.752370E+01-.180830E+01-.976557E-02-.172497E+01-.205316E+010.159146E+02 +0.136719E-01-.359800E+01-.175781E-01-.437557E+01-.409171E+01-.384539E+01 +-.385321E+01-.339437E+010.140459E+02-.318604E+01-.360842E+01-.455719E-02 +0.650949E-030.965729E+01-.247402E+01-.201823E-01-.233444E+010.162761E-01 +-.267193E+01-.217299E+010.240885E-01-.278388E+010.123969E+02-.279948E-01 +-.343083E+01-.300003E+01-.317823E+010.203592E+02-.518138E+01-.483113E+01 +-.498607E+01-.534957E+010.335285E-01-.445962E-01-.471459E+01-.380859E-01 +0.179676E+02-.426953E+010.270182E-01-.439573E+01-.457672E+010.261401E+02 +0.660807E-01-.641798E+01-.771484E-01-.663803E+01-.690617E+01-.616683E+01 +-.663868E+01-.617399E+010.261401E+02-.641733E+01-.689901E+01-.706378E-01 +0.595701E-010.179676E+02-.472891E+01-.511067E-01-.425521E+010.400390E-01 +-.457541E+01-.439703E+010.530599E-01-.498802E+010.203592E+02-.641276E-01 +-.517943E+01-.480964E+01-.537105E+010.314858E+02-.817015E+01-.668944E-01 +-.757683E+010.659178E-01-.763868E+01-.809919E+010.678711E-01-.810505E+01 +0.314858E+02-.688476E-01-.763282E+01-.756901E+01-.817796E+010.379785E+02 +-.921310E+01-.914539E+01-.977112E+01-.984794E+010.717772E-01-.727538E-01 +-.924826E+01-.694986E-010.356777E+02-.859467E+010.685220E-01-.917469E+01 +-.865912E+010.356777E+020.743815E-01-.919227E+01-.753580E-01-.864154E+01 +-.927170E+01-.857123E+01-.920138E+01-.912977E+010.379785E+02-.978284E+01 +-.986357E+01-.766601E-010.756835E-010.336781E+02-.809501E+010.146484E+00 +-.872384E+01-.150391E+00-.754293E+01-.931238E+01-.142578E+00-.730318E+01 +0.262311E+020.138672E+00-.582864E+01-.676933E+01-.632604E+010.381607E+02 +-.854676E+01-.989882E+01-.105499E+02-.916134E+01-.181640E+000.177734E+00 +-.103624E+020.172526E+000.432402E+02-.112375E+02-.176432E+00-.119042E+02 +-.973215E+010.204314E+02-.152995E+00-.575234E+010.149088E+00-.447964E+01 +-.494578E+01-.524973E+01-.509088E+01-.595885E+010.231502E+02-.650052E+01 +-.559609E+010.162109E+00-.166015E+000.231502E+02-.641718E+01-.558567E+01 +-.517421E+01-.596927E+010.891924E-01-.930986E-01-.525754E+01-.983073E-01 +0.204314E+02-.493797E+010.944011E-01-.454213E+01-.568984E+010.432402E+02 +0.117838E+00-.979466E+01-.121745E+00-.118417E+02-.112453E+02-.103546E+02 +-.104665E+02-.915092E+010.381607E+02-.863009E+01-.990924E+01-.108724E+00 +0.104817E+000.262311E+02-.677193E+01-.124349E+00-.632343E+010.120443E+00 +-.728235E+01-.584948E+010.128255E+00-.756376E+010.336781E+02-.132161E+00 +-.929155E+01-.809241E+01-.872644E+010.553739E+02-.244141E+00-.127898E+02 +0.240234E+00-.148770E+02-.125658E+02-.151374E+02-.131596E+02-.134148E+02 +0.488686E+02-.112546E+02-.110358E+020.235026E+00-.238932E+000.710981E+02 +-.161682E+020.274088E+00-.193972E+02-.277994E+00-.191029E+02-.164260E+02 +-.270182E+00-.164494E+020.710981E+020.266276E+00-.190794E+02-.193659E+02 +-.161994E+020.488686E+02-.132064E+02-.134773E+02-.112077E+02-.109733E+02 +-.254557E+000.250651E+00-.124721E+020.263671E+000.553739E+02-.152311E+02 +-.267577E+00-.127195E+02-.149473E+020.912885E+02-.247494E+02-.288411E+00 +-.209111E+020.284504E+00-.211793E+02-.244447E+020.292318E+00-.244681E+02 +0.912885E+02-.296224E+00-.211559E+02-.208799E+02-.247806E+020.132819E+03 +-.309216E+02-.306300E+02-.354675E+02-.357956E+020.307942E+00-.311849E+00 +-.316248E+02-.298827E+000.117213E+03-.269982E+020.294921E+00-.313096E+02 +-.272769E+020.117213E+030.318359E+00-.313800E+02-.322265E+00-.272065E+02 +-.317185E+02-.269045E+02-.308748E+02-.305675E+020.132819E+03-.355144E+02 +-.358581E+02-.327474E+000.323568E+000.150398E+03-.377741E+02-.352273E+02 +-.373704E+02-.400151E+020.241862E+00-.252929E+00-.353190E+02-.246419E+00 +0.132726E+03-.310818E+020.235351E+00-.329626E+02-.333519E+020.193113E+03 +0.274414E+00-.480299E+02-.285482E+00-.484583E+02-.513880E+02-.452258E+02 +-.484590E+02-.452330E+020.193113E+03-.480293E+02-.513808E+02-.278971E+00 +0.267903E+000.132726E+03-.353334E+02-.259440E+00-.310675E+020.248372E+00 +-.333506E+02-.329639E+020.261393E+00-.373724E+020.150398E+03-.272461E+00 +-.377721E+02-.352058E+02-.400366E+020.117052E+03-.304214E+02-.285085E+02 +-.281087E+02-.300126E+020.795896E-01-.805661E-01-.281869E+02-.818685E-01 +0.109961E+03-.267884E+020.808920E-01-.263925E+02-.285918E+020.159990E+03 +0.867513E-01-.384858E+02-.877278E-01-.415134E+02-.410675E+02-.389226E+02 +-.390079E+02-.365718E+020.150297E+03-.361447E+02-.385717E+02-.844723E-01 +0.834958E-010.124601E+03-.319549E+02-.883789E-01-.303407E+020.874024E-01 +-.323794E+02-.299253E+020.893554E-01-.339355E+020.141191E+03-.903320E-01 +-.366643E+02-.343645E+02-.362261E+020.517462E+01-.141361E+01-.122644E+01 +-.118998E+01-.134069E+010.585934E-02-.976559E-02-.118998E+01-.149740E-01 +0.242618E+01-.557546E+00-.663682E+00-.236569E+01-.205837E+010.852391E+01 +-.191253E+01-.218340E+01-.253905E-010.214843E-010.311361E+01-.150765E+01 +-.410156E-01-.872309E+00-.692635E+000.262311E+020.657552E-01-.591198E+01 +-.696614E-01-.721985E+01-.677974E+01-.631562E+01-.637552E+01-.558046E+01 +0.231502E+02-.521588E+01-.597448E+01-.566404E-010.527341E-010.761718E-01 +-.456297E+010.204314E+02-.800781E-01-.566900E+01-.493536E+01-.526015E+01 +0.140459E+02-.389487E+01-.339958E+01-.314437E+01-.360321E+010.371092E-01 +-.410154E-010.512968E+01-.246360E+01-.930989E-01-.145987E+01-.111311E+01 +0.970052E-01-.270055E+010.123969E+02-.100911E+00-.351416E+01-.301044E+01 +-.316781E+01-.192295E+01-.670573E-010.399629E+01-.873490E+00-.113279E+01 +0.159146E+020.865885E-01-.351467E+01-.904948E-01-.445890E+01-.408130E+01 +-.385581E+010.242618E+010.325521E-02-.122644E+01-.571218E+00-.631781E+00 +0.136719E-01-.158057E+010.311361E+01-.803949E+00-.742765E+000.121801E+02 +-.299222E+01-.305988E-01-.301391E+01-.322371E+01-.133112E+01-.158850E+01 +0.345052E-01-.260943E+010.512968E+01-.131859E+01-.123615E+01-.384279E+01 +-.455719E-020.156370E+02-.387689E+01-.416862E+01-.206556E+01-.167860E+01 +0.399629E+010.240885E-01-.203233E+01-.960078E+00-.102798E+01-.631302E+01 +0.475261E-010.257754E+02-.641993E+01-.692766E+01-.342823E+01-.273407E+01 +0.200758E+02-.492755E+010.214845E-01-.498867E+01-.537821E+01-.213585E+01 +-.266703E+010.629050E+01-.120443E-01-.315259E+01-.149612E+01-.162975E+01 +-.250651E-01-.404291E+010.808013E+01-.210019E+01-.191197E+010.292905E+02 +-.700513E+010.530599E-01-.759245E+01-.765625E+01-.345625E+01-.363349E+01 +-.511067E-01-.664063E+010.133117E+02-.348473E+01-.313521E+01-.699081E+01 +0.660807E-010.292905E+02-.760417E+01-.767188E+01-.363480E+01-.345495E+01 +0.103729E+02-.380859E-01-.518203E+01-.244705E+01-.270573E+01-.696216E+01 +0.921223E-010.292905E+02-.762761E+01-.770313E+01-.363740E+01-.345234E+01 +0.292905E+02-.697649E+010.791015E-01-.761589E+01-.768750E+01-.345364E+01 +-.363610E+01-.754558E+010.737303E-010.153109E+02-.379452E+01-.404451E+01 +0.173632E+02-.856342E+010.763345E-01-.457664E+01-.429946E+010.154775E+02 +-.610351E-01-.765625E+01-.374423E+01-.401603E+01-.675455E-01-.866498E+01 +0.175298E+02-.455727E+01-.424005E+010.223239E+02-.110226E+020.815428E-01 +-.586396E+01-.551888E+01-.805664E-01-.111060E+020.224906E+02-.586282E+01 +-.544125E+01-.971643E+010.789386E-010.196887E+02-.487127E+01-.517996E+01 +0.198554E+02-.740560E-01-.980888E+01-.480275E+01-.516971E+010.140459E+02 +-.397821E+01-.341000E+01-.306104E+01-.359279E+010.110026E+00-.113932E+00 +-.316521E+01-.119141E+000.658497E+01-.142818E+01-.187244E+01-.645885E+01 +-.559088E+010.231502E+02-.513255E+01-.596406E+01-.129557E+000.125651E+00 +0.845361E+01-.407348E+01-.145182E+00-.239480E+01-.184014E+010.704458E+02 +0.169922E+00-.162637E+02-.192722E+02-.246744E+00-.184358E+02-.163974E+02 +-.171439E+02-.150038E+020.629087E+02-.143268E+02-.164304E+02-.160807E+00 +0.156901E+000.180338E+00-.125788E+020.548659E+02-.151061E+02-.236328E+00 +-.127630E+02-.143619E+020.381607E+02-.105082E+02-.915613E+01-.858842E+01 +-.990403E+010.141276E+00-.145182E+000.139338E+02-.676152E+01-.197266E+00 +-.390246E+01-.307260E+010.201172E+00-.748043E+010.332824E+02-.934122E+01 +-.215494E+00-.771536E+01-.873110E+01-.524713E+01-.171224E+000.108530E+02 +-.237650E+01-.305813E+010.427322E+020.190755E+00-.971132E+01-.118639E+02 +-.225911E+00-.111938E+02-.992792E+010.158717E+02-.808459E+010.735678E-01 +-.354830E+01-.431234E+01-.103519E+020.996094E-010.203543E+02-.552899E+01 +-.457296E+01-.169772E+020.151693E+000.335007E+02-.907282E+01-.760233E+01 +0.261101E+02-.132559E+020.125651E+00-.589605E+01-.708380E+010.219401E+00 +-.913289E+010.174941E+02-.380378E+01-.477684E+010.224612E+020.245443E+00 +-.116921E+02-.609583E+01-.491877E+010.805632E+02-.187253E+02-.184857E+02 +-.215361E+02-.218122E+020.255859E+00-.259765E+00-.186784E+02-.184232E+02 +0.805632E+02-.215830E+02-.218747E+02-.275390E+000.271484E+000.370285E+02 +0.297526E+00-.191732E+02-.993980E+01-.821301E+01-.185847E+02-.182982E+02 +0.805632E+02-.216767E+02-.219997E+02-.306640E+000.302734E+000.271484E+00 +-.149707E+020.288391E+02-.635783E+01-.778205E+010.805632E+02-.186315E+02 +-.183607E+02-.216299E+02-.219372E+020.287109E+00-.291015E+00-.207861E+02 +0.315754E+000.431196E+02-.104785E+02-.121707E+020.555425E+02-.268732E+02 +0.326171E+00-.155315E+02-.134640E+020.907806E+02-.264974E+00-.212497E+02 +-.226150E+02-.242904E+02-.101694E+02-.121911E+02-.291016E+00-.273003E+02 +0.116562E+03-.290748E+02-.311892E+02-.156013E+02-.131054E+020.919758E+02 +-.447154E+020.347004E+00-.253975E+02-.222099E+02-.343099E+00-.450696E+02 +0.192173E+03-.480319E+02-.514095E+02-.255663E+02-.217524E+02-.346862E+02 +0.336588E+000.714939E+02-.172945E+02-.198498E+020.149666E+03-.317057E+00 +-.350769E+02-.373730E+02-.400437E+02-.168864E+02-.199691E+020.916674E+02 +-.220378E+00-.229620E+02-.218434E+02-.233480E+02-.108561E+02-.124375E+02 +-.233398E+00-.294492E+020.117702E+03-.280983E+02-.300113E+02-.159534E+02 +-.139564E+020.103512E+03-.512786E+020.261393E+00-.261357E+02-.263590E+02 +-.259440E+00-.484609E+020.194055E+03-.464571E+02-.495640E+02-.262635E+02 +-.230501E+02-.512643E+020.274414E+000.103494E+03-.263629E+02-.261409E+02 +0.151131E+03-.246419E+00-.377747E+02-.361343E+02-.385704E+02-.179377E+02 +-.204676E+02-.512357E+020.300455E+000.103457E+03-.263707E+02-.261513E+02 +0.103476E+03-.512500E+020.287434E+00-.261461E+02-.263668E+020.443650E+02 +-.825195E-01-.223108E+02-.107157E+02-.112559E+02-.799153E-01-.252530E+02 +0.502441E+02-.127690E+02-.121422E+020.684528E+02-.343626E+020.756836E-01 +-.164264E+02-.177396E+02-.747070E-01-.323637E+020.644552E+02-.164275E+02 +-.155892E+02-.389220E+020.821941E-010.775587E+02-.200937E+02-.186252E+02 +0.569061E+02-.773112E-01-.285866E+02-.137583E+02-.144839E+02-.499403E+02 +0.952149E-010.995691E+02-.257812E+02-.239429E+020.878770E+02-.440877E+02 +0.887045E-01-.211177E+02-.227603E+02 diff --git a/MATGEN/FEM/meshes.f b/MATGEN/FEM/meshes.f new file mode 100644 index 0000000..7e59850 --- /dev/null +++ b/MATGEN/FEM/meshes.f @@ -0,0 +1,986 @@ + subroutine inmesh (nmesh,iin,nx,nelx,node,x,y,nodcode,ijk,iperm) + implicit none + real*8 x(*),y(*) + integer nmesh,iin,nx,nelx,node,nodcode(nx),ijk(node,nelx), + * iperm(nx) +c----------------------------------------------------------------------- +c this subroutine selects and initializes a mesh among a few +c choices. So far there are 9 initial meshes provided and the user can +c also enter his own mesh as a 10th option. +c +c on entry: +c--------- +c nmesh = integer indicating the mesh chosen. nmesh=1,...,9 +c corresponds to one of the 9 examples supplied by +c SPARSKIT. nmesh = 0 is a user supplied initial mesh. +c see below for additional information for the format. +c iin = integer containing the I/O unit number where to read +c the data from in case nmesh = 1. A dummy integer +c otherwise. +c node = integer = the number of nodes per element (should be +c set to node=3 in this version). node is also the first +c dimension of the array ijk. +c +c on return +c --------- +c nx = integer . the number of nodes +c nelx = integer . the number of elements +c x, y = two real arrays containing the coordinates of the nodes. +c nodcode = an integer array containing the boundary information for +c each node with the following meaning. +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner node. +c +c ijk(node,*)= an integer array containing the connectivity matrix. +c +c----------------------------------------------------------------------- +c format for user supplied mesh (when nmesh = 7) +c +c option nmesh = 0, is a user definied initial mesh. +c--------- +c format is as follows: +c line 1: two integers, the first containing the number of nodes +c the second the number of elements. +c line 2: to line nx+1: node information. +c enter the following, one line per node: +c * the number of the node in the numbering chosen (integer +c taking the values 1 to nx), followed by, +c * the coordinates of the nodes (2 reals) followed by +c the boundary information, an integer taking one of the +c values 0, 1, or 2, with the meaning explained above. +c +c line nx+2 to nx+nelx+1: connectivity matrix +c enter the following one line per element: +c * number of the element in the numbering chosen, followed by +c * The three numbers of the nodes (according to the above numbering +c of the nodes) that constitute the element, in a counter clock-wise +c order (this is in fact not important since it is checked by the +c subroutine chkelemt). +c +c AN EXAMPLE: consisting on one single element (a triangle) +c------------ +c 3 1 +c 1 0.0000 0.0000 2 +c 2 4.0000 0.0000 2 +c 3 0.0000 4.0000 2 +c 1 1 2 3 +c +c----------------------------------------------------------------------- +c local variables + integer i, j, ii +c +c print *, ' ----- nmesh = ', nmesh + goto (10,1,2,3,4,5,6,7,8,9) nmesh+1 + 1 continue + call fmesh1 (nx,nelx,node,x,y,nodcode,ijk) + goto 18 + 2 continue + call fmesh2 (nx,nelx,node,x,y,nodcode,ijk) + goto 18 + 3 continue + call fmesh3 (nx,nelx,node,x,y,nodcode,ijk) + goto 18 + 4 continue + call fmesh4 (nx,nelx,node,x,y,nodcode,ijk) + goto 18 + 5 continue + call fmesh5 (nx,nelx,node,x,y,nodcode,ijk) + goto 18 + 6 continue + call fmesh6 (nx,nelx,node,x,y,nodcode,ijk) + goto 18 + 7 continue + call fmesh7 (nx,nelx,node,x,y,nodcode,ijk,iperm) + goto 18 + 8 continue + call fmesh8 (nx,nelx,node,x,y,nodcode,ijk,iperm) + goto 18 + 9 continue + call fmesh9(nx,nelx,node,x,y,nodcode,ijk,iperm) + goto 18 + 10 continue +c +c-------option 0 : reading mesh from IO unit iin. +c + read (iin,*) nx, nelx +c + do 16 i=1,nx + read(iin,*) ii,x(ii),y(ii),nodcode(ii) + 16 continue + do 17 i=1,nelx + read(iin,*) ii,(ijk(j,ii),j=1,node) + if (ii. gt. nelx) nelx = ii + 17 continue +c----------------------------------------------------------------------- + 18 continue +c and return + return +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine fmesh1 (nx,nelx,node,x,y,nodcode,ijk) +c-------------------------------------------------------------- +c +c initial mesh for a simple square with two elemnts +c 3 4 +c -------------- +c | . | +c | 2 . | +c | . | +c | . 1 | +c | . | +c -------------- +c 1 2 +c-------------------------------------------------------------- +c input parameters: node = first dimensoin of ijk (must be .ge. 3) +c output parameters: +c nx = number of nodes +c nelx = number of elemnts +c (x(1:nx), y(1:nx)) = coordinates of nodes +c nodcode(1:nx) = integer code for each node with the +c following meening: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point. +c ijk(1:3,1:nelx) = connectivity matrix. for a given element +c number nel, ijk(k,nel), k=1,2,3 represent the nodes +c composing the element nel. +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension x(*),y(*),nodcode(*),ijk(node,*) + real*8 x1(4),y1(4) + integer ijk1(2),ijk2(2),ijk3(2) +c-------------------------------------------------------------- +c coordinates of nodal points +c-------------------------------------------------------------- + data x1/0.0, 1.0, 0.0, 1.0/ + data y1/0.0, 0.0, 1.0, 1.0/ +c +c------------------|--| +c elements 1 2 +c------------------|--| + data ijk1 /1, 1/ + data ijk2 /2, 4/ + data ijk3 /4, 3/ +c + nx = 4 +c + do 1 k=1, nx + x(k) = x1(k) + y(k) = y1(k) + nodcode(k) = 1 + 1 continue +c + nodcode(2) = 2 + nodcode(3) = 2 +c + nelx = 2 +c + do 2 k=1,nelx + ijk(1,k) = ijk1(k) + ijk(2,k) = ijk2(k) + ijk(3,k) = ijk3(k) + 2 continue +c + return + end +c----------------------------------------------------------------------- + subroutine fmesh2 (nx,nelx,node,x,y,nodcode,ijk) +c--------------------------------------------------------------- +c initial mesh for a simple D-shaped region with 4 elemnts +c 6 +c | . +c | . +c | . +c | 4 . +c | . +c 4 -------------- 5 +c | . | +c | 3 . | +c | . | +c | . 2 | +c | . | +c -------------- +c | 2 . 3 +c | . +c | 1 . +c | . +c | . +c |. +c 1 +c-------------------------------------------------------------- +c input parameters: node = first dimensoin of ijk (must be .ge. 3) +c output parameters: +c nx = number of nodes +c nelx = number of elemnts +c (x(1:nx), y(1:nx)) = coordinates of nodes +c nodcode(1:nx) = integer code for each node with the +c following meening: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point. +c ijk(1:3,1:nelx) = connectivity matrix. for a given element +c number nel, ijk(k,nel), k=1,2,3 represent the nodes +c composing the element nel. +c +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension x(*),y(*),nodcode(*),ijk(node,*) + real*8 x1(6),y1(6) + integer ijk1(4),ijk2(4),ijk3(4) +c-------------------------------------------------------------- +c coordinates of nodal points +c-------------------------------------------------------------- + data x1/0.0, 0.0, 1.0, 0.0, 1.0, 0.0/ + data y1/0.0, 1.0, 1.0, 2.0, 2.0, 3.0/ +c +c------------------|--|--|--| +c elements 1 2 3 4 +c------------------|--|--|--| + data ijk1 /1, 2, 2, 4/ + data ijk2 /3, 3, 5, 5/ + data ijk3 /2, 5, 4, 6/ +c + nx = 6 +c + do 1 k=1, nx + x(k) = x1(k) + y(k) = y1(k) + nodcode(k) = 1 + 1 continue +c + nelx = 4 +c + do 2 k=1,nelx + ijk(1,k) = ijk1(k) + ijk(2,k) = ijk2(k) + ijk(3,k) = ijk3(k) + 2 continue +c + return + end +c----------------------------------------------------------------------- + subroutine fmesh3 (nx,nelx,node,x,y,nodcode,ijk) +c--------------------------------------------------------------- +c initial mesh for a C-shaped region composed of 10 elements -- +c +c +c 10 11 12 +c --------------------------- +c | . | . | +c | 7 . | 9 . | +c | . | . | +c | . 8 | . 10 | +c | . | . | +c 7 --------------------------- +c | . |8 9 +c | 5 . | +c | . | +c | . 6 | +c 4 | . |5 6 +c --------------------------- +c | . | . | +c | 1 . | 3 . | +c | . | . | +c | . 2 | . 4 | +c | . | . | +c --------------------------- +c 1 2 3 +c +c-------------------------------------------------------------- +c input parameters: node = first dimensoin of ijk (must be .ge. 3) +c nx = number of nodes +c nelx = number of elemnts +c (x(1:nx), y(1:nx)) = coordinates of nodes +c nodcode(1:nx) = integer code for each node with the +c following meening: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point. +c ijk(1:3,1:nelx) = connectivity matrix. for a given element +c number nel, ijk(k,nel), k=1,2,3 represent the nodes +c composing the element nel. +c +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension x(*),y(*),nodcode(*),ijk(node,*) + real*8 x1(12),y1(12) + integer ijk1(10),ijk2(10),ijk3(10) +c-------------------------------------------------------------- +c coordinates of nodal points +c-------------------------------------------------------------- + data x1/0.0,1.0,2.0,0.0,1.0,2.0,0.0,1.0,2.0,0.0,1.0,2.0/ + data y1/0.0,0.0,0.0,1.0,1.0,1.0,2.0,2.0,2.0,3.0,3.0,3.0/ +c +c------------------|--|--|--|--|--|--|---|---|---| +c elements 1 2 3 4 5 6 7 8 9 10 +c------------------|--|--|--|--|--|--|---|---|---| + data ijk1 /1, 1, 2, 2, 4, 4, 7, 7, 8, 8/ + data ijk2 /5, 2, 6, 3, 8, 5, 11, 8, 12, 9/ + data ijk3 /4, 5, 5, 6, 7, 8, 10, 11,11, 12/ +c + nx = 12 +c + do 1 k=1, nx + x(k) = x1(k) + y(k) = y1(k) + nodcode(k) = 1 + 1 continue +c + nodcode(3) = 2 + nodcode(10) = 2 + nodcode(9) = 2 +c + nelx = 10 +c + do 2 k=1,nelx + ijk(1,k) = ijk1(k) + ijk(2,k) = ijk2(k) + ijk(3,k) = ijk3(k) + 2 continue +c + return + end +c----------------------------------------------------------------------- + subroutine fmesh4 (nx,nelx,node,x,y,nodcode,ijk) +c----------------------------------------------------------------------- +c initial mesh for a C-shaped region composed of 10 elements -- +c 10 11 +c +------------------+ . +c | . | . +c | . 8 | . 12 +c | . | 9 . | +c | 7 . | . | +c 7 | . | . 10 | +c -------------------+--------+ 9 +c | .| 8 +c | 5 . | +c | . | +c | . 6 | +c |. | 5 6 +c 4 +------------------+--------+ +c | . | . 4 | +c | 1 . | . | +c | . | 3 .| 3 +c | . 2 | . +c | . | . +c -------------------- +c 1 2 +c-------------------------------------------------------------- +c input parameters: node = first dimensoin of ijk (must be .ge. 3) +c nx = number of nodes +c nelx = number of elemnts +c (x(1:nx), y(1:nx)) = coordinates of nodes +c nodcode(1:nx) = integer code for each node with the +c following meening: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point. +c ijk(1:3,1:nelx) = connectivity matrix. for a given element +c number nel, ijk(k,nel), k=1,2,3 represent the nodes +c composing the element nel. +c +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension x(*),y(*),nodcode(*),ijk(node,*) + real*8 x1(12),y1(12) + integer ijk1(10),ijk2(10),ijk3(10) +c-------------------------------------------------------------- +c coordinates of nodal points +c-------------------------------------------------------------- + data x1/0.0,1.0,1.5,0.0,1.0,1.5,0.0,1.0,1.5,0.0,1.0,1.5/ + data y1/0.0,0.0,0.5,1.0,1.0,1.0,2.0,2.0,2.0,3.0,3.0,2.5/ +c +c------------------|--|--|--|--|--|--|---|---|---| +c elements 1 2 3 4 5 6 7 8 9 10 +c------------------|--|--|--|--|--|--|---|---|---| + data ijk1 /1, 1, 2, 5, 4, 4, 7, 10, 8, 8/ + data ijk2 /5, 2, 3, 3, 8, 5, 8, 8, 12, 9/ + data ijk3 /4, 5, 5, 6, 7, 8, 10, 11,11, 12/ +c + nx = 12 +c + do 1 k=1, nx + x(k) = x1(k) + y(k) = y1(k) + nodcode(k) = 1 + 1 continue +c + nodcode(6) = 2 + nodcode(9) = 2 +c + nelx = 10 +c + do 2 k=1,nelx + ijk(1,k) = ijk1(k) + ijk(2,k) = ijk2(k) + ijk(3,k) = ijk3(k) + 2 continue +c + return + end +c----------------------------------------------------------------------- + subroutine fmesh5 (nx,nelx,node,x,y,nodcode,ijk) +c--------------------------------------------------------------- +c initial mesh for a whrench shaped region composed of 14 elements -- +c +c 13 15 +c . ----------. |-3 +c . . 13 . . | +c . 12 . . 14 . | +c 9 10 11 12 . . 14 . 16 | +c ---------------------------------------------------------- |-2 +c | . | . | . | . | | +c | 1 . | 3 . | 5 . | 7 . | | +c | . 2 | . 4 | . 6 | . 8 | | +c |. |. |. | . | | +c ----------------------------------------------------------- |-1 +c 1 2 3 4 . 6 . . 8 | +c . 9 . . 11 . | +c . . 10 . . | +c .___________. |-0 +c 5 7 +c +c 0---------1--------2----------3--------------4-------------5 +c-------------------------------------------------------------- +c input parameters: node = first dimensoin of ijk (must be .ge. 3) +c nx = number of nodes +c nelx = number of elemnts +c (x(1:nx), y(1:nx)) = coordinates of nodes +c nodcode(1:nx) = integer code for each node with the +c following meening: +c nodcode(i) = 0 --> node i is internal +c nodcode(i) = 1 --> node i is a boundary but not a corner point +c nodcode(i) = 2 --> node i is a corner point. +c ijk(1:3,1:nelx) = connectivity matrix. for a given element +c number nel, ijk(k,nel), k=1,2,3 represent the nodes +c composing the element nel. +c +c-------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension x(*),y(*),nodcode(*),ijk(node,*) + real*8 x1(16),y1(16) + integer ijk1(14),ijk2(14),ijk3(14) +c-------------------------------------------------------------- +c coordinates of nodal points +c-------------------------------------------------------------- + data x1/0.,1.,2.,3.,3.5,4.,4.5,5.,0.,1.,2.,3.,3.5,4.,4.5,5./ + data y1/1.,1.,1.,1.,0.,1.,0.,1.,2.,2.,2.,2.,3.,2.,3.,2./ +c +c------------------|--|--|--|--|--|--|---|---|---|--|---|---|---| +c elements 1 2 3 4 5 6 7 8 9 10 11 12 13 14 +c------------------|--|--|--|--|--|--|---|---|---|--|---|---|---| + data ijk1 /1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 6, 12, 14, 14/ + data ijk2 /10,2,11, 3,12, 4,14, 6, 5, 7, 7, 14, 15, 16/ + data ijk3 /9,10,10,11,11,12,12, 14, 6, 6, 8, 13, 13, 15/ +c + nx = 16 +c + do 1 k=1, nx + x(k) = x1(k) + y(k) = y1(k) + nodcode(k) = 1 + 1 continue +c + nodcode(9) = 2 + nodcode(8) = 2 + nodcode(16) = 2 +c + nelx = 14 +c + do 2 k=1,nelx + ijk(1,k) = ijk1(k) + ijk(2,k) = ijk2(k) + ijk(3,k) = ijk3(k) + 2 continue +c + return + end +c----------------------------------------------------------------------- + subroutine fmesh6 (nx,nelx,node,x,y,nodcode,ijk) +c--------------------------------------------------------------- +c this generates a finite element mesh for an ellipse-shaped +c domain. +c--------------------------------------------------------------- + implicit real*8 (a-h,o-z) + dimension x(*),y(*),nodcode(*),ijk(node,*), ijktr(200,3) + integer nel(200) +c-------------------------------------------------------------- +c coordinates of nodal points +c-------------------------------------------------------------- + nd = 8 + nr = 3 +c +c define axes of ellipse +c + a = 2.0 + b = 1.30 +c + nx = 1 + pi = 4.0* atan(1.0) + theta = 2.0 * pi / real(nd) + x(1) = 0.0 + y(1) = 0.0 + delr = a / real(nr) + nx = 0 + do i = 1, nr + ar = real(i)*delr + br = ar*b / a + do j=1, nd + nx = nx+1 + x(nx) = a +ar*cos(real(j)*theta) + y(nx) = b +br*sin(real(j)*theta) +c write (13,*) ' nod ', nx, ' x,y', x(nx), y(nx) + nodcode(nx) = 0 + if (i .eq. nr) nodcode(nx) = 1 + enddo + enddo +c + nemax = 200 + call dlauny(x,y,nx,ijktr,nemax,nelx) +c +c print *, ' delauny -- nx, nelx ', nx, nelx + do 3 j=1,nx + nel(j) = 0 + 3 continue +c transpose ijktr into ijk and count the number of +c elemnts to which each node belongs +c + do 4 j=1, nelx + do 41 k=1, node + i = ijktr(j,k) + ijk(k,j) = i + nel(i) = nel(i)+1 + 41 continue + 4 continue +c +c take care of ordering within each element +c + call chkelmt (nx, x, y, nelx, ijk, node) +c + return + end +c-------------------------------------------------------- + subroutine fmesh7 (nx,nelx,node,x,y,nodcode,ijk,iperm) + implicit none + real*8 x(*),y(*) + integer nx,nelx,node,nodcode(nx),ijk(node,nelx),iperm(nx) +c--------------------------------------------------------------- +c this generates a U-shaped domain with an elliptic inside. +c then a Delauney triangulation is used to generate the mesh. +c mesh needs to be post-processed -- see inmesh -- +c--------------------------------------------------------------- + integer nr,nsec,i,k,nemax,j,nel(200),ijktr(200,3),nodexc + real*8 a,b,x1, y1, x2, y2, xcntr,ycntr, rad,pi,delr,xnew,ynew, + * arx, ary, cos, sin, theta,excl +c-------------------------------------------------------------- +c coordinates of nodal points +c-------------------------------------------------------------- + data x1/0.0/,y1/0.0/,x2/6.0/,y2/6.0/,nodexc/1/ + xcntr = x2/3.0 + ycntr = y2/2.0 + rad = 1.8 + nsec = 20 + nr = 3 +c +c exclusion zone near the boundary +c + excl = 0.02*x2 +c----------------------------------------------------------------------- +c enter the four corner points. +c----------------------------------------------------------------------- + nx = 1 + x(nx) = x1 + y(nx) = y1 + nodcode(nx) = 1 + nx = nx+1 + x(nx) = x2 + y(nx) = y1 + nodcode(nx) = 1 + nx = nx+1 + x(nx) = x2 + y(nx) = y2 + nodcode(nx) = 1 + nx = nx+1 + x(nx) = x1 + y(nx) = y2 + nodcode(nx) = 1 +c +c define axes of ellipse +c + a = 2.0 + b = 1.30 +c----------------------------------------------------------------------- + pi = 4.0*atan(1.0) + delr = a / real(nr) + do 2 i = 1, nsec + theta = 2.0 * real(i-1) * pi / real(nsec) + xnew = xcntr + rad*cos(theta) + ynew = ycntr + rad*b*sin(theta)/a + if ((xnew .ge. x2) .or. (xnew .le. x1) .or. (ynew .ge. y2) + * .or. (ynew .le. y1)) goto 2 + nx = nx+1 + x(nx) = xnew + y(nx) = ynew + nodcode(nx) = nodexc + arx = delr*cos(theta) + ary = delr*b*sin(theta)/a +c +c while inside domain do: +c + 1 continue + xnew = x(nx) + arx + ynew = y(nx) + ary + if (xnew .ge. x2) then + x(nx) = x2 + nodcode(nx) = 1 + else if (xnew .le. x1) then + x(nx) = x1 + nodcode(nx) = 1 + else if (ynew .ge. y2) then + y(nx) = y2 + nodcode(nx) = 1 + else if (ynew .le. y1) then + y(nx) = y1 + nodcode(nx) = 1 + else + nx = nx+1 + x(nx) = xnew + y(nx) = ynew + nodcode(nx) = 0 + call clos2bdr(nx,xnew,ynew,x,y,x1,x2,y1,y2,excl,nodcode) + endif +c write (13,*) ' nod ', nx, ' x,y', x(nx), y(nx) +c * ,' arx--ary ', arx, ary + arx = arx*1.2 + ary = ary*1.2 + if (nodcode(nx) .le. 0) goto 1 + 2 continue +c + nemax = 200 + call dlauny(x,y,nx,ijktr,nemax,nelx) +c +c print *, ' delauny -- nx, nelx ', nx, nelx + do 3 j=1,nx + nel(j) = 0 + 3 continue +c +c transpose ijktr into ijk and count the number of +c elemnts to which each node belongs +c + do 4 j=1, nelx + do 41 k=1, node + i = ijktr(j,k) + ijk(k,j) = i + nel(i) = nel(i)+1 + 41 continue + 4 continue +c +c this mesh needs cleaning up -- +c + call cleanel (nelx,ijk, node,nodcode,nodexc) + call cleannods(nx,x,y,nelx,ijk,node,nodcode,iperm) +c +c take care of ordering within each element +c + call chkelmt (nx, x, y, nelx, ijk, node) + return + end +c----------------------------------------------------------------------- + subroutine fmesh8 (nx,nelx,node,x,y,nodcode,ijk,iperm) + implicit none + real*8 x(*),y(*) + integer nx,nelx,node,nodcode(nx),ijk(node,nelx),iperm(nx) +c--------------------------------------------------------------- +c this generates a small rocket type shape inside a rectangle +c then a Delauney triangulation is used to generate the mesh. +c mesh needs to be post-processed -- see inmesh -- +c--------------------------------------------------------------- + integer nr,nsec,i,k,nemax,j,nel(1500),ijktr(1500,3),nodexc + real*8 a,b,x1, y1, x2, y2, xcntr,ycntr, rad,pi,delr,xnew,ynew, + * arx, ary, cos, sin, theta,radi,excl +c-------------------------------------------------------------- +c coordinates of corners + some additional data +c-------------------------------------------------------------- + data x1/0.0/,y1/0.0/,x2/6.0/,y2/6.0/,nodexc/3/ + xcntr = 4.0 + ycntr = y2/2.0 + rad = 0.6 +c +c exclusion zone near the boundary. +c + excl = 0.02*x2 + nsec = 30 + nr = 4 +c----------------------------------------------------------------------- +c enter the four corner points. +c----------------------------------------------------------------------- + nx = 1 + x(nx) = x1 + y(nx) = y1 + nodcode(nx) = 1 + nx = nx+1 + x(nx) = x2 + y(nx) = y1 + nodcode(nx) = 1 + nx = nx+1 + x(nx) = x2 + y(nx) = y2 + nodcode(nx) = 1 + nx = nx+1 + x(nx) = x1 + y(nx) = y2 + nodcode(nx) = 1 +c +c define axes of ellipse /circle / object +c + a = 2.0 + b = 1.0 +c----------------------------------------------------------------------- + pi = 4.0*atan(1.0) + delr = 2.0*rad / real(nr) + do 2 i = 1, nsec + theta = 2.0*real(i-1) * pi / real(nsec) + if (theta .gt. pi) theta = theta - 2.0*pi + radi=rad*(1.0+0.05*((pi/2.0)**2-theta**2)**2) + * /(1.0+0.05*(pi/2.0)**4) + arx = radi*cos(theta)/real(nr) + ary = radi*sin(theta)/real(nr) +c a hack! +c arx = (abs(theta)+0.25)*cos(theta)/real(nr) +c ary = (abs(theta)+0.25)*sin(theta)/real(nr) +c + xnew = xcntr + radi*cos(theta) + ynew = ycntr + radi*b*sin(theta)/a + if ((xnew .ge. x2) .or. (xnew .le. x1) .or. (ynew .ge. y2) + * .or. (ynew .le. y1)) goto 2 + nx = nx+1 + x(nx) = xnew + y(nx) = ynew + nodcode(nx) = nodexc +c +c while inside domain do: +c + 1 continue + xnew = xnew + arx + ynew = ynew + ary + if (xnew .ge. x2) then + x(nx) = x2 + nodcode(nx) = 1 + else if (xnew .le. x1) then + x(nx) = x1 + nodcode(nx) = 1 + else if (ynew .ge. y2) then + y(nx) = y2 + nodcode(nx) = 1 + else if (ynew .le. y1) then + y(nx) = y1 + nodcode(nx) = 1 +c +c else we can add this as interior point +c + else + nx = nx+1 + x(nx) = xnew + y(nx) = ynew + nodcode(nx) = 0 +c +c do something if point is too close to boundary +c + call clos2bdr(nx,xnew,ynew,x,y,x1,x2,y1,y2,excl,nodcode) + endif +c + arx = arx*1.1 + ary = ary*1.1 + if (nodcode(nx) .eq. 0) goto 1 + 2 continue +c + nemax = 1500 + call dlauny(x,y,nx,ijktr,nemax,nelx) +c + print *, ' delauney -- nx, nelx ', nx, nelx + do 3 j=1,nx + nel(j) = 0 + 3 continue +c----------------------------------------------------------------------- +c transpose ijktr into ijk and count the number of +c elemnts to which each node belongs +c----------------------------------------------------------------------- + do 4 j=1, nelx + do 41 k=1, node + i = ijktr(j,k) + ijk(k,j) = i + nel(i) = nel(i)+1 + 41 continue + 4 continue +c +c this mesh needs cleaning up -- +c + call cleanel (nelx,ijk, node,nodcode,nodexc) + call cleannods(nx,x,y,nelx,ijk,node,nodcode,iperm) +c +c take care of ordering within each element +c + call chkelmt (nx, x, y, nelx, ijk, node) + return + end +c----------------------------------------------------------------------- + subroutine fmesh9 (nx,nelx,node,x,y,nodcode,ijk,iperm) + implicit none + real*8 x(*),y(*) + integer nx,nelx,node,nodcode(nx),ijk(node,nelx),iperm(nx) +c--------------------------------------------------------------- +c this generates a U-shaped domain with an elliptic inside. +c then a Delauney triangulation is used to generate the mesh. +c mesh needs to be post-processed -- see inmesh -- +c--------------------------------------------------------------- + integer nr,nsec,i,k,nemax,j,nel(1500),ijktr(1500,3),nodexc + real*8 x1, y1, x2, y2, xcntr,ycntr, rad,pi,delr,xnew,ynew, + * arx, ary, cos, sin, theta,excl +c-------------------------------------------------------------- +c coordinates of nodal points +c-------------------------------------------------------------- + data x1/0.0/,y1/0.0/,x2/11.0/,y2/5.5/,nodexc/3/ + xcntr = 1.50 + ycntr = y2/2.0 + rad = 0.6 + nsec = 30 + nr = 3 +c +c----------------------------------------------------------------------- +c enter the four corner points. +c----------------------------------------------------------------------- + nx = 1 + x(nx) = x1 + y(nx) = y1 + nodcode(nx) = 1 + nx = nx+1 + x(nx) = x2 + y(nx) = y1 + nodcode(nx) = 1 + nx = nx+1 + x(nx) = x2 + y(nx) = y2 + nodcode(nx) = 1 + nx = nx+1 + x(nx) = x1 + y(nx) = y2 + nodcode(nx) = 1 +c +c define axes of ellipse +c +c----------------------------------------------------------------------- + pi = 4.0*atan(1.0) + delr = rad / real(nr) + do 2 i = 1, nsec + theta = 2.0 * real(i-1) * pi / real(nsec) + xnew = xcntr + rad*cos(theta) + ynew = ycntr + rad*sin(theta) + if ((xnew .ge. x2) .or. (xnew .le. x1) .or. (ynew .ge. y2) + * .or. (ynew .le. y1)) goto 2 + nx = nx+1 + x(nx) = xnew + y(nx) = ynew + nodcode(nx) = nodexc + arx = delr*cos(theta) + ary = delr*sin(theta) +c +c exclusion zone near the boundary +c +c excl = 0.1*delr + excl = 0.15*delr +c +c while inside domain do: +c + 1 continue + xnew = x(nx) + arx + ynew = y(nx) + ary + if (xnew .ge. x2) then + x(nx) = x2 + nodcode(nx) = 1 + else if (xnew .le. x1) then + x(nx) = x1 + nodcode(nx) = 1 + else if (ynew .ge. y2) then + y(nx) = y2 + nodcode(nx) = 1 + else if (ynew .le. y1) then + y(nx) = y1 + nodcode(nx) = 1 + else + nx = nx+1 + x(nx) = xnew + y(nx) = ynew + nodcode(nx) = 0 + call clos2bdr(nx,xnew,ynew,x,y,x1,x2,y1,y2,excl,nodcode) + endif + arx = arx*1.1 + ary = ary*1.1 + excl = excl*1.1 + if (nodcode(nx) .le. 0) goto 1 + 2 continue +c + nemax = 1500 + call dlauny(x,y,nx,ijktr,nemax,nelx) +c +c print *, ' delauny -- nx, nelx ', nx, nelx + do 3 j=1,nx + nel(j) = 0 + 3 continue +c +c transpose ijktr into ijk and count the number of +c elemnts to which each node belongs +c + do 4 j=1, nelx + do 41 k=1, node + i = ijktr(j,k) + ijk(k,j) = i + nel(i) = nel(i)+1 + 41 continue + 4 continue +c +c this mesh needs cleaning up -- +c + call cleanel (nelx,ijk, node,nodcode,nodexc) + call cleannods(nx,x,y,nelx,ijk,node,nodcode,iperm) +c +c take care of ordering within each element +c + call chkelmt (nx, x, y, nelx, ijk, node) + return + end +c----------------------------------------------------------------------- + subroutine clos2bdr (nx,xnew,ynew,x,y,x1,x2,y1,y2,excl,nodcode) + implicit none + integer nx,nodcode(nx) + real*8 x(nx),y(nx),xnew,ynew,x1,x2,y1,y2,excl +c----------------------------------------------------------------------- +c takes care of case where a point generated is too close to the +c boundary -- in this case projects the previous point to the +c rectangle boundary == that makes some exclusion criterion +c violated... does a simple job. +c----------------------------------------------------------------------- + if (xnew .ge. x2-excl) then + x(nx) = x2 + y(nx) = y(nx-1) + nodcode(nx) = 1 + endif + if (xnew .le. x1+excl) then + x(nx) = x1 + y(nx) = y(nx-1) + nodcode(nx) = 1 + endif + if (ynew .ge. y2-excl) then + y(nx) = y2 + x(nx) = x(nx-1) + nodcode(nx) = 1 + endif + if (ynew .le. y1+excl) then + y(nx) = y1 + x(nx) = x(nx-1) + nodcode(nx) = 1 + endif +c + return + end diff --git a/MATGEN/FEM/semantic.cache b/MATGEN/FEM/semantic.cache new file mode 100644 index 0000000..bf87e70 --- /dev/null +++ b/MATGEN/FEM/semantic.cache @@ -0,0 +1,16 @@ +;; Object FEM/ +;; SEMANTICDB Tags save file +(semanticdb-project-database-file "FEM/" + :tables (list + (semanticdb-table "makefile" + :major-mode 'makefile-mode + :tags '(("FFLAGS" variable nil nil [1 11]) ("F77" variable (:default-value ("f77")) nil [11 21]) ("FILES" variable (:default-value ("convdif.o" "functns2.o")) nil [54 83]) ("fem.ex" function (:arguments ("$(FILES)" "../../UNSUPP/PLOTS/psgrd.o" "../../libskit32.a")) nil [84 232]) ("clean" function nil nil [232 269]) ("../../libskit.a" function nil nil [269 331]) ("../../UNSUPP/PLOTS/psgrd.o" function (:arguments ("../../UNSUPP/PLOTS/psgrd.f")) nil [331 441])) + :file "makefile" + :pointmax 441 + :unmatched-syntax 'nil + ) + ) + :file "semantic.cache" + :semantic-tag-version "2.0pre3" + :semanticdb-version "2.0pre3" + ) diff --git a/MATGEN/MISC/README b/MATGEN/MISC/README new file mode 100644 index 0000000..96e8aa2 --- /dev/null +++ b/MATGEN/MISC/README @@ -0,0 +1,15 @@ +This directory contains the last two test problems as described in +README of the directory above this one. + + zlatev.f : three different codes to generate matrices from the + Zlatev et. al. paper (see above). Contributed by E. Rothman + (Cornell). + + rzlatev.f : driver for a test program for the zlatev code. + + makzlatev : makefiles. See above for details. + + markov.f : a main program followed by a subroutine to generate + markov chain matrices modeling random walk on a triang. + grid. There is one parameter to the subroutine. + diff --git a/MATGEN/MISC/makefile b/MATGEN/MISC/makefile new file mode 100644 index 0000000..bc0b41c --- /dev/null +++ b/MATGEN/MISC/makefile @@ -0,0 +1,25 @@ +FFLAGS = +F77 = f77 + +#F77 = cf77 +#FFLAGS = -Wf"-dp" + +FILES1 = rsobel.o +FILES2 = rzlatev.o +FILES3 = markov.o + +sobel.ex: $(FILES1) ../../libskit.a + $(F77) $(FFLAGS) -o sobel.ex $(FILES1) ../../libskit.a + +zlatev.ex: $(FILES2) ../../libskit.a + $(F77) $(FFLAGS) -o zlatev.ex $(FILES2) ../../libskit.a + +markov.ex: $(FILES3) ../../libskit.a + $(F77) $(FFLAGS) -o markov.ex $(FILES3) ../../libskit.a + +clean: + rm -f *.o *.ex core *.trace + +../../libskit.a: + (cd ../..; $(MAKE) $(MAKEFLAGS) libskit.a) + diff --git a/MATGEN/MISC/markov.f b/MATGEN/MISC/markov.f new file mode 100644 index 0000000..00eb34f --- /dev/null +++ b/MATGEN/MISC/markov.f @@ -0,0 +1,143 @@ + program markov +c----------------------------------------------------------------------- +c +c program to generate a Markov chain matrix (to test eigenvalue routines +c or algorithms for singular systems (in which case use I-A )) +c the matrix models simple random walk on a triangular grid. +c see additional comments in subroutine. +c ----- +c just compile this segment and link to the rest of sparskit +c (uses subroutine prtmt from MATGEN) +c will create a matrix in the HARWELL/BOEING format and put it in +c the file markov.mat +c +c----------------------------------------------------------------------- + parameter (nmax=5000, nzmax= 4*nmax) + real*8 a(nzmax) + integer ja(nzmax), ia(nmax+1) +c + character title*72,key*8,type*3 + open (unit=11,file='markov.mat') +c +c read - in grid size - will not accept too large grids. +c + write (6,'(17hEnter grid-size: ,$)') + read *, m + if (m*(m+1) .gt. 2*nmax ) then + print *, ' m too large - unable to produce matrix ' + stop + endif +c +c call generator. +c + call markgen (m, n, a, ja, ia) +c----------------------------------------------------------------------- + title=' Test matrix from SPARSKIT - markov chain model ' + key = 'randwk01' + type = 'rua' + iout = 11 + job = 2 + ifmt = 10 + call prtmt (n, n, a, ja, ia, x,'NN',title, + * key, type,ifmt, job, iout) + stop + end +c + subroutine markgen (m, n, a, ja, ia) +c----------------------------------------------------------------------- +c matrix generator for a markov model of a random walk on a triang. grid +c----------------------------------------------------------------------- +c this subroutine generates a test matrix that models a random +c walk on a triangular grid. This test example was used by +c G. W. Stewart ["{SRRIT} - a FORTRAN subroutine to calculate the +c dominant invariant subspaces of a real matrix", +c Tech. report. TR-514, University of Maryland (1978).] and in a few +c papers on eigenvalue problems by Y. Saad [see e.g. LAA, vol. 34, +c pp. 269-295 (1980) ]. These matrices provide reasonably easy +c test problems for eigenvalue algorithms. The transpose of the +c matrix is stochastic and so it is known that one is an exact +c eigenvalue. One seeks the eigenvector of the transpose associated +c with the eigenvalue unity. The problem is to calculate the +c steady state probability distribution of the system, which is +c the eigevector associated with the eigenvalue one and scaled in +c such a way that the sum all the components is equal to one. +c----------------------------------------------------------------------- +c parameters +c------------ +c on entry : +c---------- +c m = integer. number of points in each direction. +c +c on return: +c---------- +c n = integer. The dimension of the matrix. (In fact n is known +c to be equal to (m(m+1))/2 ) +c a, +c ja, +c ia = the matrix stored in CSR format. +c +c----------------------------------------------------------------------- +c Notes: 1) the code will actually compute the transpose of the +c stochastic matrix that contains the transition probibilities. +c 2) It should also be possible to have a matrix generator +c with an additional parameter (basically redefining `half' below +c to be another parameter and changing the rest accordingly, but +c this is not as simple as it sounds). This is not likely to provide +c any more interesting matrices. +c----------------------------------------------------------------------- + real*8 a(*), cst, pd, pu, half + integer ja(*), ia(*) +c----------------------------------------------------------------------- + data half/0.5d0/ +c + cst = half/real(m-1) +c +c --- ix counts the grid point (natural ordering used), i.e., +c --- the row number of the matrix. +c + ix = 0 + jax = 1 + ia(1) = jax +c +c sweep y coordinates +c + do 20 i=1,m + jmax = m-i+1 +c +c sweep x coordinates +c + do 10 j=1,jmax + ix = ix + 1 + if (j .eq. jmax) goto 2 + pd = cst*real(i+j-1) +c +c north +c + a(jax) = pd + if (i.eq. 1) a(jax) = a(jax)+pd + ja(jax) = ix + 1 + jax = jax+1 +c east + a(jax) = pd + if (j .eq. 1) a(jax) = a(jax)+pd + ja(jax) = ix + jmax + jax = jax+1 +c south + 2 pu = half - cst*real(i+j-3) + if ( j .gt. 1) then + a(jax) = pu + ja(jax) = ix-1 + jax = jax+1 + endif +c west + if ( i .gt. 1) then + a(jax) = pu + ja(jax) = ix - jmax - 1 + jax = jax+1 + endif + ia(ix+1) = jax + 10 continue + 20 continue + n = ix + return + end diff --git a/MATGEN/MISC/rsobel.f b/MATGEN/MISC/rsobel.f new file mode 100644 index 0000000..5a3afab --- /dev/null +++ b/MATGEN/MISC/rsobel.f @@ -0,0 +1,14 @@ + program rsobel + integer n, ia(1:200), ja(1:1000), ib(1:200), jb(1:1000) + integer nrowc, ncolc + integer ic(1:200), jc(1:1000), ierr + real*8 a(1:1000), b(1:1000), c(1:1000) + + write (*, '(1x, 9hInput n: ,$)') + read *, n + call sobel(n,nrowc,ncolc,c,jc,ic,a,ja,ia,b,jb,ib,1000,ierr) + print *, 'ierr =', ierr + print *, 'Nrow =', nrowc, ' Ncol =', ncolc + call dump(1, nrowc, .true., c, jc, ic, 6) + end + diff --git a/MATGEN/MISC/rzlatev.f b/MATGEN/MISC/rzlatev.f new file mode 100644 index 0000000..25014af --- /dev/null +++ b/MATGEN/MISC/rzlatev.f @@ -0,0 +1,108 @@ + program zlatev +c----------------------------------------------------------------------- +c +c test suite for zlatev matrices. generates three matrices and +c writes them in three different files in Harwell-Boeing format. +c zlatev1.mat produced from matrf2 +c zlatev2.mat produced from dcn +c zlatev3.mat produced from ecn +c +c----------------------------------------------------------------------- + parameter (nmax = 1000, nzmax=20*nmax) + implicit real*8 (a-h,o-z) + integer ia(nzmax), ja(nzmax), iwk(nmax) + real*8 a(nzmax) + character title*72, key*3,type*8, guesol*2 +c + open (unit=7,file='zlatev1.mat') + open (unit=8,file='zlatev2.mat') + open (unit=9,file='zlatev3.mat') +c + m = 100 + n = m + ic = n/2 + index = 10 + alpha = 5.0 + nn = nzmax +c +c call matrf2 +c + call matrf2(m,n,ic,index,alpha,nn,nz,a,ia,ja,ierr) + job = 1 +c do 110 i = 1, nz +c print *, ia(i), ja(i), a(i) +c 110 continue + call coicsr(n, nz, job, a, ja, ia, iwk) +c----- + title = ' 1st matrix from zlatev examples ' + type = 'RUA' + key = ' ZLATEV1' + iout = 7 + guesol='NN' +c + ifmt = 3 + job = 2 +c +c write result in H-B format. +c +c Replaces prtmt with smms in order to print matrix in format for +c SMMS instead. +c call smms (n,1,n,0,a,ja,ia,iout) + call prtmt (n,n,a,ja,ia,rhs,guesol,title,type,key, + 1 ifmt,job,iout) + +c-------- second type of matrices dcn matrices --------------- + n = 200 + nn = nzmax + ic = 20 +c------------------------------------------------------- +c matrix of the type e(c,n) +c------------------------------------------------------- + call dcn(a,ia,ja,n,ne,ic,nn,ierr) +c--------------------------------------------------- + call coicsr(n, ne, job, a, ja, ia, iwk) + title = ' 2nd matrix from zlatev examples ' + iout = iout+1 + guesol='NN' + type = 'RUA' + key = ' ZLATEV2' +c + ifmt = 3 + job = 2 +c +c write result in second file +c +c Replaced prtmt with smms in order to print matrix in format for +c SMMS instead. +c call smms (n,1,n,0,a,ja,ia,iout) + call prtmt (n,n,a,ja,ia,rhs,guesol,title,type,key, + 1 ifmt,job,iout) +c------------------------------------------------------- +c matrix of the type e(c,n) +c------------------------------------------------------- + n = 200 + ic = 20 + nn = nzmax +c +c call ecn +c + call ecn(n,ic,ne,ia,ja,a,nn,ierr) + call coicsr(n, ne, job, a, ja, ia, iwk) + title = ' 3nd matrix from zlatev examples ' + guesol='NN' + type = 'RUA' + key = ' ZLATEV3' + iout = iout+1 +c + ifmt = 3 + job = 2 +c +c write resulting matrix in third file +c +c Replaced prtmt with smms in order to print matrix in format for +c SMMS instead. +c call smms (n,1,n,0,a,ja,ia,iout) + call prtmt (n,n,a,ja,ia,rhs,guesol,title,type,key, + 1 ifmt,job,iout) + stop + end diff --git a/MATGEN/MISC/sobel.f b/MATGEN/MISC/sobel.f new file mode 100644 index 0000000..2a25193 --- /dev/null +++ b/MATGEN/MISC/sobel.f @@ -0,0 +1,158 @@ + subroutine sobel(n,nrowc,ncolc,c,jc,ic,a,ja,ia,b,jb,ib,nzmax,ierr) + integer i, n, ia(*), ja(*), ib(*), jb(*) + integer nrowa, ncola, nrowb, ncolb, nrowc, ncolc, ipos + integer ic(*), jc(*), offset, ierr + real*8 a(*), b(*), c(*) +c----------------------------------------------------------------------- +c This subroutine generates a matrix used in the statistical problem +c presented by Prof. Sobel. The matrix is formed by a series of +c small submatrix on or adjancent to the diagonal. The submatrix on +c the diagonal is square and the size goes like 1, 1, 2, 2, 3, 3,... +c Each of the diagonal block is a triadiagonal matrix, each of the +c off-diagonal block is a bidiagonal block. The values of elements +c in the off-diagonal block are all -1. So are the values of the +c elements on the sub- and super-diagonal of the blocks on the +c diagonal. The first element(1,1) of the diagonal block is alternating +c between 3 and 5, the rest of the diagonal elements (of the block +c on the diagonal) are 6. +c----------------------------------------------------------------------- +c This subroutine calls following subroutines to generate the three +c thypes of submatrices: +c diagblk -- generates diagonal block. +c leftblk -- generates the block left of the diagonal one. +c rightblk-- generates the block right of the diagonal one. +c----------------------------------------------------------------------- + if (n.lt.2) return + + ipos = 1 + offset = 1 + call diagblk(1, nrowc, ncolc, c, jc, ic) + do 10 i=2, n-2 + nrowa = nrowc + ncola = ncolc + call copmat (nrowc,c,jc,ic,a,ja,ia,1,1) + call rightblk(i-1, nrowb, ncolb, b,jb,ib) + call addblk(nrowa,ncola,a,ja,ia,ipos,ipos+offset,1, + $ nrowb,ncolb,b,jb,ib,nrowc,ncolc,c,jc,ic,nzmax,ierr) + call leftblk(i,nrowb,ncolb,b,jb,ib) + call addblk(nrowc,ncolc,c,jc,ic,ipos+offset,ipos,1, + $ nrowb,ncolb,b,jb,ib,nrowa,ncola,a,ja,ia,nzmax,ierr) + ipos = ipos + offset + call diagblk(i,nrowb,ncolb,b,jb,ib) + call addblk(nrowa,ncola,a,ja,ia,ipos,ipos,1, + $ nrowb,ncolb,b,jb,ib,nrowc,ncolc,c,jc,ic,nzmax,ierr) + offset = 1 + (i-1)/2 + 10 continue + end +c----------------------------------------------------------------------- + subroutine diagblk(n, nrow, ncol, a, ja, ia) + implicit none + integer n, nrow, ncol, ia(1:*), ja(1:*) + real*8 a(1:*) +c----------------------------------------------------------------------- +c generates the diagonal block for the given problem. +c----------------------------------------------------------------------- + integer i, k + nrow = 1 + (n-1)/2 + ncol = nrow + k = 1 + ia(1) = 1 + ja(1) = 1 + if (mod(n, 2) .eq. 1) then + a(1) = 3 + else + a(1) = 5 + end if + k = k + 1 + if (ncol.gt.1) then + ja(2) = 2 + a(2) = -1.0 + k = k + 1 + end if + + do 10 i = 2, nrow + ia(i) = k + ja(k) = i-1 + a(k) = -1.0 + k = k + 1 + ja(k) = i + a(k) = 6.0 + k = k + 1 + if (i.lt.nrow) then + ja(k) = i + 1 + a(k) = -1.0 + k = k+1 + end if + 10 continue + ia(nrow+1) = k + return +c---------end-of-diagblk------------------------------------------------ + end +c----------------------------------------------------------------------- + subroutine leftblk(n, nrow, ncol, a, ja, ia) + implicit none + integer n, nrow, ncol, ja(1:*), ia(1:*) + real*8 a(1:*) +c----------------------------------------------------------------------- +c Generate the subdiagonal block for the problem given. +c----------------------------------------------------------------------- + integer i, k + nrow = 1 + (n-1)/2 + ncol = n/2 + k = 1 + do 10 i = 1, nrow + ia(i) = k + if (nrow.ne.ncol) then + if (i.gt.1) then + ja(k) = i-1 + a(k) = -1.0 + k = k+1 + end if + end if + if (i.le.ncol) then + ja(k) = i + a(k) = -1.0 + k = k+1 + end if + if (nrow.eq.ncol) then + if (i.lt.ncol) then + ja(k) = i+1 + a(k) = -1.0 + k = k+1 + end if + end if + 10 continue + ia(nrow+1) = k + return +c---------end-of-leftblk------------------------------------------------ + end +c----------------------------------------------------------------------- + subroutine rightblk(n, nrow, ncol, a, ja, ia) + implicit none + integer n, nrow, ncol, ja(1:*), ia(1:*) + real*8 a(1:*) + integer i, k + nrow = 1 + (n-1)/2 + ncol = 1 + n/2 + k = 1 + do 10 i = 1, nrow + ia(i) = k + if (nrow.eq.ncol) then + if (i.gt.1) then + ja(k) = i-1 + a(k) = -1.0 + k = k+1 + end if + end if + ja(k) = i + a(k) = -1.0 + k = k+1 + if (nrow.ne.ncol) then + ja(k) = i+1 + a(k) = -1.0 + k = k+1 + end if + 10 continue + ia(nrow+1) = k +c---------end-of-rightblk----------------------------------------------- + end diff --git a/MATGEN/MISC/zlatev.f b/MATGEN/MISC/zlatev.f new file mode 100644 index 0000000..d20a7fd --- /dev/null +++ b/MATGEN/MISC/zlatev.f @@ -0,0 +1,542 @@ + SUBROUTINE MATRF2(M,N,C,INDEX,ALPHA,NN,NZ,A,SNR,RNR,FEJLM) +C-------------------------------------------------------------------- +C +C PURPOSE +C ------- +C The subroutine generates sparse (rectangular or square) matrices. +C The dimensions of the matrix and the average number of nonzero +C elements per row can be specified by the user. Moreover, the user +C can also change the sparsity pattern and the condition number of the +C matrix. The non-zero elements of the desired matrix will be +C accumulated (in an arbitrary order) in the first NZ positions of +C array A. The column and the row numbers of the non-zero element +C stored in A(I), I=1,...,NZ, will be found in SNR(I) and RNR(I), +C respectively. The matrix generated by this subroutine is of the +C class F(M,N,C,R,ALPHA) (see reference). +C +C Note: If A is the sparse matrix of type F(M,N,C,R,ALPHA), then +C +C min|A(i,j)| = 1/ALPHA, +C +C max|A(i,j)| = max(INDEX*N - N,10*ALPHA). +C +C +C CONTRIBUTOR: Ernest E. Rothman +C Cornell Theory Center/Cornell National Supercomputer +C Facility. +C e-mail address: BITNET: eer@cornellf +C INTERNET: eer@cornellf.tn.cornell.edu +C +C minor modifications by Y. Saad. April 26, 1990. +C +C Note: This subroutine has been copied from the following reference. +C The allowable array sizes have been changed. +C +C REFERENCE: Zlatev, Zahari; Schaumburg, Kjeld; Wasniewski, Jerzy; +C "A testing Scheme for Subroutines Solving Large Linear Problems", +C Computers and Chemistry, Vol. 5, No. 2-3, pp. 91-100, 1981. +C +C +C INPUT PARAMETERS +C ---------------- +C M - Integer. The number of rows in the desired matrix. +C N < M+1 < 9000001 must be specified. +C +C N - Integer. The number of columns in the desired matrix. +C 21 < N < 9000001 must be specified. +C +C C - Integer. The sparsity pattern can be changed by means of this +C parameter. 10 < C < N-10 must be specified. +C +C INDEX - Integer. The average number of non-zero elements per row in +C the matrix will be equal to INDEX. +C 1 < INDEX < N-C-8 must be specified. +C +C ALPHA - Real. The condition number of the matrix can be changed +C BY THIS PARAMETER. ALPHA > 0.0 MUST BE SPECIFIED. +C If ALPHA is approximately equal to 1.0 then the generated +C matrix is well-conditioned. Large values of ALPHA will +C usually produce ill-conditioned matrices. Note that no +C round-off errors during the computations in this subroutine +C are made if ALPHA = 2**I (where I is an arbitrary integer +C which produces numbers in the machine range). +C +C NN - Integer. The length of arrays A, RNR, and SNR (see below). +C INDEX*M+109 < NN < 9000001 must be specified. +C +C +C OUTPUT PARAMETERS +C ----------------- +C NZ - Integer. The number of non-zero elements in the matrix. +C +C A(NN) - Real array. The non-zero elements of the matrix generated +C are accumulated in the first NZ locations of array A. +C +C SNR(NN) - INTEGER array. The column number of the non-zero element +C kept in A(I), I=1,...NZ, is stored in SNR(I). +C +C RNR(NN) - Integer array. The row number of the non-zero element +C kept in A(I), I=1,...NZ, is stored in RNR(I). +C +C FEJLM - Integer. FEJLM=0 indicates that the call is successful. +C Error diagnostics are given by means of positive values of +C this parameter as follows: +C FEJLM = 1 - N is out of range. +C FEJLM = 2 - M is out of range. +C FEJLM = 3 - C is out of range. +C FEJLM = 4 - INDEX is out of range. +C FEJLM = 5 - NN is out of range. +C FEJLM = 7 - ALPHA is out of range. +C +C +C +C + REAL*8 A, ALPHA, ALPHA1 + INTEGER M, N, NZ, C, NN, FEJLM, M1, NZ1, RR1, RR2, RR3, K + INTEGER M2, N2 + INTEGER SNR, RNR + DIMENSION A(NN), SNR(NN), RNR(NN) + M1 = M + FEJLM = 0 + NZ1 = INDEX*M + 110 + K = 1 + ALPHA1 = ALPHA + INDEX1 = INDEX - 1 +C +C Check the parameters. +C + IF(N.GE.22) GO TO 1 +2 FEJLM = 1 + RETURN +1 IF(N.GT.9000000) GO TO 2 + IF(M.GE.N) GO TO 3 +4 FEJLM = 2 + RETURN +3 IF(M.GT.9000000) GO TO 4 + IF(C.LT.11)GO TO 6 + IF(N-C.GE.11)GO TO 5 +6 FEJLM = 3 + RETURN +5 IF(INDEX.LT.1) GO TO 12 + IF(N-C-INDEX.GE.9)GO TO 13 +12 FEJLM = 4 +13 IF(NN.GE.NZ1)GO TO 7 +8 FEJLM = 5 + RETURN +7 IF(NN.GT.9000000)GO TO 8 + IF(ALPHA.GT.0.0)GO TO 9 + FEJLM = 6 + RETURN +9 CONTINUE +C +C End of the error check. Begin to generate the non-zero elements of +C the required matrix. +C + DO 20 I=1,N + A(I) = 1.0d0 + SNR(I) = I +20 RNR(I) = I + NZ = N + J1 = 1 + IF(INDEX1.EQ.0) GO TO 81 + DO 21 J = 1,INDEX1 + J1 = -J1 + DO 22 I=1,N + A(NZ+I) = dfloat(J1*J*I) + IF(I+C+J-1.LE.N)SNR(NZ+I) = I + C + J - 1 + IF(I+C+J-1.GT.N)SNR(NZ+I) = C + I + J - 1 - N +22 RNR(NZ + I) = I +21 NZ = NZ + N +81 RR1 = 10 + RR2 = NZ + RR3 = 1 +25 CONTINUE + DO 26 I=1,RR1 + A(RR2 + I) = ALPHA*dfloat(I) + SNR(RR2+I) = N - RR1 + I + RNR(RR2+I) = RR3 +26 CONTINUE + IF(RR1.EQ.1) GO TO 27 + RR2 = RR2 + RR1 + RR1 = RR1 - 1 + RR3 = RR3 + 1 + GO TO 25 +27 NZ = NZ + 55 +29 M1 = M1 - N + ALPHA = 1.0d0/ALPHA + IF(M1.LE.0) GO TO 28 + N2 = K*N + IF(M1.GE.N)M2 = N + IF(M1.LT.N)M2 = M1 + DO 30 I=1,M2 + A(NZ+I) = ALPHA*dfloat(K+1) + SNR(NZ + I) = I +30 RNR(NZ + I) = N2 + I + NZ = NZ + M2 + IF(INDEX1.EQ.0) GO TO 82 + J1 = 1 + DO 41 J = 1,INDEX1 + J1 = -J1 + DO 42 I = 1,M2 + A(NZ+I) = ALPHA*dFLOAT(J*J1)*(dfloat((K+1)*I)+1.0d0) + IF(I+C+J-1.LE.N)SNR(NZ+I) = I + C + J - 1 + IF(I+C+J-1.GT.N)SNR(NZ+I) = C + I + J - 1 - N +42 RNR(NZ + I) = N2 + I +41 NZ = NZ +M2 +82 K = K + 1 + GO TO 29 +28 CONTINUE + ALPHA = 1.0d0/ALPHA1 + RR1 = 1 + RR2 = NZ +35 CONTINUE + DO 36 I = 1,RR1 + A(RR2+I) = ALPHA*dfloat(RR1+1-I) + SNR(RR2+I) = I + RNR(RR2+I) = N - 10 + RR1 +36 CONTINUE + IF(RR1.EQ.10) GO TO 34 + RR2 = RR2 + RR1 + RR1 = RR1 + 1 + GO TO 35 +34 NZ = NZ + 55 + ALPHA = ALPHA1 + RETURN + END + SUBROUTINE DCN(AR,IA,JA,N,NE,IC,NN,IERR) +C----------------------------------------------------------------------- +C +C PURPOSE +C ------- +C The subroutine generates sparse (square) matrices of the type +C D(N,C). This type of matrix has the following characteristics: +C 1's in the diagonal, three bands at the distance C above the +C diagonal (and reappearing cyclicly under it), and a 10 x 10 +C triangle of elements in the upper right-hand corner. +C Different software libraries require different storage schemes. +C This subroutine generates the matrix in the storage by +C indices mode. +C +C +C Note: If A is the sparse matrix of type D(N,C), then +C +C min|A(i,j)| = 1, max|A(i,j)| = max(1000,N + 1) +C +C +C +C CONTRIBUTOR: Ernest E. Rothman +C Cornell Theory Center/Cornell National Supercomputer +C Facility. +C e-mail address: BITNET: eer@cornellf +C INTERNET: eer@cornellf.tn.cornell.edu +C +C +C REFERENCE +C --------- +C 1) Zlatev, Zahari; Schaumburg, Kjeld; Wasniewski, Jerzy; +C "A Testing Scheme for Subroutines Solving Large Linear Problems", +C Computers and Chemistry, Vol. 5, No. 2-3, pp. 91-100, 1981. +C 2) Osterby, Ole and Zletev, Zahari; +C "Direct Methods for Sparse Matrices"; +C Springer-Verlag 1983. +C +C +C +C INPUT PARAMETERS +C ---------------- +C N - Integer. The size of the square matrix. +C N > 13 must be specified. +C +C NN - Integer. The dimension of integer arrays IA and JA and +C real array AR. Must be at least NE. +C +C IC - Integer. The sparsity pattern can be changed by means of this +C parameter. 0 < IC < N-12 must be specified. +C +C +C OUTPUT PARAMETERS +C ----------------- +C NE - Integer. The number of nonzero elements in the sparse matrix +C of the type D(N,C). NE = 4*N + 55. +C +C AR(NN) - Real array. (Double precision) +C Stored entries of a sparse matrix to be generated by this +C subroutine. +C NN is greater then or equal to, NE, the number of +C nonzeros including a mandatory diagonal entry for +C each row. Entries are stored by indices. +C +C IA(NN) - Integer array. +C Pointers to specify rows for the stored nonzero entries +C in AR. +C +C JA(NN) - Integer array. +C Pointers to specify columns for the stored nonzero entries +C in AR. +C +C IERR - Error parameter is returned as zero on successful +C execution of the subroutine. +C Error diagnostics are given by means of positive values +C of this parameter as follows: +C IERR = 1 - N is out of range. +C IERR = 2 - IC is out of range. +C IERR = 3 - NN is out of range. +C +C---------------------------------------------------------------------- +C + real*8 ar(nn) + integer ia(nn), ja(nn), ierr + ierr = 0 +c +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Check the input parameters: +c + if(n.le.13)then + ierr = 1 + return + endif + if(ic .le. 0 .or. ic .ge. n-12)then + ierr = 2 + return + endif + ne = 4*n+55 + if(nn.lt.ne)then + ierr = 3 + return + endif +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +c +c Begin to generate the nonzero elements as well as the row and column +c pointers: +c + do 20 i=1,n + ar(i) = 1.0d0 + ia(i) = i + ja(i) = i +20 continue + ilast = n + do 30 i=1,n-ic + it = ilast + i + ar(it) = 1.0 + dfloat(i) + ia(it) = i + ja(it) = i+ic +30 continue + ilast = ilast + n-ic + do 40 i=1,n-ic-1 + it = ilast + i + ar(it) = -dfloat(i) + ia(it) = i + ja(it) = i+ic+1 +40 continue + ilast = ilast + n-ic-1 + do 50 i=1,n-ic-2 + it = ilast + i + ar(it) = 16.0d0 + ia(it) = i + ja(it) = i+ic+2 +50 continue + ilast = ilast + n-ic-2 + icount = 0 + do 70 j=1,10 + do 60 i=1,11-j + icount = icount + 1 + it = ilast + icount + ar(it) = 100.0d0 * dfloat(j) + ia(it) = i + ja(it) = n-11+i+j +60 continue +70 continue + icount = 0 + ilast = 55 + ilast + do 80 i=n-ic+1,n + icount = icount + 1 + it = ilast + icount + ar(it) = 1.0d0 + dfloat(i) + ia(it) = i + ja(it) = i-n+ic +80 continue + ilast = ilast + ic + icount = 0 + do 90 i=n-ic,n + icount = icount + 1 + it = ilast + icount + ar(it) = -dfloat(i) + ia(it) = i + ja(it) = i-n+ic+1 +90 continue + ilast = ilast + ic + 1 + icount = 0 + do 100 i=n-ic-1,n + icount = icount + 1 + it = ilast + icount + ar(it) = 16.0d0 + ia(it) = i + ja(it) = i-n+ic+2 +100 continue +c ilast = ilast + ic + 2 +c if(ilast.ne.4*n+55) then +c write(*,*)' ilast equal to ', ilast +c write(*,*)' ILAST, the number of nonzeros, should = ', 4*n + 55 +c stop +c end if +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + return + end + SUBROUTINE ECN(N,IC,NE,IA,JA,AR,NN,IERR) +C---------------------------------------------------------------------- +C +C PURPOSE +C ------- +C The subroutine generates sparse (square) matrices of the type +C E(N,C). This type of matrix has the following characteristics: +C Symmetric, positive-definite, N x N matrices with 4 in the diagonal +C and -1 in the two sidediagonal and in the two bands at the distance +C C from the diagonal. These matrices are similar to matrices obtained +C from using the five-point formula in the discretization of the +C elliptic PDE. +C +C +C Note: If A is the sparse matrix of type E(N,C), then +C +C min|A(i,j)| = 1, max|A(i,j)| = 4 +C +C +C +C CONTRIBUTOR: Ernest E. Rothman +C Cornell Theory Center/Cornell National Supercomputer +C Facility. +C e-mail address: BITNET: eer@cornellf +C INTERNET: eer@cornellf.tn.cornell.edu +C +C +C REFERENCE +C --------- +C 1) Zlatev, Zahari; Schaumburg, Kjeld; Wasniewski, Jerzy; +C "A Testing Scheme for Subroutines Solving Large Linear Problems", +C Computers and Chemistry, Vol. 5, No. 2-3, pp. 91-100, 1981. +C 2) Osterby, Ole and Zletev, Zahari; +C "Direct Methods for Sparse Matrices"; +C Springer-Verlag 1983. +C +C +C +C INPUT PARAMETERS +C ---------------- +C N - Integer. The size of the square matrix. +C N > 2 must be specified. +C +C NN - Integer. The dimension of integer arrays IA and JA and +C real array AR. Must be at least NE. +C +C NN - Integer. The dimension of integer array JA. Must be at least +C NE. +C +C IC - Integer. The sparsity pattern can be changed by means of this +C parameter. 1 < IC < N must be specified. +C +C +C +C OUTPUT PARAMETERS +C ----------------- +C NE - Integer. The number of nonzero elements in the sparse matrix +C of the type E(N,C). NE = 5*N - 2*IC - 2 . +C +C AR(NN) - Real array. +C Stored entries of the sparse matrix A. +C NE is the number of nonzeros including a mandatory +C diagonal entry for each row. +C +C IA(NN) - Integer array.(Double precision) +C Pointers to specify rows for the stored nonzero entries +C in AR. +C +C JA(NN) - Integer array. +C Pointers to specify columns for the stored nonzero entries +C in AR. +C +C IERR - Error parameter is returned as zero on successful +C execution of the subroutine. +C Error diagnostics are given by means of positive values +C of this parameter as follows: +C IERR = 1 - N is out of range. +C IERR = 2 - IC is out of range. +C IERR = 3 - NN is out of range. +C +C--------------------------------------------------------------------- +C +C + real*8 ar(nn) + integer ia(nn), ja(nn), n, ne, ierr + ierr = 0 +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +c +Check the input parameters: +c + if(n.le.2)then + ierr = 1 + return + endif + if(ic.le.1.or.ic.ge.n)then + ierr = 2 + return + endif +c + ne = 5*n-2*ic-2 + if(nn.lt.ne)then + ierr = 3 + return + endif +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +c +c Begin to generate the nonzero elements as well as the row and column +c pointers: +c + do 20 i=1,n + ar(i) = 4.0d0 + ia(i) = i + ja(i) = i +20 continue + ilast = n + do 30 i=1,n-1 + it = ilast + i + ar(it) = -1.0d0 + ia(it) = i+1 + ja(it) = i +30 continue + ilast = ilast + n - 1 + do 40 i=1,n-1 + it = ilast + i + ar(it) = -1.0d0 + ia(it) = i + ja(it) = i+1 +40 continue + ilast = ilast + n-1 + do 50 i=1,n-ic + it = ilast + i + ar(it) = -1.0d0 + ia(it) = i+ic + ja(it) = i +50 continue + ilast = ilast + n-ic + do 60 I=1,n-ic + it = ilast + i + ar(it) = -1.0d0 + ia(it) = i + ja(it) = i+ic +60 continue +c ilast = ilast + n-ic +c if(ilast.ne.5*n-2*ic-2) then +c write(*,*)' ilast equal to ', ilast +c write(*,*)' ILAST, the no. of nonzeros, should = ', 5*n-2*ic-2 +c stop +c end if +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + return + end + diff --git a/MATGEN/README b/MATGEN/README new file mode 100644 index 0000000..9e1564b --- /dev/null +++ b/MATGEN/README @@ -0,0 +1,57 @@ +------------------------------------------------------------- + SPARSKIT MODULE MATGEN +------------------------------------------------------------- + + The current directory MATGEN contains a few subroutines and + drivers for generating sparse matrices. + + 1) 5-pt and 7-pt matrices on rectangular regions discretizing + elliptic operators of the form: + + L u == delx( a delx u ) + dely ( b dely u) + delz ( c delz u ) + + delx ( d u ) + dely (e u) + delz( f u ) + g u = h u + + with Boundary conditions, + alpha del u / del n + beta u = gamma + on a rectangular 1-D, 2-D or 3-D grid using centered + difference scheme or upwind scheme. + + The functions a, b, ..., h are known through the + subroutines afun, bfun, ..., hfun in the file + functns.f. The alpha is a constant on each side of the + rectanglar domain. the beta and the gamma are defined + by the functions betfun and gamfun (see functns.f for + examples). + + 2) block version of the finite difference matrices (several degrees of + freedom per grid point. ) It only generates the matrix (without + the right-hand-side), only Dirichlet Boundary conditions are used. + + 3) Finite element matrices for the convection-diffusion problem + + - Div ( K(x,y) Grad u ) + C(x,y) Grad u = f + u = 0 on boundary + + (with Dirichlet boundary conditions). The matrix is returned + assembled in compressed sparse row format. See genfeu for + matrices in unassembled form. The user must provide the grid, + (coordinates x, y and connectivity matrix ijk) as well as some + information on the nodes (nodcode) and the material properties + (the function K(x,y) above) in the form of a subroutine xyk. + + 4) Markov chain matrices arising from a random walk on a + trangular grid. Useful for testing nonsymmetric eigenvalue + codes. Has been suggested by G.W. Stewart in one of his + papers. Used by Y. Saad in several papers as a test problem + for nonsymmetric eigenvalue methods. + + 5) Matrices from the paper by Z. Zlatev, K. Schaumburg, + and J. Wasniewski. (``A testing scheme for subroutines solving + large linear problems.'' Computers and Chemistry, 5:91--100, + 1981.) + +---------------------------------------------------------------------- + the items (1) and (2) are in directory FDIF, + the item (3) is in directory FEM + the items (4) and (5) are in directory MISC + diff --git a/ORDERINGS/README b/ORDERINGS/README new file mode 100644 index 0000000..285a852 --- /dev/null +++ b/ORDERINGS/README @@ -0,0 +1,55 @@ +------------------------------------------------------------ + SPARSKIT MODULE ORDERINGS +------------------------------------------------------------- + + The current directory ORDERINGS contains a few subroutines for + finding some of the standard reorderings for a given matrix. + +levset.f -- level set based algorithms + + dblstr : doubled stripe partitioner + rdis : recursive dissection partitioner + dse2way : distributed site expansion usuing sites from dblstr + dse : distributed site expansion usuing sites from rdis + BFS : Breadth-First search traversal algorithm + add_lvst : routine to add a level -- used by BFS + stripes : finds the level set structure + stripes0 : finds a trivial one-way partitioning from level-sets + perphn : finds a pseudo-peripheral node and performs a BFS from it. + mapper4 : routine used by dse and dse2way to do center expansion + get_domns: routine to find subdomaine from linked lists found by + mapper4. + add_lk : routine to add entry to linked list -- used by mapper4. + find_ctr : routine to locate an approximate center of a subgraph. + rversp : routine to reverse a given permutation (e.g., for RCMK) + maskdeg : integer function to compute the `masked' of a node + +color.f -- algorithms for independent set ordering and multicolor + orderings + + multic : greedy algorithm for multicoloring + indset0 : greedy algorithm for independent set ordering + indset1 : independent set ordering using minimal degree traversal + indset2 : independent set ordering with local minimization + indset3 : independent set ordering by vertex cover algorithm + +ccn.f -- code for strongly connected components + + blccnx : Driver routine to reduce the structure of a matrix + to its strongly connected components. + cconex : Main routine to compute the strongly connected components + of a (block diagonal) matrix. + anccnx : We put in ICCNEX the vertices marked in the component MCCNEX. + newcnx : We put in ICCNEX the vertices marked in the component + MCCNEX. We modify also the vector KPW. + blccn1 : Parallel computation of the connected components of a + matrix. The parallel loop is performed only if the matrix + has a block diagonal structure. + icopy : We copy an integer vector into anothoer. + compos : We calculate the composition between two permutation + vectors. + invlpw : We calculate the inverse of a permutation vector. + numini : We initialize a vector to the identity. + tbzero : We initialize to ZERO an integer vector. + iplusa : Given two integers IALPHA and IBETA, for an integer vector + IA we calculate IA(i) = ialpha + ibeta * ia(i) diff --git a/ORDERINGS/ccn.f b/ORDERINGS/ccn.f new file mode 100644 index 0000000..eee5836 --- /dev/null +++ b/ORDERINGS/ccn.f @@ -0,0 +1,709 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c REORDERING ROUTINES -- STRONGLY CONNECTED COMPONENTS c +c----------------------------------------------------------------------c +c Contributed by: +C Laura C. Dutto - email: dutto@cerca.umontreal.ca +c July 1992 - Update: March 1994 +C----------------------------------------------------------------------- +c CONTENTS: +c -------- +c blccnx : Driver routine to reduce the structure of a matrix +c to its strongly connected components. +c cconex : Main routine to compute the strongly connected components +c of a (block diagonal) matrix. +c anccnx : We put in ICCNEX the vertices marked in the component MCCNEX. +c newcnx : We put in ICCNEX the vertices marked in the component +c MCCNEX. We modify also the vector KPW. +c blccn1 : Parallel computation of the connected components of a +c matrix. The parallel loop is performed only if the matrix +c has a block diagonal structure. +c ccnicopy:We copy an integer vector into anothoer. +c compos : We calculate the composition between two permutation +c vectors. +c invlpw : We calculate the inverse of a permutation vector. +c numini : We initialize a vector to the identity. +c tbzero : We initialize to ZERO an integer vector. +c iplusa : Given two integers IALPHA and IBETA, for an integer vector +c IA we calculate IA(i) = ialpha + ibeta * ia(i) +C +c----------------------------------------------------------------------c + subroutine BLCCNX(n, nbloc, nblcmx, nsbloc, job, lpw, amat, ja, + * ia, iout, ier, izs, nw) +C----------------------------------------------------------------------- +c +c This routine determines if the matrix given by the structure +c IA et JA is irreductible. If not, it orders the unknowns such +c that all the consecutive unknowns in KPW between NSBLOC(i-1)+1 +c and NSBLOC(i) belong to the ith component of the matrix. +c The numerical values of the matrix are in AMAT. They are modified +c only if JOB = 1 and if we have more than one connected component. +c +c On entry: +c -------- +c n = row and column dimension of the matrix +c nblcmx = maximum number of connected components allowed. The size +c of NSBLOC is nblcmx + 1 (in fact, it starts at 0). +c job = integer indicating the work to be done: +c job = 1 if the permutation LPW is modified, we +c permute not only the structure of the matrix +c but also its numerical values. +c job.ne.1 if the permutation LPW is modified, we permute +c the structure of the matrix ignoring real values. +c iout = impression parameter. If 0 < iout < 100, we print +c comments and error messages on unit IOUT. +c nw = length of the work vector IZS. +c +c Input / output: +c -------------- +c nbloc = number of connected components of the matrix. If the +c matrix is not irreductible, nbloc > 1. We allow +c nbloc > 1 on entry; in this case we calculate the +c number of connected components in each previous one. +c nsbloc = integer array of length NBLOC + 1 containing the pointers +c to the first node of each component on the old (input) +c and on the new (output) ordering. +c lpw = integer array of length N corresponding to the +c permutation of the unknowns. We allow LPW to be a vector +c different from the identity on input. +c amat = real*8 values of the matrix given by the structure IA, JA. +c ja = integer array of length NNZERO (= IA(N+1)-IA(1)) corresponding +c to the column indices of nonzero elements of the matrix, stored +c rowwise. It is modified only if the matrix has more +c than one connected component. +c ia = integer array of length N+1 corresponding to the +c pointer to the beginning of each row in JA (compressed +c sparse row storage). It is modified only if +c the matrix has more than one connected component. +c +c On return: +c ---------- +c ier = integer. Error message. Normal return ier = 0. +c +c Work space: +c ---------- +c izs = integer vector of length NW +c +C----------------------------------------------------------------------- +C Laura C. Dutto - email: dutto@cerca.umontreal.ca +c July 1992 - Update: March 1994 +C----------------------------------------------------------------------- + integer izs(nw), lpw(n), nsbloc(0:nblcmx), ia(n+1), ja(*) + real*8 amat(*) + logical impr + character*6 chsubr +C----------------------------------------------------------------------- + ier = 0 + impr = iout.gt.0.and.iout.le.99 + ntb = ia(n+1) - 1 + mxccex = max(nblcmx,20) +c.....The matrix AMAT is a real*8 vector + ireal = 2 +c +c.....MXPTBL: maximal number of vertices by block + mxptbl = 0 + do ibloc = 1, nbloc + mxptbl = max( mxptbl, nsbloc(ibloc) - nsbloc(ibloc-1)) + enddo +c + long1 = nbloc * mxptbl + long2 = nbloc * (mxccex+1) +c.....Dynamic allocation of memory + iend = 1 + iiend = iend + ilpw = iiend + ikpw = ilpw + n + ilccnx = ikpw + long1 + imark = ilccnx + long2 + iend = imark + n + if(iend .gt. nw) go to 220 +c + nbloc0 = nbloc + chsubr = 'BLCCN1' +c.....We determine if the matrix has more than NBLOC0 connected components. + call BLCCN1(n, nbloc, nblcmx, nsbloc, izs(ilpw), izs(ikpw), ia, + * ja, izs(imark), mxccex, izs(ilccnx), mxptbl, iout, + * ier) + if(ier.ne.0) go to 210 +c + if(nbloc .gt. nbloc0) then +c..........The matrix has more than NBLOC0 conneted components. So, we +c..........modify the vectors IA and JA to take account of the new permutation. + nfree = iend - ikpw + call tbzero(izs(ikpw), nfree) + iiat = ikpw + ijat = iiat + n + 1 + iamat = ijat + ntb + iend = iamat + if(job .eq. 1) iend = iamat + ireal * ntb + if(iend .gt. nw) go to 220 +c +c..........We copy IA and JA on IAT and JAT respectively + call ccnicopy(n+1, ia, izs(iiat)) + call ccnicopy(ntb, ja, izs(ijat)) + if(job .eq. 1) call dcopy(ntb, amat, 1, izs(iamat), 1) + call dperm(n, izs(iamat), izs(ijat), izs(iiat), amat, + * ja, ia, izs(ilpw), izs(ilpw), job) + ipos = 1 +c..........We sort columns inside JA. + call csrcsc(n, job, ipos, amat, ja, ia, izs(iamat), + * izs(ijat), izs(iiat)) + call csrcsc(n, job, ipos, izs(iamat), izs(ijat), izs(iiat), + * amat, ja, ia) + endif +c.....We modify the ordering of unknowns in LPW + call compos(n, lpw, izs(ilpw)) +c + 120 nfree = iend - iiend + call tbzero(izs(iiend), nfree) + iend = iiend + return +c + 210 IF(IMPR) WRITE(IOUT,310) chsubr,ier + go to 120 + 220 IF(IMPR) WRITE(IOUT,320) nw, iend + if(ier.eq.0) ier = -1 + go to 120 +c + 310 FORMAT(' ***BLCCNX*** ERROR IN ',a6,'. IER = ',i8) + 320 FORMAT(' ***BLCCNX*** THERE IS NOT ENOUGH MEMORY IN THE WORK', + 1 ' VECTOR.'/13X,' ALLOWED MEMORY = ',I10,' - NEEDED', + 2 ' MEMORY = ',I10) + end +c ********************************************************************** + subroutine CCONEX(n, icol0, mxccnx, lccnex, kpw, ia, ja, mark, + * iout, ier) +C----------------------------------------------------------------------- +c +c This routine determines if the matrix given by the structure +c IA and JA is irreductible. If not, it orders the unknowns such +c that all the consecutive unknowns in KPW between LCCNEX(i-1)+1 +c and LCCNEX(i) belong to the ith component of the matrix. +c The structure of the matrix could be nonsymmetric. +c The diagonal vertices (if any) will belong to the last connected +c component (convention). +c +c On entry: +c -------- +c n = row and column dimension of the matrix +c icol0 = the columns of the matrix are between ICOL0+1 and ICOL0+N +c iout = impression parameter. If 0 < IOUT < 100, we print +c comments and error messages on unit IOUT. +c ia = integer array of length N+1 corresponding to the +c pointer to the beginning of each row in JA (compressed +c sparse row storage). +c ja = integer array of length NNZERO (= IA(N+1)-IA(1)) +c corresponding to the column indices of nonzero elements +c of the matrix, stored rowwise. +c +c Input/Output: +c ------------ +c mxccnx = maximum number of connected components allowed on input, +c and number of connected components of the matrix, on output. +c +c On return: +c ---------- +c lccnex = integer array of length MXCCNX + 1 containing the pointers +c to the first node of each component, in the vector KPW. +c kpw = integer array of length N corresponding to the +c inverse of permutation vector. +c ier = integer. Error message. Normal return ier = 0. +c +c Work space: +c ---------- +c mark = integer vector of length N +c +C----------------------------------------------------------------------- +C Laura C. Dutto - email: dutto@cerca.umontreal.ca +c July 1992 - Update: March 1994 +C----------------------------------------------------------------------- + dimension ia(n+1), lccnex(0:mxccnx), kpw(n), ja(*), mark(n) + logical impr +C----------------------------------------------------------------------- + ier = 0 + ipos = ia(1) - 1 + impr = iout.gt.0.and.iout.le.99 +c + nccnex = 0 +c.....We initialize MARK to zero. At the end of the algorithm, it would +c.....indicate the number of connected component associated with the vertex. +c.....The number (-1) indicates that the row associated with this vertex +c.....is a diagonal row. This value could be modified because we accept +c.....a non symmetric matrix. All the diagonal vertices will be put in +c.....the same connected component. + call tbzero(mark, n) +c + 5 do i = 1,n + if(mark(i) .eq. 0) then + ideb = i + go to 15 + endif + enddo + go to 35 +c + 15 if( ia(ideb+1) - ia(ideb) .eq. 1) then +c..........The row is a diagonal row. + mark(ideb) = -1 + go to 5 + endif + iccnex = nccnex + 1 + if(iccnex .gt. mxccnx) go to 220 + index = 0 + newind = 0 + jref = 0 + mark(ideb) = iccnex + index = index + 1 + kpw(index) = ideb +c + 20 jref = jref + 1 + ideb = kpw(jref) + + do 30 ir = ia(ideb)-ipos, ia(ideb+1)-ipos-1 + j = ja(ir) - icol0 + mccnex = mark(j) + if(mccnex .le. 0) then + index = index + 1 + kpw(index) = j + mark(j) = iccnex + else if( mccnex .eq. iccnex) then + go to 30 + else if( mccnex .gt. iccnex) then +c.............We realize that the connected component MCCNX is, +c.............in fact, included in this one. We modify MARK and KPW. + call NEWCNX(n, mccnex, iccnex, index, kpw, mark) + if(mccnex .eq. nccnex) nccnex = nccnex - 1 + else +c.............We realize that the previously marked vertices belong, +c.............in fact, to the connected component ICCNX. We modify MARK. + call ANCCNX(n, iccnex, mccnex, mark, nwindx) + iccnex = mccnex + newind = newind + nwindx + endif + 30 continue + if(jref .lt. index) go to 20 +c +c.....We have finished with this connected component. + index = index + newind + if(iccnex .eq. nccnex+1) nccnex = nccnex + 1 + go to 5 +c....................................................................... +c +c We have partitioned the graph in its connected components! +c +c....................................................................... + 35 continue +c +c.....All the vertices have been already marked. Before modifying KPW +c.....(if necessary), we put the diagonal vertex (if any) in the last +c.....connected component. + call tbzero(lccnex(1), nccnex) +c + idiag = 0 + do i = 1, n + iccnex = mark(i) + if(iccnex .eq. -1) then + idiag = idiag + 1 + if(idiag .eq. 1) then + nccnex = nccnex + 1 + if(nccnex .gt. mxccnx) go to 220 + if(impr) write(iout,340) + endif + mark(i) = nccnex + else + lccnex(iccnex) = lccnex(iccnex) + 1 + endif + enddo + if(idiag .ge. 1) lccnex(nccnex) = idiag +c + if(nccnex .eq. 1) then + lccnex(nccnex) = n + go to 40 + endif +c + iccnex = 1 + 8 if(iccnex .gt. nccnex) go to 12 + if(lccnex(iccnex) .le. 0) then + do i = 1, n + if(mark(i) .ge. iccnex) mark(i) = mark(i) - 1 + enddo + nccnex = nccnex - 1 + do mccnex = iccnex, nccnex + lccnex(mccnex) = lccnex(mccnex + 1) + enddo + else + iccnex = iccnex + 1 + endif + go to 8 +c + 12 index = 0 + do iccnex = 1, nccnex + noeicc = lccnex(iccnex) + lccnex(iccnex) = index + index = index + noeicc + enddo + if(index .ne. n) go to 210 +c +c.....We define correctly KPW + do i = 1,n + iccnex = mark(i) + index = lccnex(iccnex) + 1 + kpw(index) = i + lccnex(iccnex) = index + enddo +c + 40 mxccnx = nccnex + lccnex(0) = nccnex + if(nccnex .eq. 1) call numini(n, kpw) + return +c + 210 if(impr) write(iout,310) index,n + go to 235 + 220 if(impr) write(iout,320) nccnex, mxccnx + go to 235 + 235 ier = -1 + return +c + 310 format(' ***CCONEX*** ERROR TRYING TO DETERMINE THE NUMBER', + * ' OF CONNECTED COMPONENTS.'/13X,' NUMBER OF MARKED', + * ' VERTICES =',i7,3x,'TOTAL NUMBER OF VERTICES =',I7) + 320 format(' ***CCONEX*** THE ALLOWED NUMBER OF CONNECTED COMPONENTS', + * ' IS NOT ENOUGH.'/13X,' NECESSARY NUMBER = ',I4, + * 5x,' ALLOWED NUMBER = ',I4) + 323 format(' ***CCONEX*** ERROR IN ',A6,'. IER = ',I8) + 340 format(/' ***CCONEX*** THE LAST CONNECTED COMPONENT WILL', + * ' HAVE THE DIAGONAL VERTICES.') + end +c ********************************************************************** + subroutine ANCCNX(n, mccnex, iccnex, mark, ncount) +C----------------------------------------------------------------------- +c +c We put in ICCNEX the vertices marked in the component MCCNEX. +C +C----------------------------------------------------------------------- +c include "NSIMPLIC" + dimension mark(n) +C----------------------------------------------------------------------- +C Laura C. Dutto - email: dutto@cerca.umontreal.ca - December 1993 +C----------------------------------------------------------------------- + ncount = 0 + do i = 1, n + if( mark(i) .eq. mccnex) then + mark(i) = iccnex + ncount = ncount + 1 + endif + enddo +c + return + end +c ********************************************************************** + subroutine NEWCNX(n, mccnex, iccnex, index, kpw, mark) +C----------------------------------------------------------------------- +c +c We put in ICCNEX the vertices marked in the component MCCNEX. We +c modify also the vector KPW. +C +C----------------------------------------------------------------------- +c include "NSIMPLIC" + dimension kpw(*), mark(n) +C----------------------------------------------------------------------- +C Laura C. Dutto - email: dutto@cerca.umontreal.ca - December 1993 +C----------------------------------------------------------------------- + do i = 1, n + if( mark(i) .eq. mccnex) then + mark(i) = iccnex + index = index + 1 + kpw(index) = i + endif + enddo +c + return + end +c ********************************************************************** + subroutine BLCCN1(n, nbloc, nblcmx, nsbloc, lpw, kpw, ia, ja, + * mark, mxccex, lccnex, mxptbl, iout, ier) +C----------------------------------------------------------------------- +c +c This routine determines if the matrix given by the structure +c IA et JA is irreductible. If not, it orders the unknowns such +c that all the consecutive unknowns in KPW between NSBLOC(i-1)+1 +c and NSBLOC(i) belong to the ith component of the matrix. +c +c On entry: +c -------- +c n = row and column dimension of the matrix +c nblcmx = The size of NSBLOC is nblcmx + 1 (in fact, it starts at 0). +c ia = integer array of length N+1 corresponding to the +c pointer to the beginning of each row in JA (compressed +c sparse row storage). +c ja = integer array of length NNZERO (= IA(N+1)-IA(1)) corresponding +c to the column indices of nonzero elements of the matrix, +c stored rowwise. +c mxccex = maximum number of connected components allowed by block. +c mxptbl = maximum number of points (or unknowns) in each connected +c component (mxptbl .le. n). +c iout = impression parameter. If 0 < iout < 100, we print +c comments and error messages on unit IOUT. +c +c Input/Output: +c ------------ +c nbloc = number of connected components of the matrix. If the +c matrix is not irreductible, nbloc > 1. We allow +c nbloc > 1 on entry; in this case we calculate the +c number of connected components in each previous one. +c nsbloc = integer array of length NBLOC + 1 containing the pointers +c to the first node of each component on the new ordering. +c Normally, on entry you put: NBLOC = 1, NSBLOC(0) = 0, +c NSBLOC(NBLOC) = N. +c +c On return: +c ---------- +c lpw = integer array of length N corresponding to the +c permutation vector (the row i goes to lpw(i)). +c ier = integer. Error message. Normal return ier = 0. +c +c Work space: +c ---------- +c kpw = integer vector of length MXPTBL*NBLOC necessary for parallel +c computation. +c mark = integer vector of length N +c lccnex = integer vector of length (MXCCEX+1)*NBLOC necessary for parallel +c computation. +c +C----------------------------------------------------------------------- +C Laura C. Dutto - e-mail: dutto@cerca.umontreal.ca +c Juillet 1992. Update: March 1994 +C----------------------------------------------------------------------- + dimension lpw(n), kpw(mxptbl*nbloc), ia(n+1), ja(*), + * lccnex((mxccex+1)*nbloc), nsbloc(0:nbloc), mark(n) + logical impr + character chsubr*6 +C----------------------------------------------------------------------- + ier = 0 + impr = iout.gt.0.and.iout.le.99 + isor = 0 +c + chsubr = 'CCONEX' + newblc = 0 +C$DOACROSS if(nbloc.gt.1), LOCAL(ibloc, ik0, ik1, ins0, ntb0, +C$& nccnex, ilccnx, info, kpibl), REDUCTION(ier, newblc) + do 100 ibloc = 1,nbloc + ik0 = nsbloc(ibloc - 1) + ik1 = nsbloc(ibloc) + ntb0 = ia(ik0+1) + if(ia(ik1+1) - ntb0 .le. 1) go to 100 + ntb0 = ntb0 - 1 + ins0 = ik1 - ik0 +c........We need more memory place for KPW1 because of parallel computation + kpibl = (ibloc-1) * mxptbl + call numini( ins0, kpw(kpibl+1)) + nccnex = mxccex + ilccnx = (mxccex+1) * (ibloc-1) + 1 +c....................................................................... +c +c Call to the main routine: CCONEX +c +c....................................................................... + call cconex(ins0, ik0, nccnex, lccnex(ilccnx), kpw(kpibl+1), + * ia(ik0+1), ja(ntb0+1), mark(ik0+1), isor, info) + ier = ier + info + if(info .ne. 0 .or. nccnex .lt. 1) go to 100 +c +c........We add the new connected components on NEWBLC + newblc = newblc + nccnex +c........We define LPW different from the identity only if there are more +c........than one connected component in this block + if(nccnex .eq. 1) then + call numini(ins0, lpw(ik0+1)) + else + call invlpw(ins0, kpw(kpibl+1), lpw(ik0+1)) + endif + call iplusa(ins0, ik0, 1, lpw(ik0+1)) + 100 continue +c + if(ier .ne. 0) go to 218 + if(newblc .eq. nbloc) go to 120 + if(newblc .gt. nblcmx) go to 230 +c +c.....We modify the number of blocks to indicate the number of connected +c.....components in the matrix. + newblc = 0 + nsfin = 0 +CDIR$ NEXT SCALAR + do ibloc = 1, nbloc + ilccnx = (mxccex+1) * (ibloc-1) + 1 + nccnex = lccnex(ilccnx) + if(nccnex .gt. 1 .and. impr) write(iout,420) ibloc,nccnex + lcc0 = 0 +CDIR$ NEXT SCALAR + do icc = 1,nccnex + newblc = newblc + 1 + nsb = lccnex(ilccnx+icc) +c...........Be careful! In LCCNEX we have the cumulated number of vertices + nsbloc(newblc) = nsfin + nsb + if(nccnex .gt. 1 .and. impr) write(iout,425) icc,nsb-lcc0 + lcc0 = nsb + enddo + nsfin = nsfin + nsb + enddo + nbloc = newblc +c + 120 return +c + 218 if(impr) write(iout,318) chsubr,ier + go to 120 + 230 if(impr) write(iout,330) newblc,nblcmx + if(ier.eq.0) ier = -1 + go to 120 +c + 318 format(' ***BLCCN1*** ERROR IN ',a6,'. IER = ',i8) + 330 format(' ***BLCCN1*** THE MEMORY SPACE ALLOWED FOR NSBLOC IS', + * ' NOT ENOUGH.'/13X,' NUMBER (NECESSARY) OF CONNECTED', + * ' COMPONENTS = ',I5/13X,' MAXIMAL NUMBER OF BLOCKS',14x, + * '= ',i5) + 420 FORMAT(' *** The block ',i3,' has ',i3,' strongly connected', + * ' components. The number of vertices by component is:') + 425 format(5x,'Component No.',i3,' - Number of vertices = ',i6) + end +C*********************************************************************** + SUBROUTINE CCNICOPY(N,IX,IY) +C....................................................................... +C We copy the vector IX on the vector IY +C....................................................................... + DIMENSION IX(n),IY(n) +C....................................................................... + IF(N.LE.0) RETURN +C$DOACROSS if(n .gt. 250), local(i) + DO 10 I = 1,N + IY(I) = IX(I) + 10 CONTINUE +C + RETURN + END +c*********************************************************************** + SUBROUTINE COMPOS(n, lpw0, lpw1) +C----------------------------------------------------------------------- +c +c We take account of the original order of unknowns. We put the +c final result on LPW0. +c +C----------------------------------------------------------------------- + DIMENSION lpw0(n), lpw1(n) +C----------------------------------------------------------------------- +c Laura C. Dutto - Mars 1994 +C----------------------------------------------------------------------- +C$DOACROSS if(n .gt. 250), local(i0) + do i0 = 1, n + lpw0(i0) = lpw1(lpw0(i0)) + enddo +c + return + end +C ********************************************************************** + SUBROUTINE INVLPW(n, lpw, kpw) +c....................................................................... +c +c KPW is the inverse of LPW +c +c....................................................................... + dimension lpw(n), kpw(n) +c....................................................................... +c Laura C. Dutto - Novembre 1993 +c....................................................................... +C$DOACROSS if(n .gt. 200), local(i0, i1) + do i0 = 1, n + i1 = lpw(i0) + kpw(i1) = i0 + enddo +c + return + end +C ********************************************************************** + subroutine NUMINI(n, lpw) +c....................................................................... + dimension lpw(n) +c....................................................................... +c +c The vector LPW is initialized as the identity. +c +c....................................................................... +c Laura C. Dutto - Novembre 1993 +c....................................................................... +C$DOACROSS if(n .gt. 250), local(i) + do i=1,n + lpw(i) = i + enddo +c + return + end +C*********************************************************************** + SUBROUTINE TBZERO(M,NMOT) +C....................................................................... +C We initialize to ZERO an integer vector of length NMOT. +C....................................................................... + DIMENSION M(NMOT) +C....................................................................... + IF(NMOT.le.0) return +C$DOACROSS if(nmot.gt.500), LOCAL(i) + DO 1 I=1,NMOT + M(I)=0 + 1 CONTINUE + RETURN + END +C ********************************************************************** + SUBROUTINE IPLUSA (n, nalpha, nbeta, ia) +c....................................................................... +C +c We add NALPHA to each element of NBETA * IA: +c +c ia(i) = nalpha + nbeta * ia(i) +c +c....................................................................... + integer ia(n) +c....................................................................... +c Laura C. Dutto - February 1994 +c....................................................................... + if(n .le. 0) return +c + nmax = 500 + if(nalpha .eq. 0) then + if(nbeta .eq. 1) return + if(nbeta .eq. -1) then +C$DOACROSS if(n .gt. nmax), local (i) + do i = 1, n + ia(i) = - ia(i) + enddo + else +C$DOACROSS if(n .gt. nmax/2), local (i) + do i = 1, n + ia(i) = nbeta * ia(i) + enddo + endif + return + endif + if(nbeta .eq. 0) then +C$DOACROSS if(n .gt. nmax), local (i) + do i = 1, n + ia(i) = nalpha + enddo + return + endif + if(nbeta .eq. -1) then +C$DOACROSS if(n .gt. nmax/2), local (i) + do i = 1, n + ia(i) = nalpha - ia(i) + enddo + else if(nbeta .eq. 1) then +C$DOACROSS if(n .gt. nmax/2), local (i) + do i = 1, n + ia(i) = nalpha + ia(i) + enddo + else +C$DOACROSS if(n .gt. nmax/3), local (i) + do i = 1, n + ia(i) = nalpha + nbeta * ia(i) + enddo + endif +c + return + end diff --git a/ORDERINGS/color.f b/ORDERINGS/color.f new file mode 100644 index 0000000..dcc5216 --- /dev/null +++ b/ORDERINGS/color.f @@ -0,0 +1,917 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c REORDERING ROUTINES -- COLORING BASED ROUTINES c +c----------------------------------------------------------------------c +c contents: c +c---------- c +c multic : greedy algorithm for multicoloring c +c indset0 : greedy algorithm for independent set ordering c +c indset1 : independent set ordering using minimal degree traversal c +c indset2 : independent set ordering with local minimization c +c indset3 : independent set ordering by vertex cover algorithm c +c HeapSort, FixHeap, HeapInsert, interchange, MoveBack, FiHeapM, c +c FixHeapM, HeapInsertM,indsetr,rndperm, are utility c +c routines for sorting, generating random permutations, etc. c +c----------------------------------------------------------------------c + subroutine multic (n,ja,ia,ncol,kolrs,il,iord,maxcol,ierr) + integer n, ja(*),ia(n+1),kolrs(n),iord(n),il(maxcol+1),ierr +c----------------------------------------------------------------------- +c multicoloring ordering -- greedy algorithm -- +c determines the coloring permutation and sets up +c corresponding data structures for it. +c----------------------------------------------------------------------- +c on entry +c -------- +c n = row and column dimention of matrix +c ja = column indices of nonzero elements of matrix, stored rowwise. +c ia = pointer to beginning of each row in ja. +c maxcol= maximum number of colors allowed -- the size of il is +c maxcol+1 at least. Note: the number of colors does not +c exceed the maximum degree of each node +1. +c iord = en entry iord gives the order of traversal of the nodes +c in the multicoloring algorithm. If there is no preference +c then set iord(j)=j for j=1,...,n +c +c on return +c --------- +c ncol = number of colours found +c kolrs = integer array containing the color number assigned to each node +c il = integer array containing the pointers to the +c beginning of each color set. In the permuted matrix +c the rows /columns il(kol) to il(kol+1)-1 have the same color. +c iord = permutation array corresponding to the multicolor ordering. +c row number i will become row nbumber iord(i) in permuted +c matrix. (iord = destination permutation array). +c ierr = integer. Error message. normal return ierr = 0. If ierr .eq.1 +c then the array il was overfilled. +c +c----------------------------------------------------------------------- +c + integer kol, i, j, k, maxcol, mycol +c + ierr = 0 + do 1 j=1, n + kolrs(j) = 0 + 1 continue + do 11 j=1, maxcol + il(j) = 0 + 11 continue +c + ncol = 0 +c +c scan all nodes +c + do 4 ii=1, n + i = iord(ii) +c +c look at adjacent nodes to determine colors already assigned +c + mcol = 0 + do 2 k=ia(i), ia(i+1)-1 + j = ja(k) + icol = kolrs(j) + if (icol .ne. 0) then + mcol = max(mcol,icol) +c +c il used as temporary to record already assigned colors. +c + il(icol) = 1 + endif + 2 continue +c +c taken colors determined. scan il until a slot opens up. +c + mycol = 1 + 3 if (il(mycol) .eq. 1) then + mycol = mycol+1 + if (mycol .gt. maxcol) goto 99 + if (mycol .le. mcol) goto 3 + endif +c +c reset il to zero for next nodes +c + do 35 j=1, mcol + il(j) = 0 + 35 continue +c +c assign color and update number of colors so far +c + kolrs(i) = mycol + ncol = max(ncol,mycol) + 4 continue +c +c every node has now been colored. Count nodes of each color +c + do 6 j=1, n + kol = kolrs(j)+1 + il(kol) = il(kol)+1 + 6 continue +c +c set pointers il +c + il(1) = 1 + do 7 j=1, ncol + il(j+1) = il(j)+il(j+1) + 7 continue +c +c set iord +c + do 8 j=1, n + kol = kolrs(j) + iord(j) = il(kol) + il(kol) = il(kol)+1 + 8 continue +c +c shift il back +c + do 9 j=ncol,1,-1 + il(j+1) = il(j) + 9 continue + il(1) = 1 +c + return + 99 ierr = 1 + return +c----end-of-multic------------------------------------------------------ +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + + subroutine indset0 (n,ja,ia,nset,iord,riord,sym,iptr) + integer n, nset, ja(*),ia(*),riord(*),iord(*) + logical sym +c---------------------------------------------------------------------- +c greedy algorithm for independent set ordering +c---------------------------------------------------------------------- +c parameters: +c ---------- +c n = row dimension of matrix +c ja, ia = matrix pattern in CRS format +c nset = (output) number of elements in the independent set +c iord = permutation array corresponding to the independent set +c ordering. Row number i will become row number iord(i) in +c permuted matrix. +c riord = reverse permutation array. Row number i in the permutated +c matrix is row number riord(i) in original matrix. +c---------------------------------------------------------------------- +c notes: works for CSR, MSR, and CSC formats but assumes that the +c matrix has a symmetric structure. +c---------------------------------------------------------------------- +c local variables +c + integer j, k1, k2, nod, k, mat + do 1 j=1, n + iord(j) = 0 + 1 continue + nummat = 1 + if (.not. sym) nummat = 2 +c +c iord used as a marker +c + nset = 0 + do 12 nod=1, n + if (iord(nod) .ne. 0) goto 12 + nset = nset+1 + iord(nod) = 1 +c +c visit all neighbors of current nod +c + ipos = 0 + do 45 mat=1, nummat + do 4 k=ia(ipos+nod), ia(ipos+nod+1)-1 + j = ja(k) + if (j .ne. nod) iord(j) = 2 + 4 continue + ipos = iptr-1 + 45 continue + 12 continue +c +c get permutation +c + k1 = 0 + k2 = nset + do 6 j=1,n + if (iord(j) .eq. 1) then + k1 = k1+1 + k = k1 + else + k2 = k2+1 + k = k2 + endif + riord(k) = j + iord(j) = k + 6 continue + return +c---------------------------------------------------------------------- + end +c---------------------------------------------------------------------- + subroutine indset1 (n,ja,ia,nset,iord,riord,iw,sym,iptr) + integer n, nset, iptr, ja(*),ia(*),riord(*),iord(*),iw(*) + logical sym +c---------------------------------------------------------------------- +c greedy algorithm for independent set ordering -- with intial +c order of traversal given by that of min degree. +c---------------------------------------------------------------------- +c parameters: +c ---------- +c n = row dimension of matrix +c ja, ia = matrix pattern in CRS format +c nset = (output) number of elements in the independent set +c iord = permutation array corresponding to the independent set +c ordering. Row number i will become row number iord(i) in +c permuted matrix. +c riord = reverse permutation array. Row number i in the permutated +c matrix is row number riord(i) in original matrix. +c---------------------------------------------------------------------- +c notes: works for CSR, MSR, and CSC formats but assumes that the +c matrix has a symmetric structure. +c---------------------------------------------------------------------- +c local variables + integer j,k1,k2,nummat,nod,k,ipos +c +c nummat is the number of matrices to loop through (A in symmetric +c pattern case (nummat=1) or A,and transp(A) otherwise (mummat=2) +c + if (sym) then + nummat = 1 + else + nummat = 2 + endif + iptrm1 = iptr-1 +c +c initialize arrays +c + do 1 j=1,n + iord(j) = j + riord(j) = j + iw(j) = 0 + 1 continue +c +c initialize degrees of all nodes +c + ipos = 0 + do 100 imat =1,nummat + do 15 j=1,n + iw(j) = iw(j) + ia(ipos+j+1)-ia(ipos+j) + 15 continue + ipos = iptrm1 + 100 continue +c +c call heapsort -- sorts nodes in increasing degree. +c + call HeapSort (iw,iord,riord,n,n) +c +c weights no longer needed -- use iw to store order of traversal. +c + do 16 j=1, n + iw(n-j+1) = iord(j) + iord(j) = 0 + 16 continue +c +c iord used as a marker +c + nset = 0 + do 12 ii = 1, n + nod = iw(ii) + if (iord(nod) .ne. 0) goto 12 + nset = nset+1 + iord(nod) = 1 +c +c visit all neighbors of current nod +c + ipos = 0 + do 45 mat=1, nummat + do 4 k=ia(ipos+nod), ia(ipos+nod+1)-1 + j = ja(k) + if (j .ne. nod) iord(j) = 2 + 4 continue + ipos = iptrm1 + 45 continue + 12 continue +c +c get permutation +c + k1 = 0 + k2 = nset + do 6 j=1,n + if (iord(j) .eq. 1) then + k1 = k1+1 + k = k1 + else + k2 = k2+1 + k = k2 + endif + riord(k) = j + iord(j) = k + 6 continue + return +c---------------------------------------------------------------------- + end +c---------------------------------------------------------------------- + subroutine indset2(n,ja,ia,nset,iord,riord,iw,sym,iptr) + integer n,nset,iptr,ja(*),ia(*),riord(n),iord(n),iw(n) + logical sym +c---------------------------------------------------------------------- +c greedy algorithm for independent set ordering -- local minimization +c using heap strategy -- +c---------------------------------------------------------------------- +c This version for BOTH unsymmetric and symmetric patterns +c---------------------------------------------------------------------- +c on entry +c -------- +c n = row and column dimension of matrix +c ja = column indices of nonzero elements of matrix,stored rowwise. +c ia = pointer to beginning of each row in ja. +c sym = logical indicating whether the matrix has a symmetric pattern. +c If not the transpose must also be provided -- appended to the +c ja, ia structure -- see description of iptr next. +c iptr = in case the matrix has an unsymmetric pattern,the transpose +c is assumed to be stored in the same arrays ia,ja. iptr is the +c location in ia of the pointer to the first row of transp(A). +c more generally, ia(iptr),...,ia(iptr+n) are the pointers to +c the beginnings of rows 1, 2, ...., n+1 (row n+1 is fictitious) +c of the transpose of A in the array ja. For example,when using +c the msr format,one can write: +c iptr = ja(n+1) +c ipos = iptr+n+2 ! get the transpose of A: +c call csrcsc (n,0,ipos,a,ja,ja,a,ja,ja(iptr)) ! and then: +c call indset(n,ja,ja,nset,iord,riord,iwk,.false.,iptr) +c +c iw = work space of length n. +c +c on return: +c---------- +c nset = integer. The number of unknowns in the independent set. +c iord = permutation array corresponding to the new ordering. The +c first nset unknowns correspond to the independent set. +c riord = reverse permutation array. +c---------------------------------------------------------------------- +c local variables -- +c + integer j,k1,k2,nummat,nod,k,ipos,i,last,lastlast,jold,jnew, + * jo,jn +c +c nummat is the number of matrices to loop through (A in symmetric +c pattern case (nummat=1) or A,and transp(A) otherwise (mummat=2) +c + if (sym) then + nummat = 1 + else + nummat = 2 + endif + iptrm1 = iptr-1 +c +c initialize arrays +c + do 1 j=1,n + iord(j) = j + riord(j) = j + iw(j) = 0 + 1 continue +c +c initialize degrees of all nodes +c + ipos = 0 + do 100 imat =1,nummat + do 15 j=1,n + iw(j) = iw(j) + ia(ipos+j+1)-ia(ipos+j) + 15 continue + 100 ipos = iptrm1 +c +c start by constructing a heap +c + do 2 i=n/2,1,-1 + j = i + call FixHeap (iw,iord,riord,j,j,n) + 2 continue +c +c main loop -- remove nodes one by one. +c + last = n + nset = 0 + 3 continue + lastlast = last + nod = iord(1) +c +c move first element to end +c + call moveback (iw,iord,riord,last) + last = last -1 + nset = nset + 1 +c +c scan all neighbors of accepted node -- move them to back -- +c + ipos = 0 + do 101 imat =1,nummat + do 5 k=ia(ipos+nod),ia(ipos+nod+1)-1 + jold = ja(k) + jnew = riord(jold) + if (jold .eq. nod .or. jnew .gt. last) goto 5 + iw(jnew) = -1 + call HeapInsert (iw,iord,riord,jnew,ichild,jnew) + call moveback (iw,iord,riord,last) + last = last -1 + 5 continue + ipos = iptrm1 + 101 continue +c +c update the degree of each edge +c + do 6 k=last+1,lastlast-1 + jold = iord(k) +c +c scan the neighbors of current node +c + ipos = 0 + do 102 imat =1,nummat + do 61 i=ia(ipos+jold),ia(ipos+jold+1)-1 + jo = ja(i) + jn = riord(jo) +c +c consider this node only if it has not been moved +c + if (jn .gt. last) goto 61 +c update degree of this neighbor + iw(jn) = iw(jn)-1 +c and fix the heap accordingly + call HeapInsert (iw,iord,riord,jn,ichild,jn) + 61 continue + ipos = iptrm1 + 102 continue + 6 continue +c +c stopping test -- end main "while"loop +c + if (last .gt. 1) goto 3 + nset = nset + last +c +c rescan all nodes one more time to determine the permutations +c + k1 = 0 + k2 = nset + do 7 j=n,1,-1 + if (iw(j) .ge. 0) then + k1 = k1+1 + k = k1 + else + k2 = k2+1 + k = k2 + endif + riord(k) = iord(j) + 7 continue + do j=1,n + iord(riord(j)) = j + enddo + return +c---------------------------------------------------------------------- + end +c---------------------------------------------------------------------- + subroutine indset3(n,ja,ia,nset,iord,riord,iw,sym,iptr) + integer n,nset,iptr,ja(*),ia(*),riord(n),iord(n),iw(n) + logical sym +c---------------------------------------------------------------------- +c greedy algorithm for independent set ordering -- local minimization +c using heap strategy -- VERTEX COVER ALGORITHM -- +c ASSUMES MSR FORMAT (no diagonal element) -- ADD A SWITCH FOR CSR -- +c---------------------------------------------------------------------- +c This version for BOTH unsymmetric and symmetric patterns +c---------------------------------------------------------------------- +c on entry +c -------- +c n = row and column dimension of matrix +c ja = column indices of nonzero elements of matrix,stored rowwise. +c ia = pointer to beginning of each row in ja. +c sym = logical indicating whether the matrix has a symmetric pattern. +c If not the transpose must also be provided -- appended to the +c ja, ia structure -- see description of iptr next. +c iptr = in case the matrix has an unsymmetric pattern,the transpose +c is assumed to be stored in the same arrays ia,ja. iptr is the +c location in ia of the pointer to the first row of transp(A). +c more generally, ia(iptr),...,ia(iptr+n) are the pointers to +c the beginnings of rows 1, 2, ...., n+1 (row n+1 is fictitious) +c of the transpose of A in the array ja. For example,when using +c the msr format,one can write: +c iptr = ja(n+1) +c ipos = iptr+n+2 ! get the transpose of A: +c call csrcsc (n,0,ipos,a,ja,ja,a,ja,ja(iptr)) ! and then: +c call indset(n,ja,ja,nset,iord,riord,iwk,.false.,iptr) +c +c iw = work space of length n. +c +c on return: +c---------- +c nset = integer. The number of unknowns in the independent set. +c iord = permutation array corresponding to the new ordering. The +c first nset unknowns correspond to the independent set. +c riord = reverse permutation array. +c---------------------------------------------------------------------- +c local variables -- +c + integer j,nummat,nod,k,ipos,i,lastnset,jold,jnew +c +c nummat is the number of matrices to loop through (A in symmetric +c pattern case (nummat=1) or A,and transp(A) otherwise (mummat=2) +c + if (sym) then + nummat = 1 + else + nummat = 2 + endif + iptrm1 = iptr-1 +c +c initialize arrays +c + do 1 j=1,n + riord(j) = j + iord(j) = j + iw(j) = 0 + 1 continue +c +c initialize degrees of all nodes +c + nnz = 0 + ipos = 0 + do 100 imat =1,nummat + do 15 j=1,n + ideg = ia(ipos+j+1)-ia(ipos+j) + iw(j) = iw(j) + ideg + nnz = nnz + ideg + 15 continue + 100 ipos = iptrm1 +c +c number of edges +c + if (sym) then nnz = 2*nnz +c +c start by constructing a Max heap +c + do 2 i=n/2,1,-1 + j = i + call FixHeapM (iw,riord,iord,j,j,n) + 2 continue + nset = n +c---------------------------------------------------------------------- +c main loop -- remove nodes one by one. +c---------------------------------------------------------------------- + 3 continue + lastnset = nset + nod = riord(1) +c +c move first element to end +c + call movebackM (iw,riord,iord,nset) + nnz = nnz - iw(nset) + nset = nset -1 +c +c scan all neighbors of accepted node -- +c + ipos = 0 + do 101 imat =1,nummat + do 5 k=ia(ipos+nod),ia(ipos+nod+1)-1 + jold = ja(k) + jnew = iord(jold) + if (jold .eq. nod .or. jnew .gt. nset) goto 5 + iw(jnew) = iw(jnew) - 1 + nnz = nnz-1 + call FixHeapM (iw,riord,iord,jnew,jnew,nset) + 5 continue + ipos = iptrm1 + 101 continue +c + if (nnz .gt. 0) goto 3 + return +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine HeapSort (a,ind,rind,n,ncut) + integer a(*),ind(n),rind(n),n, ncut +c---------------------------------------------------------------------- +c integer version -- min heap sorts decreasinly. +c---------------------------------------------------------------------- +c sorts inger keys in array a increasingly and permutes the companion +c array ind rind accrodingly. +c n = size of array +c ncut = integer indicating when to cut the process.the process is +c stopped after ncut outer steps of the heap-sort algorithm. +c The first ncut values are sorted and they are the smallest +c ncut values of the array. +c---------------------------------------------------------------------- +c local variables +c + integer i,last, j,jlast +c +c Heap sort algorithm --- +c +c build heap + do 1 i=n/2,1,-1 + j = i + call FixHeap (a,ind,rind,j,j,n) + 1 continue +c +c done -- now remove keys one by one +c + jlast = max(2,n-ncut+1) + do 2 last=n,jlast,-1 + call moveback (a,ind,rind,last) + 2 continue + return + end +c---------------------------------------------------------------------- + subroutine FixHeap (a,ind,rind,jkey,vacant,last) + integer a(*),ind(*),rind(*),jkey,vacant,last +c---------------------------------------------------------------------- +c inserts a key (key and companion index) at the vacant position +c in a (min) heap - +c arguments +c a(1:last) = real array +c ind(1:last) = integer array -- permutation of initial data +c rind(1:last) = integer array -- reverse permutation +c jkey = position of key to be inserted. a(jkey) +c will be inserted into the heap +c vacant = vacant where a key is to be inserted +c last = number of elements in the heap. +c---------------------------------------------------------------------- +c local variables +c + integer child,lchild,rchild,xkey + xkey = a(jkey) + ikey = ind(jkey) + lchild = 2*vacant + 1 continue + rchild = lchild+1 + child = lchild + if (rchild .le. last .and. a(rchild) .lt. a(child)) + * child = rchild + if (xkey .le. a(child) .or. child .gt. last) goto 2 + a(vacant) = a(child) + ind(vacant) = ind(child) + rind(ind(vacant)) = vacant + vacant = child + lchild = 2*vacant + if (lchild .le. last) goto 1 + 2 continue + a(vacant) = xkey + ind(vacant) = ikey + rind(ikey) = vacant + return +c---------------------------------------------------------------------- + end +c---------------------------------------------------------------------- + subroutine HeapInsert (a,ind,rind,jkey,child,node) + integer a(*),ind(*),rind(*),jkey,child,node +c---------------------------------------------------------------------- +c inserts a key to a heap from `node'. Checks values up +c only -- i.e.,assumes that the subtree (if any) whose root +c is node is such that the keys are all inferior to those +c to ge inserted. +c +c child is where the key ended up. +c---------------------------------------------------------------------- +c---- local variables + integer parent,xkey,ikey + xkey = a(jkey) + ikey = ind(jkey) +c node = node + 1 + a(node) = xkey + ind(node) = ikey + rind(ikey) = node + if (node .le. 1) return + child=node + 1 parent = child/2 + if (a(parent) .le. a(child)) goto 2 + call interchange(a,ind,rind,child,parent) + child = parent + if (child .gt. 1) goto 1 + 2 continue + return + end +c----------------------------------------------------------------------- + subroutine interchange (a,ind,rind,i,j) + integer a(*),ind(*),rind(*),i,j + integer tmp,itmp + tmp = a(i) + itmp = ind(i) +c + a(i) = a(j) + ind(i) = ind(j) +c + a(j) = tmp + ind(j) = itmp + rind(ind(j)) = j + rind(ind(i)) = i +c + return + end +c---------------------------------------------------------------------- + subroutine moveback (a,ind,rind,last) + integer a(*),ind(*),rind(*),last +c moves the front key to the back and inserts the last +c one back in from the top -- +c +c local variables +c + integer vacant,xmin +c + vacant = 1 + xmin = a(vacant) + imin = ind(vacant) + call FixHeap(a,ind,rind,last,vacant,last-1) + a(last) = xmin + ind(last) = imin + rind(ind(last)) = last +c + return + end +c---------------------------------------------------------------------- + subroutine FixHeapM (a,ind,rind,jkey,vacant,last) + integer a(*),ind(*),rind(*),jkey,vacant,last +c---- +c inserts a key (key and companion index) at the vacant position +c in a heap - THIS IS A MAX HEAP VERSION +c arguments +c a(1:last) = real array +c ind(1:last) = integer array -- permutation of initial data +c rind(1:last) = integer array -- reverse permutation +c jkey = position of key to be inserted. a(jkey) +c will be inserted into the heap +c vacant = vacant where a key is to be inserted +c last = number of elements in the heap. +c---- +c local variables +c + integer child,lchild,rchild,xkey + xkey = a(jkey) + ikey = ind(jkey) + lchild = 2*vacant + 1 continue + rchild = lchild+1 + child = lchild + if (rchild .le. last .and. a(rchild) .gt. a(child)) + * child = rchild + if (xkey .ge. a(child) .or. child .gt. last) goto 2 + a(vacant) = a(child) + ind(vacant) = ind(child) + rind(ind(vacant)) = vacant + vacant = child + lchild = 2*vacant + if (lchild .le. last) goto 1 + 2 continue + a(vacant) = xkey + ind(vacant) = ikey + rind(ikey) = vacant + return + end +c + subroutine HeapInsertM (a,ind,rind,jkey,child,node) + integer a(*),ind(*),rind(*),jkey,child,node +c---------------------------------------------------------------------- +c inserts a key to a heap from `node'. Checks values up +c only -- i.e.,assumes that the subtree (if any) whose root +c is node is such that the keys are all inferior to those +c to ge inserted. +c +c child is where the key ended up. +c---------------------------------------------------------------------- +c---- local variables + integer parent,xkey,ikey + xkey = a(jkey) + ikey = ind(jkey) +c node = node + 1 + a(node) = xkey + ind(node) = ikey + rind(ikey) = node + if (node .le. 1) return + child=node + 1 parent = child/2 + if (a(parent) .ge. a(child)) goto 2 + call interchange(a,ind,rind,child,parent) + child = parent + if (child .gt. 1) goto 1 + 2 continue + return + end +c---------------------------------------------------------------------- + subroutine movebackM (a,ind,rind,last) + integer a(*),ind(*),rind(*),last +c---------------------------------------------------------------------- +c moves the front key to the back and inserts the last +c one back in from the top -- MAX HEAP VERSION +c---------------------------------------------------------------------- +c +c local variables +c + integer vacant,xmin +c + vacant = 1 + xmin = a(vacant) + imin = ind(vacant) + call FixHeapM(a,ind,rind,last,vacant,last-1) + a(last) = xmin + ind(last) = imin + rind(ind(last)) = last +c---------------------------------------------------------------------- + return + end +c---------------------------------------------------------------------- + subroutine indsetr (n,ja,ia,nset,iord,riord,sym,iptr) + integer n, nset, ja(*),ia(*),riord(*),iord(*) + logical sym +c---------------------------------------------------------------------- +c greedy algorithm for independent set ordering -- RANDOM TRAVERSAL -- +c---------------------------------------------------------------------- +c parameters: +c ---------- +c n = row dimension of matrix +c ja, ia = matrix pattern in CRS format +c nset = (output) number of elements in the independent set +c iord = permutation array corresponding to the independent set +c ordering. Row number i will become row number iord(i) in +c permuted matrix. +c riord = reverse permutation array. Row number i in the permutated +c matrix is row number riord(i) in original matrix. +c---------------------------------------------------------------------- +c notes: works for CSR, MSR, and CSC formats but assumes that the +c matrix has a symmetric structure. +c---------------------------------------------------------------------- +c local variables +c + integer j, k1, k2, nod, k, mat + do 1 j=1, n + iord(j) = 0 + 1 continue +c +c generate random permutation +c + iseed = 0 + call rndperm(n, riord, iseed) + write (8,'(10i6)') (riord(j),j=1,n) +c + nummat = 1 + if (.not. sym) nummat = 2 +c +c iord used as a marker +c + nset = 0 + do 12 ii=1, n + nod = riord(ii) + if (iord(nod) .ne. 0) goto 12 + nset = nset+1 + iord(nod) = 1 +c +c visit all neighbors of current nod +c + ipos = 0 + do 45 mat=1, nummat + do 4 k=ia(ipos+nod), ia(ipos+nod+1)-1 + j = ja(k) + if (j .ne. nod) iord(j) = 2 + 4 continue + ipos = iptr-1 + 45 continue + 12 continue +c +c get permutation +c + k1 = 0 + k2 = nset + do 6 j=1,n + if (iord(j) .eq. 1) then + k1 = k1+1 + k = k1 + else + k2 = k2+1 + k = k2 + endif + riord(k) = j + iord(j) = k + 6 continue + return +c---------------------------------------------------------------------- + end +c---------------------------------------------------------------------- + subroutine rndperm(n,iord,iseed) + integer n, iseed, iord(n) +c---------------------------------------------------------------------- +c this subroutine will generate a pseudo random permutation of the +c n integers 1,2, ...,n. +c iseed is the initial seed. any integer. +c---------------------------------------------------------------------- +c local +c + integer i, j, itmp +c---------------------------------------------------------------------- + do j=1, n + iord(j) = j + enddo +c + do i=1, n + j = mod(irand(0),n) + 1 + itmp = iord(i) + iord(i) = iord(j) + iord(j) = itmp + enddo +c---------------------------------------------------------------------- + return +c---------------------------------------------------------------------- + end diff --git a/ORDERINGS/dsepart.f b/ORDERINGS/dsepart.f new file mode 100644 index 0000000..72306c4 --- /dev/null +++ b/ORDERINGS/dsepart.f @@ -0,0 +1,980 @@ +c----------------------------------------------------------------------c +c S P A R S K I T c +c----------------------------------------------------------------------c +c REORDERING ROUTINES -- LEVEL SET BASED ROUTINES c +c----------------------------------------------------------------------c +c dblstr : doubled stripe partitioner +c rdis : recursive dissection partitioner +c dse2way : distributed site expansion usuing sites from dblstr +c dse : distributed site expansion usuing sites from rdis +c------------- utility routines ----------------------------------------- +c BFS : Breadth-First search traversal algorithm +c add_lvst : routine to add a level -- used by BFS +c stripes : finds the level set structure +c stripes0 : finds a trivial one-way partitioning from level-sets +c perphn : finds a pseudo-peripheral node and performs a BFS from it. +c mapper4 : routine used by dse and dse2way to do center expansion +c get_domns: routine to find subdomaine from linked lists found by +c mapper4. +c add_lk : routine to add entry to linked list -- used by mapper4. +c find_ctr : routine to locate an approximate center of a subgraph. +c rversp : routine to reverse a given permutation (e.g., for RCMK) +c maskdeg : integer function to compute the `masked' of a node +c----------------------------------------------------------------------- + subroutine dblstr(n,ja,ia,ip1,ip2,nfirst,riord,ndom,map,mapptr, + * mask,levels,iwk) + implicit none + integer ndom,ja(*),ia(*),ip1,ip2,nfirst,riord(*),map(*),mapptr(*), + * mask(*),levels(*),iwk(*),nextdom +c----------------------------------------------------------------------- +c this routine does a two-way partitioning of a graph using +c level sets recursively. First a coarse set is found by a +c simple cuthill-mc Kee type algorithm. Them each of the large +c domains is further partitioned into subsets using the same +c technique. The ip1 and ip2 parameters indicate the desired number +c number of partitions 'in each direction'. So the total number of +c partitions on return ought to be equal (or close) to ip1*ip2 +c----------------------parameters---------------------------------------- +c on entry: +c--------- +c n = row dimension of matrix == number of vertices in graph +c ja, ia = pattern of matrix in CSR format (the ja,ia arrays of csr data +c structure) +c ip1 = integer indicating the number of large partitions ('number of +c paritions in first direction') +c ip2 = integer indicating the number of smaller partitions, per +c large partition, ('number of partitions in second direction') +c nfirst = number of nodes in the first level that is input in riord +c riord = (also an ouput argument). on entry riord contains the labels +c of the nfirst nodes that constitute the first level. +c on return: +c----------- +c ndom = total number of partitions found +c map = list of nodes listed partition by partition from partition 1 +c to paritition ndom. +c mapptr = pointer array for map. All nodes from position +c k1=mapptr(idom),to position k2=mapptr(idom+1)-1 in map belong +c to partition idom. +c work arrays: +c------------- +c mask = array of length n, used to hold the partition number of each +c node for the first (large) partitioning. +c mask is also used as a marker of visited nodes. +c levels = integer array of length .le. n used to hold the pointer +c arrays for the various level structures obtained from BFS. +c +c----------------------------------------------------------------------- + integer n, j,idom,kdom,jdom,maskval,k,nlev,init,ndp1,numnod + maskval = 1 + do j=1, n + mask(j) = maskval + enddo + iwk(1) = 0 + call BFS(n,ja,ia,nfirst,iwk,mask,maskval,riord,levels,nlev) +c +c init = riord(1) +c call perphn (ja,ia,mask,maskval,init,nlev,riord,levels) + call stripes (nlev,riord,levels,ip1,map,mapptr,ndom) +c----------------------------------------------------------------------- + if (ip2 .eq. 1) return + ndp1 = ndom+1 +c +c pack info into array iwk +c + do j = 1, ndom+1 + iwk(j) = ndp1+mapptr(j) + enddo + do j=1, mapptr(ndom+1)-1 + iwk(ndp1+j) = map(j) + enddo + do idom=1, ndom + j = iwk(idom) + numnod = iwk(idom+1) - iwk(idom) + init = iwk(j) + do k=j, iwk(idom+1)-1 + enddo + enddo + + do idom=1, ndom + do k=mapptr(idom),mapptr(idom+1)-1 + mask(map(k)) = idom + enddo + enddo + nextdom = 1 +c +c jdom = counter for total number of (small) subdomains +c + jdom = 1 + mapptr(jdom) = 1 +c----------------------------------------------------------------------- + do idom =1, ndom + maskval = idom + nfirst = 1 + numnod = iwk(idom+1) - iwk(idom) + j = iwk(idom) + init = iwk(j) + nextdom = mapptr(jdom) +c note: old version uses iperm array + call perphn(numnod,ja,ia,init,mask,maskval, + * nlev,riord,levels) +c + call stripes (nlev,riord,levels,ip2,map(nextdom), + * mapptr(jdom),kdom) +c + mapptr(jdom) = nextdom + do j = jdom,jdom+kdom-1 + mapptr(j+1) = nextdom + mapptr(j+1)-1 + enddo + jdom = jdom + kdom + enddo +c + ndom = jdom - 1 + return + end +c----------------------------------------------------------------------- + subroutine rdis(n,ja,ia,ndom,map,mapptr,mask,levels,size,iptr) + implicit none + integer n,ja(*),ia(*),ndom,map(*),mapptr(*),mask(*),levels(*), + * size(ndom),iptr(ndom) +c----------------------------------------------------------------------- +c recursive dissection algorithm for partitioning. +c initial graph is cut in two - then each time, the largest set +c is cut in two until we reach desired number of domains. +c----------------------------------------------------------------------- +c input +c n, ja, ia = graph +c ndom = desired number of subgraphs +c output +c ------ +c map, mapptr = pointer array data structure for domains. +c if k1 = mapptr(i), k2=mapptr(i+1)-1 then +c map(k1:k2) = points in domain number i +c work arrays: +c ------------- +c mask(1:n) integer +c levels(1:n) integer +c size(1:ndom) integer +c iptr(1:ndom) integer +c----------------------------------------------------------------------- + integer idom,maskval,k,nlev,init,nextsiz,wantsiz,lev,ko, + * maxsiz,j,nextdom +c----------------------------------------------------------------------- + idom = 1 +c----------------------------------------------------------------------- +c size(i) = size of domnain i +c iptr(i) = index of first element of domain i +c----------------------------------------------------------------------- + size(idom) = n + iptr(idom) = 1 + do j=1, n + mask(j) = 1 + enddo +c +c domain loop +c + 1 continue +c +c select domain with largest size +c + maxsiz = 0 + do j=1, idom + if (size(j) .gt. maxsiz) then + maxsiz = size(j) + nextdom = j + endif + enddo +c +c do a Prphn/ BFS on nextdom +c + maskval = nextdom + init = iptr(nextdom) + call perphn(n,ja,ia,init,mask,maskval,nlev,map,levels) +c +c determine next subdomain +c + nextsiz = 0 + wantsiz = maxsiz/2 + idom = idom+1 + lev = nlev + do while (nextsiz .lt. wantsiz) + do k = levels(lev), levels(lev+1)-1 + mask(map(k)) = idom + enddo + nextsiz = nextsiz + levels(lev+1) - levels(lev) + lev = lev-1 + enddo +c + size(nextdom) = size(nextdom) - nextsiz + size(idom) = nextsiz +c +c new initial point = last point of previous domain +c + iptr(idom) = map(levels(nlev+1)-1) +c iptr(idom) = map(levels(lev)+1) +c iptr(idom) = 1 +c +c alternative +c lev = 1 +c do while (nextsiz .lt. wantsiz) +c do k = levels(lev), levels(lev+1)-1 +c mask(map(k)) = idom +c enddo +c nextsiz = nextsiz + levels(lev+1) - levels(lev) +c lev = lev+1 +c enddo +c +c set size of new domain and adjust previous one +c +c size(idom) = nextsiz +c size(nextdom) = size(nextdom) - nextsiz +c iptr(idom) = iptr(nextdom) +c iptr(nextdom) = map(levels(lev)) + + if (idom .lt. ndom) goto 1 +c +c domains found -- build data structure +c + mapptr(1) = 1 + do idom=1, ndom + mapptr(idom+1) = mapptr(idom) + size(idom) + enddo + do k=1, n + idom = mask(k) + ko = mapptr(idom) + map(ko) = k + mapptr(idom) = ko+1 + enddo +c +c reset pointers +c + do j = ndom,1,-1 + mapptr(j+1) = mapptr(j) + enddo + mapptr(1) = 1 +c + return + end +c----------------------------------------------------------------------- + subroutine dse2way(n,ja,ia,ip1,ip2,nfirst,riord,ndom,dom,idom, + * mask,jwk,link) +c----------------------------------------------------------------------- +c uses centers obtained from dblstr partition to get new partition +c----------------------------------------------------------------------- +c input: n, ja, ia = matrix +c nfirst = number of first points +c riord = riord(1:nfirst) initial points +c output +c ndom = number of domains +c dom, idom = pointer array structure for domains. +c mask , jwk, link = work arrays, +c----------------------------------------------------------------------- + implicit none + integer n, ja(*), ia(*), ip1, ip2, nfirst, riord(*), dom(*), + * idom(*), mask(*), jwk(*),ndom,link(*) +c +c----------------------------------------------------------------------- +c local variables + integer i, mid,nsiz, maskval,init, outer, nouter, k + call dblstr(n,ja,ia,ip1,ip2,nfirst,riord,ndom,dom,idom,mask, + * link,jwk) +c + nouter = 3 +c----------------------------------------------------------------------- + + do outer =1, nouter +c +c set masks +c + do i=1, ndom + do k=idom(i),idom(i+1)-1 + mask(dom(k)) = i + enddo + enddo +c +c get centers +c + do i =1, ndom + nsiz = idom(i+1) - idom(i) + init = dom(idom(i)) + maskval = i +c +c use link for local riord -- jwk for other arrays -- +c + call find_ctr(n,nsiz,ja,ia,init,mask,maskval,link, + * jwk,mid,jwk(nsiz+1)) + riord(i) = mid + enddo +c +c do level-set expansion from centers -- save previous diameter +c + call mapper4(n,ja,ia,ndom,riord,jwk,mask,link) + call get_domns2(ndom,riord,link,jwk,dom,idom) +c----------------------------------------------------------------------- + enddo + return + end +c----------------------------------------------------------------------- + subroutine dse(n,ja,ia,ndom,riord,dom,idom,mask,jwk,link) + implicit none + integer n, ja(*), ia(*), ndom, riord(*), dom(*), + * idom(*), mask(*), jwk(*),link(*) +c----------------------------------------------------------------------- +c uses centers produced from rdis to get a new partitioning -- +c see calling sequence in rdis.. +c----------------------------------------------------------------------- +c local variables + integer i, mid, nsiz, maskval,init, outer, nouter, k +c----------------------------------------------------------------------- + nouter = 3 +c + call rdis(n,ja,ia,ndom,dom,idom,mask,link,jwk,jwk(ndom+1)) +c +c initial points = +c + do outer =1, nouter +c +c set masks +c + do i=1, ndom + do k=idom(i),idom(i+1)-1 + mask(dom(k)) = i + enddo + enddo +c +c get centers +c + do i =1, ndom + nsiz = idom(i+1) - idom(i) + init = dom(idom(i)) + maskval = i +c +c use link for local riord -- jwk for other arrays -- +c + + call find_ctr(n,nsiz,ja,ia,init,mask,maskval,link, + * jwk,mid,jwk(nsiz+1)) + riord(i) = mid + enddo +c +c do level-set expansion from centers -- save previous diameter +c + call mapper4(n,ja,ia,ndom,riord,jwk,mask,link) + call get_domns2(ndom,riord,link,jwk,dom,idom) +c----------------------------------------------------------------------- + enddo + return + end +c----------------------------------------------------------------------- + subroutine BFS(n,ja,ia,nfirst,iperm,mask,maskval,riord,levels, + * nlev) + implicit none + integer n,ja(*),ia(*),nfirst,iperm(n),mask(n),riord(*),levels(*), + * nlev,maskval +c----------------------------------------------------------------------- +c finds the level-structure (breadth-first-search or CMK) ordering for a +c given sparse matrix. Uses add_lvst. Allows an set of nodes to be +c the initial level (instead of just one node). +c-------------------------parameters------------------------------------ +c on entry: +c--------- +c n = number of nodes in the graph +c ja, ia = pattern of matrix in CSR format (the ja,ia arrays of csr data +c structure) +c nfirst = number of nodes in the first level that is input in riord +c iperm = integer array indicating in which order to traverse the graph +c in order to generate all connected components. +c if iperm(1) .eq. 0 on entry then BFS will traverse the nodes +c in the order 1,2,...,n. +c +c riord = (also an ouput argument). On entry riord contains the labels +c of the nfirst nodes that constitute the first level. +c +c mask = array used to indicate whether or not a node should be +c condidered in the graph. see maskval. +c mask is also used as a marker of visited nodes. +c +c maskval= consider node i only when: mask(i) .eq. maskval +c maskval must be .gt. 0. +c thus, to consider all nodes, take mask(1:n) = 1. +c maskval=1 (for example) +c +c on return +c --------- +c mask = on return mask is restored to its initial state. +c riord = `reverse permutation array'. Contains the labels of the nodes +c constituting all the levels found, from the first level to +c the last. +c levels = pointer array for the level structure. If lev is a level +c number, and k1=levels(lev),k2=levels(lev+1)-1, then +c all the nodes of level number lev are: +c riord(k1),riord(k1+1),...,riord(k2) +c nlev = number of levels found +c----------------------------------------------------------------------- +c + integer j, ii, nod, istart, iend + logical permut + permut = (iperm(1) .ne. 0) +c +c start pointer structure to levels +c + nlev = 0 +c +c previous end +c + istart = 0 + ii = 0 +c +c current end +c + iend = nfirst +c +c intialize masks to zero -- except nodes of first level -- +c + do 12 j=1, nfirst + mask(riord(j)) = 0 + 12 continue +c----------------------------------------------------------------------- + 13 continue +c + 1 nlev = nlev+1 + levels(nlev) = istart + 1 + call add_lvst (istart,iend,nlev,riord,ja,ia,mask,maskval) + if (istart .lt. iend) goto 1 + 2 ii = ii+1 + if (ii .le. n) then + nod = ii + if (permut) nod = iperm(nod) + if (mask(nod) .eq. maskval) then +c +c start a new level +c + istart = iend + iend = iend+1 + riord(iend) = nod + mask(nod) = 0 + goto 1 + else + goto 2 + endif + endif +c----------------------------------------------------------------------- + 3 levels(nlev+1) = iend+1 + do j=1, iend + mask(riord(j)) = maskval + enddo +c----------------------------------------------------------------------- + return + end +c----------------------------------------------------------------------- + subroutine add_lvst(istart,iend,nlev,riord,ja,ia,mask,maskval) + integer nlev, nod, riord(*), ja(*), ia(*), mask(*) +c------------------------------------------------------------- +c adds one level set to the previous sets.. +c span all nodes of previous mask +c------------------------------------------------------------- + nod = iend + do 25 ir = istart+1,iend + i = riord(ir) + do 24 k=ia(i),ia(i+1)-1 + j = ja(k) + if (mask(j) .eq. maskval) then + nod = nod+1 + mask(j) = 0 + riord(nod) = j + endif + 24 continue + 25 continue + istart = iend + iend = nod + return + end +c----------------------------------------------------------------------- + subroutine stripes (nlev,riord,levels,ip,map,mapptr,ndom) + implicit none + integer nlev,riord(*),levels(nlev+1),ip,map(*), + * mapptr(*), ndom +c----------------------------------------------------------------------- +c this is a post processor to BFS. stripes uses the output of BFS to +c find a decomposition of the adjacency graph by stripes. It fills +c the stripes level by level until a number of nodes .gt. ip is +c is reached. +c---------------------------parameters----------------------------------- +c on entry: +c -------- +c nlev = number of levels as found by BFS +c riord = reverse permutation array produced by BFS -- +c levels = pointer array for the level structure as computed by BFS. If +c lev is a level number, and k1=levels(lev),k2=levels(lev+1)-1, +c then all the nodes of level number lev are: +c riord(k1),riord(k1+1),...,riord(k2) +c ip = number of desired partitions (subdomains) of about equal size. +c +c on return +c --------- +c ndom = number of subgraphs (subdomains) found +c map = node per processor list. The nodes are listed contiguously +c from proc 1 to nproc = mpx*mpy. +c mapptr = pointer array for array map. list for proc. i starts at +c mapptr(i) and ends at mapptr(i+1)-1 in array map. +c----------------------------------------------------------------------- +c local variables. +c + integer ib,ktr,ilev,k,nsiz,psiz + ndom = 1 + ib = 1 +c to add: if (ip .le. 1) then ... + nsiz = levels(nlev+1) - levels(1) + psiz = (nsiz-ib)/max(1,(ip - ndom + 1)) + 1 + mapptr(ndom) = ib + ktr = 0 + do 10 ilev = 1, nlev +c +c add all nodes of this level to domain +c + do 3 k=levels(ilev), levels(ilev+1)-1 + map(ib) = riord(k) + ib = ib+1 + ktr = ktr + 1 + if (ktr .ge. psiz .or. k .ge. nsiz) then + ndom = ndom + 1 + mapptr(ndom) = ib + psiz = (nsiz-ib)/max(1,(ip - ndom + 1)) + 1 + ktr = 0 + endif +c + 3 continue + 10 continue + ndom = ndom-1 + return + end +c----------------------------------------------------------------------- + subroutine stripes0 (ip,nlev,il,ndom,iptr) + integer ip, nlev, il(*), ndom, iptr(*) +c----------------------------------------------------------------------- +c This routine is a simple level-set partitioner. It scans +c the level-sets as produced by BFS from one to nlev. +c each time the number of nodes in the accumulated set of +c levels traversed exceeds the parameter ip, this set defines +c a new subgraph. +c-------------------------parameter-list--------------------------------- +c on entry: +c -------- +c ip = desired number of nodes per subgraph. +c nlev = number of levels found as output by BFS +c il = integer array containing the pointer array for +c the level data structure as output by BFS. +c thus il(lev+1) - il(lev) = the number of +c nodes that constitute the level numbe lev. +c on return +c --------- +c ndom = number of sungraphs found +c iptr = pointer array for the sugraph data structure. +c thus, iptr(idom) points to the first level that +c consistutes the subgraph number idom, in the +c level data structure. +c----------------------------------------------------------------------- + ktr = 0 + iband = 1 + iptr(iband) = 1 +c----------------------------------------------------------------------- + + do 10 ilev = 1, nlev + ktr = ktr + il(ilev+1) - il(ilev) + if (ktr .gt. ip) then + iband = iband+1 + iptr(iband) = ilev+1 + ktr = 0 + endif +c + 10 continue +c-----------returning -------------------- + iptr(iband) = nlev + 1 + ndom = iband-1 + return +c----------------------------------------------------------------------- +c-----end-of-stripes0--------------------------------------------------- + end +c----------------------------------------------------------------------- + integer function maskdeg (ja,ia,nod,mask,maskval) + implicit none + integer ja(*),ia(*),nod,mask(*),maskval +c----------------------------------------------------------------------- + integer deg, k + deg = 0 + do k =ia(nod),ia(nod+1)-1 + if (mask(ja(k)) .eq. maskval) deg = deg+1 + enddo + maskdeg = deg + return + end +c----------------------------------------------------------------------- + subroutine perphn(n,ja,ia,init,mask,maskval,nlev,riord,levels) + implicit none + integer n,ja(*),ia(*),init,mask(*),maskval, + * nlev,riord(*),levels(*) +c----------------------------------------------------------------------- +c finds a peripheral node and does a BFS search from it. +c----------------------------------------------------------------------- +c see routine dblstr for description of parameters +c input: +c------- +c ja, ia = list pointer array for the adjacency graph +c mask = array used for masking nodes -- see maskval +c maskval = value to be checked against for determing whether or +c not a node is masked. If mask(k) .ne. maskval then +c node k is not considered. +c init = init node in the pseudo-peripheral node algorithm. +c +c output: +c------- +c init = actual pseudo-peripherial node found. +c nlev = number of levels in the final BFS traversal. +c riord = +c levels = +c----------------------------------------------------------------------- + integer j,nlevp,deg,nfirst,mindeg,nod,maskdeg + integer iperm(1) + nlevp = 0 + 1 continue + riord(1) = init + nfirst = 1 + iperm(1) = 0 +c + call BFS(n,ja,ia,nfirst,iperm,mask,maskval,riord,levels,nlev) + if (nlev .gt. nlevp) then + mindeg = n+1 + do j=levels(nlev),levels(nlev+1)-1 + nod = riord(j) + deg = maskdeg(ja,ia,nod,mask,maskval) + if (deg .lt. mindeg) then + init = nod + mindeg = deg + endif + enddo + nlevp = nlev + goto 1 + endif + return + end +c----------------------------------------------------------------------- + subroutine mapper4 (n,ja,ia,ndom,nodes,levst,marker,link) + implicit none + integer n,ndom,ja(*),ia(*),marker(n),levst(2*ndom), + * nodes(*),link(*) +c----------------------------------------------------------------------- +c finds domains given ndom centers -- by doing a level set expansion +c----------------------------------------------------------------------- +c on entry: +c --------- +c n = dimension of matrix +c ja, ia = adajacency list of matrix (CSR format without values) -- +c ndom = number of subdomains (nr output by coarsen) +c nodes = array of size at least n. On input the first ndom entries +c of nodes should contain the labels of the centers of the +c ndom domains from which to do the expansions. +c +c on return +c --------- +c link = linked list array for the ndom domains. +c nodes = contains the list of nodes of the domain corresponding to +c link. (nodes(i) and link(i) are related to the same node). +c +c levst = levst(j) points to beginning of subdomain j in link. +c +c work arrays: +c ----------- +c levst : work array of length 2*ndom -- contains the beginning and +c end of current level in link. +c beginning of last level in link for each processor. +c also ends in levst(ndom+i) +c marker : work array of length n. +c +c Notes on implementation: +c ----------------------- +c for j .le. ndom link(j) is <0 and indicates the end of the +c linked list. The most recent element added to the linked +c list is added at the end of the list (traversal=backward) +c For j .le. ndom, the value of -link(j) is the size of +c subdomain j. +c +c----------------------------------------------------------------------- +c local variables + integer mindom,j,lkend,nod,nodprev,idom,next,i,kk,ii,ilast,nstuck, + * isiz, nsize +c +c initilaize nodes and link arrays +c + do 10 j=1, n + marker(j) = 0 + 10 continue +c + do 11 j=1, ndom + link(j) = -1 + marker(nodes(j)) = j + levst(j) = j + levst(ndom+j) = j + 11 continue +c +c ii = next untouched node for restarting new connected component. +c + ii = 0 +c + lkend = ndom + nod = ndom + nstuck = 0 +c----------------------------------------------------------------------- + 100 continue + idom = mindom(n,ndom,link) +c----------------------------------------------------------------------- +c begin level-set loop +c----------------------------------------------------------------------- + 3 nodprev = nod + ilast = levst(ndom+idom) + levst(ndom+idom) = lkend + next = levst(idom) +c +c linked list traversal loop +c + isiz = 0 + nsize = link(idom) + 1 i = nodes(next) + isiz = isiz + 1 +c +c adjacency list traversal loop +c + do 2 kk=ia(i), ia(i+1)-1 + j = ja(kk) + if (marker(j) .eq. 0) then + call add_lk(j,nod,idom,ndom,lkend,levst,link,nodes,marker) + endif + 2 continue +c +c if last element of the previous level not reached continue +c + if (next .gt. ilast) then + next = link(next) + if (next .gt. 0) goto 1 + endif +c----------------------------------------------------------------------- +c end level-set traversal -- +c----------------------------------------------------------------------- + if (nodprev .eq. nod) then +c +c link(idom) >0 indicates that set is stuck -- +c + link(idom) = -link(idom) + nstuck = nstuck+1 + endif +c + if (nstuck .lt. ndom) goto 100 +c +c reset sizes -- +c + do j=1, ndom + if (link(j) .gt. 0) link(j) = -link(j) + enddo +c + if (nod .eq. n) return +c +c stuck. add first non assigned point to smallest domain +c + 20 ii = ii+1 + if (ii .le. n) then + if (marker(ii) .eq. 0) then + idom = 0 + isiz = n+1 + do 30 kk=ia(ii), ia(ii+1)-1 + i = marker(ja(kk)) + if (i .ne. 0) then + nsize = abs(link(i)) + if (nsize .lt. isiz) then + isiz = nsize + idom = i + endif + endif + 30 continue +c +c if no neighboring domain select smallest one +c + if (idom .eq. 0) idom = mindom(n,ndom,link) +c +c add ii to sudomain idom at end of linked list +c + call add_lk(ii,nod,idom,ndom,lkend,levst,link,nodes,marker) + goto 3 + else + goto 20 + endif + endif + return + end +c----------------------------------------------------------------------- + subroutine get_domns2(ndom,nodes,link,levst,riord,iptr) + implicit none + integer ndom,nodes(*),link(*),levst(*),riord(*),iptr(*) +c----------------------------------------------------------------------- +c constructs the subdomains from its linked list data structure +c----------------------------------------------------------------------- +c input: +c ndom = number of subdomains +c nodes = sequence of nodes are produced by mapper4. +c link = link list array as produced by mapper4. +c on return: +c---------- +c riord = contains the nodes in each subdomain in succession. +c iptr = pointer in riord for beginnning of each subdomain. +c Thus subdomain number i consists of nodes +c riord(k1),riord(k1)+1,...,riord(k2) +c where k1 = iptr(i), k2= iptr(i+1)-1 +c +c----------------------------------------------------------------------- +c local variables + integer nod, j, next, ii + nod = 1 + iptr(1) = nod + do 21 j=1, ndom + next = levst(j) + 22 ii = nodes(next) + riord(nod) = ii + nod = nod+1 + next = link(next) + if (next .gt. 0) goto 22 + iptr(j+1) = nod + 21 continue +c + return +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- + function mindom(n, ndom, link) + implicit none + integer mindom, n, ndom, link(n) +c----------------------------------------------------------------------- +c returns the domain with smallest size +c----------------------------------------------------------------------- +c locals +c + integer i, nsize, isiz +c + isiz = n+1 + do 10 i=1, ndom + nsize = - link(i) + if (nsize .lt. 0) goto 10 + if (nsize .lt. isiz) then + isiz = nsize + mindom = i + endif + 10 continue + return + end +c----------------------------------------------------------------------- + subroutine add_lk(new,nod,idom,ndom,lkend,levst,link,nodes,marker) + implicit none + integer new,nod,idom,ndom,lkend,levst(*),link(*),nodes(*), + * marker(*) +c----------------------------------------------------------------------- +c inserts new element to linked list from the tail. +c----------------------------------------------------------------------- +c adds one entry (new) to linked list and ipdates everything. +c new = node to be added +c nod = current number of marked nodes +c idom = domain to which new is to be added +c ndom = total number of domains +c lkend= location of end of structure (link and nodes) +c levst= pointer array for link, nodes +c link = link array +c nodes= nodes array -- +c marker = marker array == if marker(k) =0 then node k is not +c assigned yet. +c----------------------------------------------------------------------- +c locals +c + integer ktop + lkend = lkend + 1 + nodes(lkend) = new + nod = nod+1 + marker(new) = idom + ktop = levst(idom) + link(lkend) = ktop + link(idom) = link(idom)-1 + levst(idom) = lkend + return +c----------------------------------------------------------------------- +c-------end-of-add_lk--------------------------------------------------- + end +c----------------------------------------------------------------------- + subroutine find_ctr(n,nsiz,ja,ia,init,mask,maskval,riord, + * levels,center,iwk) + implicit none + integer n,nsiz,ja(*),ia(*),init,mask(*),maskval,riord(*), + * levels(*),center,iwk(*) +c----------------------------------------------------------------------- +c finds a center point of a subgraph -- +c----------------------------------------------------------------------- +c n, ja, ia = graph +c nsiz = size of current domain. +c init = initial node in search +c mask +c maskval +c----------------------------------------------------------------------- +c local variables + integer midlev, nlev,newmask, k, kr, kl, init0, nlev0 + call perphn(n,ja,ia,init,mask,maskval,nlev,riord,levels) +c----------------------------------------------------------------------- +c midlevel = level which cuts domain into 2 roughly equal-size +c regions +c + midlev = 1 + k = 0 + 1 continue + k = k + levels(midlev+1)-levels(midlev) + if (k*2 .lt. nsiz) then + midlev = midlev+1 + goto 1 + endif +c----------------------------------------------------------------------- + newmask = n+maskval +c +c assign temporary masks to mid-level elements +c + do k=levels(midlev),levels(midlev+1)-1 + mask(riord(k)) = newmask + enddo +c +c find pseudo-periph node for mid-level `line' +c + kr = 1 + kl = kr + nsiz + init0 = riord(levels(midlev)) + call perphn(n,ja,ia,init0,mask,newmask,nlev0,iwk(kr),iwk(kl)) +c----------------------------------------------------------------------- +c restore mask to initial state +c----------------------------------------------------------------------- + do k=levels(midlev),levels(midlev+1)-1 + mask(riord(k)) = maskval + enddo +c----------------------------------------------------------------------- +c define center +c----------------------------------------------------------------------- + midlev = 1 + (nlev0-1)/2 + k = iwk(kl+midlev-1) + center = iwk(k) +c----------------------------------------------------------------------- + return + end +c----------------------------------------------------------------------- + subroutine rversp (n, riord) + integer n, riord(n) +c----------------------------------------------------------------------- +c this routine does an in-place reversing of the permutation array +c riord -- +c----------------------------------------------------------------------- + integer j, k + do 26 j=1,n/2 + k = riord(j) + riord(j) = riord(n-j+1) + riord(n-j+1) = k + 26 continue + return + end +c----------------------------------------------------------------------- diff --git a/README b/README new file mode 100644 index 0000000..417b582 --- /dev/null +++ b/README @@ -0,0 +1,108 @@ +----------------------------------------------------------------------- + S P A R S K I T V E R S I O N 2. +----------------------------------------------------------------------- + +Latest update : Tue Mar 8 11:01:12 CST 2005 + +----------------------------------------------------------------------- + +Welcome to SPARSKIT VERSION 2. SPARSKIT is a package of FORTRAN +subroutines for working with sparse matrices. It includes general +sparse matrix manipulation routines as well as a few iterative +solvers, see detailed description of contents below. + + Copyright (C) 2005, the Regents of the University of Minnesota + +SPARSKIT is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation [version 2.1 of the License, or any +later version.] + +A copy of the licencing agreement is attached in the file LGPL. For +additional information contact the Free Software Foundation Inc., 59 +Temple Place - Suite 330, Boston, MA 02111, USA or visit the web-site + + http://www.gnu.org/copyleft/lesser.html + + +DISCLAIMER +---------- + +SPARSKIT 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 +Lesser General Public License for more details. + +For more information contact saad@cs.umn.edu + + +--------------------------------------------------- + S P A R S K I T VERSION 2 +--------------------------------------------------- + +In this directory you will find all relevant subdirectories and the +Unix makefile which will compile all the modules and make a unix +library libskit.a. Please read the makefile. Making the library +should be the first thing to do when starting to use the package. +Some of the objects will be linked into a library called +libskit.a. Others will not be linked but can be used by other +makefiles for test problems provided in the subdirectories. You can +then link to libskit.a by default instead of the individual +modules. (Please report any compilation problems or (even minor) +warnings immediatly to saad@cs.umn.edu). Once this is done, it is +recommended to run the test problems provided. There are various test +suites in each of the subdirectories and makefiles are available for +each. See explanations in the README files in each individual +subdirectory. + +You may also make and run the test programs using the dotests script +provided in this directory. Output from this script may be redirected +into a file and compared to the sample output files out.xxx. There is +an additional script called sgrep which is useful for looking for +tools in all the subdirectories. Read the sgrep file for +instructions. + +----------------------------------------------------------------------- + + Here is some information on the SPARSKIT sub-directories. + + BLASSM : Basic linear algebra with sparse matrices. + contains two modules: blassm.f and matvec.f + + DOC : contains the main documentation of the package + + INFO : information routine (new one) . Info2 (spectral + information) not available yet. + + FORMATS: Contains the Format Conversion routines in + formats.f and the manipulation routines in + unary.f + + INOUT : input output routines. contains the module inout.f + + ITSOL : contains the iterative solution package. Various + iterative solvers and preconditioners are provided. + + MATGEN : matrix generation routines. + contains the module genmat.f and several subroutines + called by it. Also contains zlatev.f (contributed + by E. Rothman, from Cornell). + + ORDERINGS: + still in the works. But contains a few coloring routines + and level-set related orderings -- (e.g., cuthill Mc Kee, etc.) + + UNSUPP : various `unsupported' routines and drivers. + (misc. routines includind routines for + plotting.. BLAS1 is also added for completeness) + + See the file "logfile" for a complete revision history. + + Report any problems, suggestions, etc.. to + + Yousef Saad. + saad@cs.umn.edu + + ----------------------------------------------------------------------- + + \ No newline at end of file diff --git a/UNSUPP/BLAS1/blas1.f b/UNSUPP/BLAS1/blas1.f new file mode 100644 index 0000000..35e198b --- /dev/null +++ b/UNSUPP/BLAS1/blas1.f @@ -0,0 +1,670 @@ + subroutine dcopy(n,dx,incx,dy,incy) +c +c copies a vector, x, to a vector, y. +c uses unrolled loops for increments equal to one. +c jack dongarra, linpack, 3/11/78. +c + double precision dx(1),dy(1) + integer i,incx,incy,ix,iy,m,mp1,n +c + if(n.le.0)return + if(incx.eq.1.and.incy.eq.1)go to 20 +c +c code for unequal increments or equal increments +c not equal to 1 +c + ix = 1 + iy = 1 + if(incx.lt.0)ix = (-n+1)*incx + 1 + if(incy.lt.0)iy = (-n+1)*incy + 1 + do 10 i = 1,n + dy(iy) = dx(ix) + ix = ix + incx + iy = iy + incy + 10 continue + return +c +c code for both increments equal to 1 +c +c +c clean-up loop +c + 20 m = mod(n,7) + if( m .eq. 0 ) go to 40 + do 30 i = 1,m + dy(i) = dx(i) + 30 continue + if( n .lt. 7 ) return + 40 mp1 = m + 1 + do 50 i = mp1,n,7 + dy(i) = dx(i) + dy(i + 1) = dx(i + 1) + dy(i + 2) = dx(i + 2) + dy(i + 3) = dx(i + 3) + dy(i + 4) = dx(i + 4) + dy(i + 5) = dx(i + 5) + dy(i + 6) = dx(i + 6) + 50 continue + return + end + + double precision function ddot(n,dx,incx,dy,incy) +c +c forms the dot product of two vectors. +c uses unrolled loops for increments equal to one. +c jack dongarra, linpack, 3/11/78. +c + double precision dx(1),dy(1),dtemp + integer i,incx,incy,ix,iy,m,mp1,n +c + ddot = 0.0d0 + dtemp = 0.0d0 + if(n.le.0)return + if(incx.eq.1.and.incy.eq.1)go to 20 +c +c code for unequal increments or equal increments +c not equal to 1 +c + ix = 1 + iy = 1 + if(incx.lt.0)ix = (-n+1)*incx + 1 + if(incy.lt.0)iy = (-n+1)*incy + 1 + do 10 i = 1,n + dtemp = dtemp + dx(ix)*dy(iy) + ix = ix + incx + iy = iy + incy + 10 continue + ddot = dtemp + return +c +c code for both increments equal to 1 +c +c +c clean-up loop +c + 20 m = mod(n,5) + if( m .eq. 0 ) go to 40 + do 30 i = 1,m + dtemp = dtemp + dx(i)*dy(i) + 30 continue + if( n .lt. 5 ) go to 60 + 40 mp1 = m + 1 + do 50 i = mp1,n,5 + dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) + + * dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4) + 50 continue + 60 ddot = dtemp + return + end +c + double precision function dasum(n,dx,incx) +c +c takes the sum of the absolute values. +c jack dongarra, linpack, 3/11/78. +c + double precision dx(1),dtemp + integer i,incx,m,mp1,n,nincx +c + dasum = 0.0d0 + dtemp = 0.0d0 + if(n.le.0)return + if(incx.eq.1)go to 20 +c +c code for increment not equal to 1 +c + nincx = n*incx + do 10 i = 1,nincx,incx + dtemp = dtemp + dabs(dx(i)) + 10 continue + dasum = dtemp + return +c +c code for increment equal to 1 +c +c +c clean-up loop +c + 20 m = mod(n,6) + if( m .eq. 0 ) go to 40 + do 30 i = 1,m + dtemp = dtemp + dabs(dx(i)) + 30 continue + if( n .lt. 6 ) go to 60 + 40 mp1 = m + 1 + do 50 i = mp1,n,6 + dtemp = dtemp + dabs(dx(i)) + dabs(dx(i + 1)) + dabs(dx(i + 2)) + * + dabs(dx(i + 3)) + dabs(dx(i + 4)) + dabs(dx(i + 5)) + 50 continue + 60 dasum = dtemp + return + end + + subroutine daxpy(n,da,dx,incx,dy,incy) +c +c constant times a vector plus a vector. +c uses unrolled loops for increments equal to one. +c jack dongarra, linpack, 3/11/78. +c + double precision dx(1),dy(1),da + integer i,incx,incy,ix,iy,m,mp1,n +c + if(n.le.0)return + if (da .eq. 0.0d0) return + if(incx.eq.1.and.incy.eq.1)go to 20 +c +c code for unequal increments or equal increments +c not equal to 1 +c + ix = 1 + iy = 1 + if(incx.lt.0)ix = (-n+1)*incx + 1 + if(incy.lt.0)iy = (-n+1)*incy + 1 + do 10 i = 1,n + dy(iy) = dy(iy) + da*dx(ix) + ix = ix + incx + iy = iy + incy + 10 continue + return +c +c code for both increments equal to 1 +c +c +c clean-up loop +c + 20 m = mod(n,4) + if( m .eq. 0 ) go to 40 + do 30 i = 1,m + dy(i) = dy(i) + da*dx(i) + 30 continue + if( n .lt. 4 ) return + 40 mp1 = m + 1 + do 50 i = mp1,n,4 + dy(i) = dy(i) + da*dx(i) + dy(i + 1) = dy(i + 1) + da*dx(i + 1) + dy(i + 2) = dy(i + 2) + da*dx(i + 2) + dy(i + 3) = dy(i + 3) + da*dx(i + 3) + 50 continue + return + end + double precision function dnrm2 ( n, dx, incx) + integer next + double precision dx(1), cutlo, cuthi, hitest, sum, xmax,zero,one + data zero, one /0.0d0, 1.0d0/ +c +c euclidean norm of the n-vector stored in dx() with storage +c increment incx . +c if n .le. 0 return with result = 0. +c if n .ge. 1 then incx must be .ge. 1 +c +c c.l.lawson, 1978 jan 08 +c +c four phase method using two built-in constants that are +c hopefully applicable to all machines. +c cutlo = maximum of dsqrt(u/eps) over all known machines. +c cuthi = minimum of dsqrt(v) over all known machines. +c where +c eps = smallest no. such that eps + 1. .gt. 1. +c u = smallest positive no. (underflow limit) +c v = largest no. (overflow limit) +c +c brief outline of algorithm.. +c +c phase 1 scans zero components. +c move to phase 2 when a component is nonzero and .le. cutlo +c move to phase 3 when a component is .gt. cutlo +c move to phase 4 when a component is .ge. cuthi/m +c where m = n for x() real and m = 2*n for complex. +c +c values for cutlo and cuthi.. +c from the environmental parameters listed in the imsl converter +c document the limiting values are as follows.. +c cutlo, s.p. u/eps = 2**(-102) for honeywell. close seconds are +c univac and dec at 2**(-103) +c thus cutlo = 2**(-51) = 4.44089e-16 +c cuthi, s.p. v = 2**127 for univac, honeywell, and dec. +c thus cuthi = 2**(63.5) = 1.30438e19 +c cutlo, d.p. u/eps = 2**(-67) for honeywell and dec. +c thus cutlo = 2**(-33.5) = 8.23181d-11 +c cuthi, d.p. same as s.p. cuthi = 1.30438d19 +c data cutlo, cuthi / 8.232d-11, 1.304d19 / +c data cutlo, cuthi / 4.441e-16, 1.304e19 / + data cutlo, cuthi / 8.232d-11, 1.304d19 / +c + if(n .gt. 0) go to 10 + dnrm2 = zero + go to 300 +c + 10 assign 30 to next + sum = zero + nn = n * incx +c begin main loop + i = 1 + 20 go to next,(30, 50, 70, 110) + 30 if( dabs(dx(i)) .gt. cutlo) go to 85 + assign 50 to next + xmax = zero +c +c phase 1. sum is zero +c + 50 if( dx(i) .eq. zero) go to 200 + if( dabs(dx(i)) .gt. cutlo) go to 85 +c +c prepare for phase 2. + assign 70 to next + go to 105 +c +c prepare for phase 4. +c + 100 i = j + assign 110 to next + sum = (sum / dx(i)) / dx(i) + 105 xmax = dabs(dx(i)) + go to 115 +c +c phase 2. sum is small. +c scale to avoid destructive underflow. +c + 70 if( dabs(dx(i)) .gt. cutlo ) go to 75 +c +c common code for phases 2 and 4. +c in phase 4 sum is large. scale to avoid overflow. +c + 110 if( dabs(dx(i)) .le. xmax ) go to 115 + sum = one + sum * (xmax / dx(i))**2 + xmax = dabs(dx(i)) + go to 200 +c + 115 sum = sum + (dx(i)/xmax)**2 + go to 200 +c +c +c prepare for phase 3. +c + 75 sum = (sum * xmax) * xmax +c +c +c for real or d.p. set hitest = cuthi/n +c for complex set hitest = cuthi/(2*n) +c + 85 hitest = cuthi/float( n ) +c +c phase 3. sum is mid-range. no scaling. +c + do 95 j =i,nn,incx + if(dabs(dx(j)) .ge. hitest) go to 100 + 95 sum = sum + dx(j)**2 + dnrm2 = dsqrt( sum ) + go to 300 +c + 200 continue + i = i + incx + if ( i .le. nn ) go to 20 +c +c end of main loop. +c +c compute square root and adjust for scaling. +c + dnrm2 = xmax * dsqrt(sum) + 300 continue + return + end + + subroutine dscal(n,da,dx,incx) +c scales a vector by a constant. +c uses unrolled loops for increment equal to one. +c jack dongarra, linpack, 3/11/78. +c + double precision da,dx(1) + integer i,incx,m,mp1,n,nincx +c + if(n.le.0)return + if(incx.eq.1)go to 20 +c +c code for increment not equal to 1 +c + nincx = n*incx + do 10 i = 1,nincx,incx + dx(i) = da*dx(i) + 10 continue + return +c +c code for increment equal to 1 +c +c +c clean-up loop +c + 20 m = mod(n,5) + if( m .eq. 0 ) go to 40 + do 30 i = 1,m + dx(i) = da*dx(i) + 30 continue + if( n .lt. 5 ) return + 40 mp1 = m + 1 + do 50 i = mp1,n,5 + dx(i) = da*dx(i) + dx(i + 1) = da*dx(i + 1) + dx(i + 2) = da*dx(i + 2) + dx(i + 3) = da*dx(i + 3) + dx(i + 4) = da*dx(i + 4) + 50 continue + return + end + + subroutine dswap (n,dx,incx,dy,incy) +c +c interchanges two vectors. +c uses unrolled loops for increments equal one. +c jack dongarra, linpack, 3/11/78. +c + double precision dx(1),dy(1),dtemp + integer i,incx,incy,ix,iy,m,mp1,n +c + if(n.le.0)return + if(incx.eq.1.and.incy.eq.1)go to 20 +c +c code for unequal increments or equal increments not equal +c to 1 +c + ix = 1 + iy = 1 + if(incx.lt.0)ix = (-n+1)*incx + 1 + if(incy.lt.0)iy = (-n+1)*incy + 1 + do 10 i = 1,n + dtemp = dx(ix) + dx(ix) = dy(iy) + dy(iy) = dtemp + ix = ix + incx + iy = iy + incy + 10 continue + return +c +c code for both increments equal to 1 +c +c +c clean-up loop +c + 20 m = mod(n,3) + if( m .eq. 0 ) go to 40 + do 30 i = 1,m + dtemp = dx(i) + dx(i) = dy(i) + dy(i) = dtemp + 30 continue + if( n .lt. 3 ) return + 40 mp1 = m + 1 + do 50 i = mp1,n,3 + dtemp = dx(i) + dx(i) = dy(i) + dy(i) = dtemp + dtemp = dx(i + 1) + dx(i + 1) = dy(i + 1) + dy(i + 1) = dtemp + dtemp = dx(i + 2) + dx(i + 2) = dy(i + 2) + dy(i + 2) = dtemp + 50 continue + return + end + + integer function idamax(n,dx,incx) +c +c finds the index of element having max. absolute value. +c jack dongarra, linpack, 3/11/78. +c + double precision dx(1),dmax + integer i,incx,ix,n +c + idamax = 0 + if( n .lt. 1 ) return + idamax = 1 + if(n.eq.1)return + if(incx.eq.1)go to 20 +c +c code for increment not equal to 1 +c + ix = 1 + dmax = dabs(dx(1)) + ix = ix + incx + do 10 i = 2,n + if(dabs(dx(ix)).le.dmax) go to 5 + idamax = i + dmax = dabs(dx(ix)) + 5 ix = ix + incx + 10 continue + return +c +c code for increment equal to 1 +c + 20 dmax = dabs(dx(1)) + do 30 i = 2,n + if(dabs(dx(i)).le.dmax) go to 30 + idamax = i + dmax = dabs(dx(i)) + 30 continue + return + end +c + subroutine drot (n,dx,incx,dy,incy,c,s) +c +c applies a plane rotation. +c jack dongarra, linpack, 3/11/78. +c + double precision dx(1),dy(1),dtemp,c,s + integer i,incx,incy,ix,iy,n +c + if(n.le.0)return + if(incx.eq.1.and.incy.eq.1)go to 20 +c +c code for unequal increments or equal increments not equal +c to 1 +c + ix = 1 + iy = 1 + if(incx.lt.0)ix = (-n+1)*incx + 1 + if(incy.lt.0)iy = (-n+1)*incy + 1 + do 10 i = 1,n + dtemp = c*dx(ix) + s*dy(iy) + dy(iy) = c*dy(iy) - s*dx(ix) + dx(ix) = dtemp + ix = ix + incx + iy = iy + incy + 10 continue + return +c +c code for both increments equal to 1 +c + 20 do 30 i = 1,n + dtemp = c*dx(i) + s*dy(i) + dy(i) = c*dy(i) - s*dx(i) + dx(i) = dtemp + 30 continue + return + end +c + subroutine drotg(da,db,c,s) +c +c construct givens plane rotation. +c jack dongarra, linpack, 3/11/78. +c + double precision da,db,c,s,roe,scale,r,z +c + roe = db + if( dabs(da) .gt. dabs(db) ) roe = da + scale = dabs(da) + dabs(db) + if( scale .ne. 0.0d0 ) go to 10 + c = 1.0d0 + s = 0.0d0 + r = 0.0d0 + go to 20 + 10 r = scale*dsqrt((da/scale)**2 + (db/scale)**2) + r = dsign(1.0d0,roe)*r + c = da/r + s = db/r + 20 z = 1.0d0 + if( dabs(da) .gt. dabs(db) ) z = s + if( dabs(db) .ge. dabs(da) .and. c .ne. 0.0d0 ) z = 1.0d0/c + da = r + db = z + return + end +c + subroutine ccopy(n,cx,incx,cy,incy) +c +c copies a vector, x, to a vector, y. +c jack dongarra, linpack, 3/11/78. +c + complex cx(1),cy(1) + integer i,incx,incy,ix,iy,n +c + if(n.le.0)return + if(incx.eq.1.and.incy.eq.1)go to 20 +c +c code for unequal increments or equal increments +c not equal to 1 +c + ix = 1 + iy = 1 + if(incx.lt.0)ix = (-n+1)*incx + 1 + if(incy.lt.0)iy = (-n+1)*incy + 1 + do 10 i = 1,n + cy(iy) = cx(ix) + ix = ix + incx + iy = iy + incy + 10 continue + return +c +c code for both increments equal to 1 +c + 20 do 30 i = 1,n + cy(i) = cx(i) + 30 continue + return + end + subroutine cscal(n,ca,cx,incx) +c +c scales a vector by a constant. +c jack dongarra, linpack, 3/11/78. +c + complex ca,cx(1) + integer i,incx,n,nincx +c + if(n.le.0)return + if(incx.eq.1)go to 20 +c +c code for increment not equal to 1 +c + nincx = n*incx + do 10 i = 1,nincx,incx + cx(i) = ca*cx(i) + 10 continue + return +c +c code for increment equal to 1 +c + 20 do 30 i = 1,n + cx(i) = ca*cx(i) + 30 continue + return + end +c + subroutine csrot (n,cx,incx,cy,incy,c,s) +c +c applies a plane rotation, where the cos and sin (c and s) are real +c and the vectors cx and cy are complex. +c jack dongarra, linpack, 3/11/78. +c + complex cx(1),cy(1),ctemp + real c,s + integer i,incx,incy,ix,iy,n +c + if(n.le.0)return + if(incx.eq.1.and.incy.eq.1)go to 20 +c +c code for unequal increments or equal increments not equal +c to 1 +c + ix = 1 + iy = 1 + if(incx.lt.0)ix = (-n+1)*incx + 1 + if(incy.lt.0)iy = (-n+1)*incy + 1 + do 10 i = 1,n + ctemp = c*cx(ix) + s*cy(iy) + cy(iy) = c*cy(iy) - s*cx(ix) + cx(ix) = ctemp + ix = ix + incx + iy = iy + incy + 10 continue + return +c +c code for both increments equal to 1 +c + 20 do 30 i = 1,n + ctemp = c*cx(i) + s*cy(i) + cy(i) = c*cy(i) - s*cx(i) + cx(i) = ctemp + 30 continue + return + end + subroutine cswap (n,cx,incx,cy,incy) +c +c interchanges two vectors. +c jack dongarra, linpack, 3/11/78. +c + complex cx(1),cy(1),ctemp + integer i,incx,incy,ix,iy,n +c + if(n.le.0)return + if(incx.eq.1.and.incy.eq.1)go to 20 +c +c code for unequal increments or equal increments not equal +c to 1 +c + ix = 1 + iy = 1 + if(incx.lt.0)ix = (-n+1)*incx + 1 + if(incy.lt.0)iy = (-n+1)*incy + 1 + do 10 i = 1,n + ctemp = cx(ix) + cx(ix) = cy(iy) + cy(iy) = ctemp + ix = ix + incx + iy = iy + incy + 10 continue + return +c +c code for both increments equal to 1 + 20 do 30 i = 1,n + ctemp = cx(i) + cx(i) = cy(i) + cy(i) = ctemp + 30 continue + return + end + subroutine csscal(n,sa,cx,incx) +c +c scales a complex vector by a real constant. +c jack dongarra, linpack, 3/11/78. +c + complex cx(1) + real sa + integer i,incx,n,nincx +c + if(n.le.0)return + if(incx.eq.1)go to 20 +c +c code for increment not equal to 1 +c + nincx = n*incx + do 10 i = 1,nincx,incx + cx(i) = cmplx(sa*real(cx(i)),sa*aimag(cx(i))) + 10 continue + return +c +c code for increment equal to 1 +c + 20 do 30 i = 1,n + cx(i) = cmplx(sa*real(cx(i)),sa*aimag(cx(i))) + 30 continue + return + end + diff --git a/UNSUPP/MATEXP/README b/UNSUPP/MATEXP/README new file mode 100644 index 0000000..f2119e0 --- /dev/null +++ b/UNSUPP/MATEXP/README @@ -0,0 +1,20 @@ + + SUBDIRECTORY MATEXP + ------------------- + routines related to matrix exponentials. + + contents: +---------- + exppro.f computes exp( t A) v + rexp.f a simple test program for exppro.f + phipro.f solves y'= A y + b + rphi.f a simple test program for phipro.f + makefile makefile for the test problems. make exp.ex will make + an executable for exppro, make phi.ex will test program for + phipro.f + + + feedback appreciated. BEWARE: DOCUMENTATION MAY BE INACCURATE - + --------------------- VERY LITTLE TESTING DONE WITH PHIPRO.F -- + + diff --git a/UNSUPP/MATEXP/exppro.f b/UNSUPP/MATEXP/exppro.f new file mode 100644 index 0000000..8d46ba0 --- /dev/null +++ b/UNSUPP/MATEXP/exppro.f @@ -0,0 +1,593 @@ + subroutine expprod (n, m, eps, tn, u, w, x, y, a, ioff, ndiag) + real*8 eps, tn + real*8 a(n,ndiag), u(n,m+1), w(n), x(n), y(n) + integer n, m, ndiag, ioff(ndiag) + +c----------------------------------------------------------------------- +c this subroutine computes an approximation to the vector +c +c w := exp( - A * tn ) * w +c +c for matrices stored in diagonal (DIA) format. +c +c this routine constitutes an interface for the routine exppro for +c matrices stored in diagonal (DIA) format. +c----------------------------------------------------------------------- +c ARGUMENTS +c---------- +c see exppro for meaning of parameters n, m, eps, tn, u, w, x, y. +c +c a, ioff, and ndiag are the arguments of the matrix: +c +c a(n,ndiag) = a rectangular array with a(*,k) containing the diagonal +c offset by ioff(k) (negative or positive or zero), i.e., +c a(i,jdiag) contains the element A(i,i+ioff(jdiag)) in +c the usual dense storage scheme. +c +c ioff = integer array containing the offsets of the ndiag diagonals +c ndiag = integer. the number of diagonals. +c +c----------------------------------------------------------------------- +c local variables +c + integer indic, ierr + + indic = 0 + 101 continue + call exppro (n, m, eps, tn, u, w, x, y, indic, ierr) + if (indic .eq. 1) goto 102 +c +c matrix vector-product for diagonal storage -- +c + call oped(n, x, y, a, ioff, ndiag) + goto 101 + 102 continue + return + end +c----------end-of-expprod----------------------------------------------- +c----------------------------------------------------------------------- + subroutine exppro (n, m, eps, tn, u, w, x, y, indic, ierr) +c implicit real*8 (a-h,o-z) + integer n, m, indic, ierr + real*8 eps, tn, u(n,m+1), w(n), x(n), y(n) +c----------------------------------------------------------------------- +c +c this subroutine computes an approximation to the vector +c +c w := exp( - A * tn ) * w +c +c where A is an arbitary matrix and w is a given input vector +c uses a dynamic estimation of internal time advancement (dt) +c----------------------------------------------------------------------- +c THIS IS A REVERSE COMMUNICATION IMPLEMENTATION. +c------------------------------------------------- +c USAGE: (see also comments on indic below). +c------ +c +c indic = 0 +c 1 continue +c call exppro (n, m, eps, tn, u, w, x, y, indic) +c if (indic .eq. 1) goto 2 <-- indic .eq. 1 means job is finished +c call matvec(n, x, y) <--- user's matrix-vec. product +c with x = input vector, and +c y = result = A * x. +c goto 1 +c 2 continue +c ..... +c +c----------------------------------------------------------------------- +c +c en entry: +c---------- +c n = dimension of matrix +c +c m = dimension of Krylov subspace (= degree of polynomial +c approximation to the exponential used. ) +c +c eps = scalar indicating the relative error tolerated for the result. +c the code will try to compute an answer such that +c norm2(exactanswer-approximation) / norm2(w) .le. eps +c +c tn = scalar by which to multiply matrix. (may be .lt. 0) +c the code will compute an approximation to exp(- tn * A) w +c and overwrite the result onto w. +c +c u = work array of size n*(m+1) (used to hold the Arnoldi basis ) +c +c w = real array of length n = input vector to which exp(-A) is +c to be applied. this is also an output argument +c +c x, y = two real work vectors of length at least n each. +c see indic for usage. +c +c indic = integer used as indicator for the reverse communication. +c in the first call enter indic = 0. See below for more. +c +c on return: +c----------- +c +c w = contains the resulting vector exp(-A * tn ) * w when +c exppro has finished (see indic) +c +c indic = indicator for the reverse communication protocole. +c * INDIC .eq. 1 means that exppro has finished and w contains the +c result. +c * INDIC .gt. 1 , means that exppro has not finished and that +c it is requesting another matrix vector product before +c continuing. The user must compute Ax where A is the matrix +c and x is the vector provided by exppro, and return the +c result in y. Then exppro must be called again without +c changing any other argument. typically this must be +c implemented in a loop with exppro being called as long +c indic is returned with a value .ne. 1. +c +c ierr = error indicator. +c ierr = 1 means phipro was called with indic=1 (not allowed) +c ierr = -1 means that the input is zero the solution has been +c unchanged. +c +c NOTES: m should not exceed 60 in this version (see mmax below) +c----------------------------------------------------------------------- +c written by Y. Saad -- version feb, 1991. +c----------------------------------------------------------------------- +c For reference see following papers : +c (1) E. Gallopoulos and Y. Saad: Efficient solution of parabolic +c equations by Krylov approximation methods. RIACS technical +c report 90-14. +c (2) Y.Saad: Analysis of some Krylov subspace approximations to the +c matrix exponential operator. RIACS Tech report. 90-14 +c----------------------------------------------------------------------- +c local variables +c + integer mmax + parameter (mmax=60) + real*8 errst, tcur, told, dtl, beta, red, dabs, dble + real*8 hh(mmax+2,mmax+1), z(mmax+1) + complex*16 wkc(mmax+1) + integer ih, job + logical verboz + data verboz/.true./ + save +c----------------------------------------------------------------------- +c indic = 3 means passing through only with result of y= Ax to exphes +c indic = 2 means exphes has finished its job +c indic = 1 means exppro has finished its job (real end)/ +c----------------------------------------------------------------------- + ierr = 0 + if (indic .eq. 3) goto 101 + if (indic .eq. 1) then + ierr = 1 + return + endif +c----- + ih = mmax + m = min0(m,mmax) + tcur = 0.0d0 + dtl = tn-tcur + job = -1 +c-------------------- outer loop ----------------------------- + 100 continue + if(verboz) print *,'In EXPPRO, current time = ', tcur ,'---------' +c------------------------------------------------------------- +c ---- call exponential propagator --------------------------- +c------------------------------------------------------------- + told = tcur + 101 continue +c if (told + dtl .gt. tn) dtl = tn-told + call exphes (n,m,dtl,eps,u,w,job,z,wkc,beta,errst,hh,ih, + * x,y,indic,ierr) +c----------------------------------------------------------------------- + if (ierr .ne. 0) return + if (indic .ge. 3) return + tcur = told + dtl + if(verboz) print *, ' tcur now = ', tcur, ' dtl = ', dtl +c +c relative error +c if(verboz) print *, ' beta', beta + errst = errst / beta +c--------- + if ((errst .le. eps) .and. ( (errst .gt. eps/100.0) .or. + * (tcur .eq. tn))) goto 102 +c +c use approximation : [ new err ] = fact**m * [cur. error] +c + red = (0.5*eps / errst)**(1.0d0 /dble(m) ) + dtl = dtl*red + if (dabs(told+dtl) .gt. dabs(tn) ) dtl = tn-told + if(verboz) print *, ' red =',red,' , reducing dt to: ', dtl +c------- + job = 1 + goto 101 +c------- + 102 continue +c + call project(n,m,u,z,w) +c never go beyond tcur + job = 0 + dtl = dmin1(dtl, tn-tcur) + if (dabs(tcur+dtl) .gt. dabs(tn)) dtl = tn-tcur + if (dabs(tcur) .lt. dabs(tn)) goto 100 + indic = 1 +c + return + end +c----------end-of-expro------------------------------------------------- +c----------------------------------------------------------------------- + subroutine exphes (n,m,dt,eps,u,w,job,z,wkc,beta,errst,hh,ih, + * x, y, indic,ierr) +c implicit real*8 (a-h,o-z) + integer n, m, job, ih, indic, ierr + real*8 hh(ih+2,m+1), u(n,m+1), w(n), z(m+1), x(n), y(n) + complex*16 wkc(m+1) + real*8 dt, eps, beta, errst +c----------------------------------------------------------------------- +c this subroutine computes the Arnoldi basis and the corresponding +c coeffcient vector in the approximation +c +c w ::= beta Vm ym +c where ym = exp(- Hm *dt) * e1 +c +c to the vector exp(-A dt) w where A is an arbitary matrix and +c w is a given input vector. In case job = 0 the arnoldi basis +c is recomputed. Otherwise the +c code assumes assumes that u(*) contains an already computed +c arnoldi basis and computes only the y-vector (which is stored in v(*)) +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = dimension of matrix +c +c m = dimension of Krylov subspace (= degree of polynomial +c approximation to the exponential used. ) +c +c dt = scalar by which to multiply matrix. Can be viewed +c as a time step. dt must be positive [to be fixed]. +c +c eps = scalar indicating the relative error tolerated for the result. +c the code will try to compute an answer such that +c norm2(exactanswer-approximation) / norm2(w) .le. eps +c +c u = work array of size n*(m+1) to contain the Arnoldi basis +c +c w = real array of length n = input vector to which exp(-A) is +c to be applied. +c +c job = integer. job indicator. If job .lt. 0 then the Arnoldi +c basis is recomputed. If job .gt. 0 then it is assumed +c that the user wants to use a previously computed Krylov +c subspace but a different dt. Thus the Arnoldi basis and +c the Hessenberg matrix Hm are not recomputed. +c In that case the user should not modify the values of beta +c and the matrices hh and u(n,*) when recalling phipro. +c job = -1 : recompute basis and get an initial estimate for +c time step dt to be used. +c job = 0 : recompute basis and do not alter dt. +c job = 1 : do not recompute arnoldi basis. +c +c z = real work array of size (m+1) +c wkc = complex*16 work array of size (m+1) +c +c hh = work array of size size at least (m+2)*(m+1) +c +c ih+2 = first dimension of hh as declared in the calling program. +c ih must be .ge. m. +c +c----------------------------------------------------------------------- +c on return: +c----------- +c w2 = resulting vector w2 = exp(-A *dt) * w +c beta = real equal to the 2-norm of w. Needed if exppro will +c be recalled with the same Krylov subspace and a different dt. +c errst = rough estimates of the 2-norm of the error. +c hh = work array of dimension at least (m+2) x (m+1) +c +c----------------------------------------------------------------------- +c local variables +c + integer ndmax + parameter (ndmax=20) + real*8 alp0, fnorm, t, rm, ddot, dabs, dsqrt, dsign,dble + complex*16 alp(ndmax+1), rd(ndmax+1) + integer i, j, k, ldg, i0, i1, m1 + logical verboz + data verboz/.true./ + save +c------use degree 14 chebyshev all the time -------------------------- + if (indic .ge. 3) goto 60 +c +c------input fraction expansion of rational function ------------------ +c chebyshev (14,14) + ldg= 7 + alp0 = 0.183216998528140087E-11 + alp(1)=( 0.557503973136501826E+02,-0.204295038779771857E+03) + rd(1)=(-0.562314417475317895E+01, 0.119406921611247440E+01) + alp(2)=(-0.938666838877006739E+02, 0.912874896775456363E+02) + rd(2)=(-0.508934679728216110E+01, 0.358882439228376881E+01) + alp(3)=( 0.469965415550370835E+02,-0.116167609985818103E+02) + rd(3)=(-0.399337136365302569E+01, 0.600483209099604664E+01) + alp(4)=(-0.961424200626061065E+01,-0.264195613880262669E+01) + rd(4)=(-0.226978543095856366E+01, 0.846173881758693369E+01) + alp(5)=( 0.752722063978321642E+00, 0.670367365566377770E+00) + rd(5)=( 0.208756929753827868E+00, 0.109912615662209418E+02) + alp(6)=(-0.188781253158648576E-01,-0.343696176445802414E-01) + rd(6)=( 0.370327340957595652E+01, 0.136563731924991884E+02) + alp(7)=( 0.143086431411801849E-03, 0.287221133228814096E-03) + rd(7)=( 0.889777151877331107E+01, 0.166309842834712071E+02) +c----------------------------------------------------------------------- +c +c if job .gt. 0 skip arnoldi process: +c + if (job .gt. 0) goto 2 +c------normalize vector w and put in first column of u -- + beta = dsqrt(ddot(n,w,1,w,1)) +c----------------------------------------------------------------------- + if(verboz) print *, ' In EXPHES, beta ', beta + if (beta .eq. 0.0d0) then + ierr = -1 + indic = 1 + return + endif +c + t = 1.0d0/beta + do 25 j=1, n + u(j,1) = w(j)*t + 25 continue +c------------------Arnoldi loop ------------------------------------- +c fnorm = 0.0d0 + i1 = 1 + 58 i = i1 + i1 = i + 1 + do 59 k=1, n + x(k) = u(k,i) + 59 continue + indic = 3 + return + 60 continue + do 61 k=1, n + u(k,i1) = y(k) + 61 continue + i0 =1 +c +c switch for Lanczos version +c i0 = max0(1, i-1) + call mgsr (n, i0, i1, u, hh(1,i)) + fnorm = fnorm + ddot(i1, hh(1,i),1, hh(1,i),1) + if (hh(i1,i) .eq. 0.0) m = i + if (i .lt. m) goto 58 +c--------------done with arnoldi loop --------------------------------- + rm = dble(m) + fnorm = dsqrt( fnorm / rm ) +c-------get : beta*e1 into z + m1 = m+1 + do 4 i=1,m1 + hh(i,m1) = 0.0 + 4 continue +c +c compute initial dt when job .lt. 1 +c + if (job .ge. 0) goto 2 +c +c t = eps / beta +c + t = eps + do 41 k=1, m-1 + t = t*(1.0d0 - dble(m-k)/rm ) + 41 continue +c + t = 2.0d0*rm* (t**(1.0d0/rm) ) / fnorm + if(verboz) print *, ' t, dt = ', t, dt + t = dmin1(dabs(dt),t) + dt = dsign(t, dt) +c + 2 continue + z(1) = beta + do 3 k=2, m1 + z(k) = 0.0d0 + 3 continue +c-------get : exp(H) * beta*e1 + call hes(ldg,m1,hh,ih,dt,z,rd,alp,alp0,wkc) +c-------error estimate + errst = dabs(z(m1)) + if(verboz) print *, ' error estimate =', errst +c----------------------------------------------------------------------- + indic = 2 + return + end +c----------------------------------------------------------------------- + subroutine mgsr (n, i0, i1, ss, r) +c implicit real*8 (a-h,o-z) + integer n, i0, i1 + real*8 ss(n,i1), r(i1) +c----------------------------------------------------------------------- +c modified gram - schmidt with partial reortho. the vector ss(*,i1) is +c orthogonalized against the first i vectors of ss (which are already +c orthogonal). the coefficients of the orthogonalization are returned in +c the array r +c------------------------------------------------------------------------ +c local variables +c + integer i, j, k, it + real*8 hinorm, tet, ddot, t, dsqrt + data tet/10.0d0/ + + do 53 j=1, i1 + r(j) = 0.0d0 + 53 continue + i = i1-1 + it = 0 + 54 hinorm = 0.0d0 + it = it +1 + if (i .eq. 0) goto 56 +c + do 55 j=i0, i + t = ddot(n, ss(1,j),1,ss(1,i1),1) + hinorm = hinorm + t**2 + r(j) = r(j) + t + call daxpy(n,-t,ss(1,j),1,ss(1,i1),1) + 55 continue + t = ddot(n, ss(1,i1), 1, ss(1,i1), 1) + 56 continue +c +c test for reorthogonalization see daniel et. al. +c two reorthogonalization allowed --- +c + if (t*tet .le. hinorm .and. it .lt. 2) goto 54 + t =dsqrt(t) + r(i1)= t + if (t .eq. 0.0d0) return + t = 1.0d0/t + do 57 k=1,n + ss(k,i1) = ss(k,i1)*t + 57 continue + return + end +c----------end-of-mgsr-------------------------------------------------- +c----------------------------------------------------------------------- + subroutine project(n,m,u,v,w) + integer n, m + real*8 u(n,m), v(m), w(n) +c +c computes the vector w = u * v +c +c local variables +c + integer j, k + + do 1 k=1,n + w(k) = 0.d0 + 1 continue + + do 100 j=1,m + do 99 k=1,n + w(k) = w(k) + v(j) * u(k,j) + 99 continue + 100 continue + return + end +c----------------------------------------------------------------------- + subroutine hes (ndg,m1,hh,ih,dt,y,root,coef,coef0,w2) +c implicit real*8 (a-h,o-z) + integer ndg, m1, ih + real*8 hh(ih+2,m1), y(m1) + complex*16 coef(ndg), root(ndg), w2(m1) + real*8 dt, coef0 +c-------------------------------------------------------------------- +c computes exp ( H dt) * y (1) +c where H = Hessenberg matrix (hh) +c y = arbitrary vector. +c ---------------------------- +c ndg = number of poles as determined by getrat +c m1 = dimension of hessenberg matrix +c hh = hessenberg matrix (real) +c ih+2 = first dimension of hh +c dt = scaling factor used for hh (see (1)) +c y = real vector. on return exp(H dt ) y is computed +c and overwritten on y. +c root = poles of the rational approximation to exp as +c computed by getrat +c coef, +c coef0 = coefficients of partial fraction expansion +c +c exp(t) ~ coef0 + sum Real [ coef(i) / (t - root(i) ] +c i=1,ndg +c +c valid for real t. +c coef0 is real, coef(*) is a complex array. +c +c-------------------------------------------------------------------- +c local variables +c + integer m1max + parameter (m1max=61) + complex*16 hloc(m1max+1,m1max), t, zpiv, dcmplx + real*8 yloc(m1max), dble + integer i, j, ii +c +c if (m1 .gt. m1max) print *, ' *** ERROR : In HES, M+1 TOO LARGE' +c +c loop associated with the poles. +c + do 10 j=1,m1 + yloc(j) = y(j) + y(j) = y(j)*coef0 + 10 continue +c + do 8 ii = 1, ndg +c +c copy Hessenberg matrix into temporary +c + do 2 j=1, m1 + do 1 i=1, j+1 + hloc(i,j) = dcmplx( dt*hh(i,j) ) + 1 continue + hloc(j,j) = hloc(j,j) - root(ii) + w2(j) = dcmplx(yloc(j)) + 2 continue +c +c forward solve +c + do 4 i=2,m1 + zpiv = hloc(i,i-1) / hloc(i-1,i-1) + do 3 j=i,m1 + hloc(i,j) = hloc(i,j) - zpiv*hloc(i-1,j) + 3 continue + w2(i) = w2(i) - zpiv*w2(i-1) + 4 continue +c +c backward solve +c + do 6 i=m1,1,-1 + t=w2(i) + do 5 j=i+1,m1 + t = t-hloc(i,j)*w2(j) + 5 continue + w2(i) = t/hloc(i,i) + 6 continue +c +c accumulate result in y. +c + do 7 i=1,m1 + y(i) = y(i) + dble ( coef(ii) * w2(i) ) + 7 continue + 8 continue + return + end +c----------end-of-hes--------------------------------------------------- +c----------------------------------------------------------------------- + subroutine daxpy(n,t,x,indx,y,indy) + integer n, indx, indy + real*8 x(n), y(n), t +c------------------------------------------------------------------- +c does the following operation +c y <--- y + t * x , (replace by the blas routine daxpy ) +c indx and indy are supposed to be one here +c------------------------------------------------------------------- + integer k + + do 1 k=1,n + y(k) = y(k) + x(k)*t +1 continue + return + end +c----------end-of-daxpy------------------------------------------------- +c----------------------------------------------------------------------- + function ddot(n,x,ix,y,iy) + integer n, ix, iy + real*8 ddot, x(n), y(n) +c------------------------------------------------------------------- +c computes the inner product t=(x,y) -- replace by blas routine ddot +c------------------------------------------------------------------- + integer j + real*8 t + + t = 0.0d0 + do 10 j=1,n + t = t + x(j)*y(j) +10 continue + ddot=t + return + end +c----------end-of-ddot-------------------------------------------------- +c----------------------------------------------------------------------- + + diff --git a/UNSUPP/MATEXP/makefile b/UNSUPP/MATEXP/makefile new file mode 100644 index 0000000..279b29a --- /dev/null +++ b/UNSUPP/MATEXP/makefile @@ -0,0 +1,14 @@ +FFLAGS = +F77 = f77 + +#F77 = cf77 +#FFLAGS = -Wf"-dp" + +FILES1 = rexp.o exppro.o +FILES2 = rphi.o phipro.o + +exp.ex: $(FILES1) + $(F77) $(FFLAGS) $(FILES1) -o exp.ex + +phi.ex: $(FILES2) + $(F77) $(FFLAGS) $(FILES2) -o phi.ex diff --git a/UNSUPP/MATEXP/phipro.f b/UNSUPP/MATEXP/phipro.f new file mode 100644 index 0000000..c699469 --- /dev/null +++ b/UNSUPP/MATEXP/phipro.f @@ -0,0 +1,640 @@ + subroutine phiprod (n, m, eps, tn, u, w, r, x, y, a, ioff, ndiag) + real*8 eps, tn + real*8 a(n,ndiag), u(n,m+1), w(n), r(n), x(n), y(n) + integer n, m, ndiag, ioff(ndiag) + +c----------------------------------------------------------------------- +c this subroutine computes an approximation to the vector +c +c w(tn) = w(t0) + tn * phi( - A * tn ) * (r - A w(t0)) +c +c where phi(z) = (1-exp(z)) / z +c +c i.e. solves dw/dt = - A w + r in [t0,t0+ tn] (returns only w(t0+tn)) +c +c for matrices stored in diagonal (DIA) format. +c +c this routine constitutes an interface for the routine phipro for +c matrices stored in diagonal (DIA) format. The phipro routine uses +c reverse communication and as a result does not depend on any +c data structure of the matrix. + +c----------------------------------------------------------------------- +c ARGUMENTS +c---------- +c see phipro for meaning of parameters n, m, eps, tn, u, w, x, y. +c +c a, ioff, and ndiag are the arguments of the matrix: +c +c a(n,ndiag) = a rectangular array with a(*,k) containing the diagonal +c offset by ioff(k) (negative or positive or zero), i.e., +c a(i,jdiag) contains the element A(i,i+ioff(jdiag)) in +c the usual dense storage scheme. +c +c ioff = integer array containing the offsets of the ndiag diagonals +c ndiag = integer. the number of diagonals. +c +c----------------------------------------------------------------------- +c local variables +c + integer indic, ierr + + indic = 0 + 101 continue + call phipro (n, m, eps, tn, w, r, u, x, y, indic, ierr) + if (indic .eq. 1) goto 102 +c +c matrix vector-product for diagonal storage -- +c + call oped(n, x, y, a, ioff, ndiag) + goto 101 + 102 continue + return + end +c----------end-of-phiprod----------------------------------------------- +c----------------------------------------------------------------------- + subroutine phipro (n, m, eps, tn, w, r, u, x, y, indic, ierr) +c implicit real*8 (a-h,o-z) + integer n, m, indic, ierr + real*8 eps, tn, w(n), r(n), u(n,m+1), x(n), y(n) +c----------------------------------------------------------------------- +c +c this subroutine computes an approximation to the vector +c +c w(tn) = w(t0) + tn * phi( - A * tn ) * (r - A w(t0)) +c where phi(z) = (1-exp(z)) / z +c +c i.e. solves dw/dt=-Aw+r in [t0,t0+tn] (returns w(t0+tn)) +c t0 need not be known. +c +c note that for w(t0)=0 the answer is w=tn *phi(-tn * A) r +c in other words this allows to compute phi(A tn) v. +c This code will work well only for cases where eigenvalues are +c real (or nearly real) and positive. It has also been coded to +c work for cases where tn .lt. 0.0 (and A has real negative spectrum) +c +c----------------------------------------------------------------------- +c +c THIS IS A REVERSE COMMUNICATION IMPLEMENTATION. +c------------------------------------------------- +c USAGE: (see also comments on argument indic below). +c------ +c +c indic = 0 +c 1 continue +c call phipro (n, m, eps, tn, u, w, x, y, indic) +c if (indic .eq. 1) goto 2 <-- indic .eq. 1 means phipro has finished +c call matvec(n, x, y) <--- user's matrix-vec. product +c with x = input vector, and +c y = result = A * x. +c goto 1 +c 2 continue +c ..... +c +c----------------------------------------------------------------------- +c +c en entry: +c---------- +c n = dimension of matrix +c +c m = dimension of Krylov subspace (= degree of polynomial +c approximation to the exponential used. ) +c +c eps = scalar indicating the relative error tolerated for the result. +c the code will try to compute an answer such that +c norm2(exactanswer-approximation) / norm2(w) .le. eps +c +c tn = scalar by which to multiply matrix. (may be .lt. 0) +c the code will compute a solution to dw/dt = -A w + r, +c and overwrite the result w(tn) onto in w. +c +c w = real array of length n. Initial condition for the ODE system +c on input, result w(tn) on output (input and output argument) +c +c r = real array of length n. the constant term in the system +c dw/dt = -A w + r to be solved. +c +c u = work array of size n*(m+1) (used to hold the Arnoldi basis ) +c +c x, y = two real work vectors of length n each. x and y are used to +c carry the input and output vectors for the matrix-vector +c products y=Ax in the reverse communication protocole. +c see argument indic (return) below for details on their usage. +c +c indic = integer used as indicator for the reverse communication. +c in the first call enter indic = 0. +c +c ierr = error indicator. +c ierr = 1 means phipro was called with indic=1 (not allowed) +c ierr = -1 means that the input is zero the solution has been +c unchanged. +c +c on return: +c----------- +c +c w = contains the result w(tn)=w(t0)+tn*phi(-A*tn)*(r-Aw(t0)) +c when phipro has finished (as indicated by indic see below) +c +c indic = indicator for the reverse communication protocole. +c * INDIC .eq. 1 means that phipro has finished and w contains the +c result. +c * INDIC .gt. 1 means that phipro has not finished and that +c it is requesting another matrix vector product before +c continuing. The user must compute Ax where A is the matrix +c and x is the vector provided by phipro and return the +c result in y. Then phipro must be called again without +c changing any other argument. typically this is best +c implemented in a loop with phipro being called as long +c indic is returned with a value .ne. 1. +c +c NOTES: m should not exceed 60 in this version (see mmax below) +c----------------------------------------------------------------------- +c local variables +c + integer mmax + parameter (mmax=60) + real*8 errst, tcur, told, dtl, beta, red, dabs, dble + real*8 hh(mmax+2,mmax+1), z(mmax+1) + complex*16 wkc(mmax+1) + integer ih, k, job + logical verboz + data verboz/.true./ + save +c----------------------------------------------------------------------- +c indic = 4 means getting y=Ax needed in phipro +c indic = 3 means passing through only with result of y= Ax to phihes +c indic = 2 means phihes has finished its job +c indic = 1 means phipro has finished its job (real end)/ +c----------------------------------------------------------------------- + ierr = 0 + if (indic .eq. 3) goto 101 + if (indic .eq. 4) goto 11 + if (indic .eq. 1) then + ierr = 1 + return + endif +c----- + ih = mmax + m = min0(m,mmax) + tcur = 0.0d0 + dtl = tn - tcur + job = -1 +c-------------------- outer loop ----------------------------- + 100 continue + if(verboz) print *,'In PHIPRO, current time = ', tcur ,'---------' +c------------------------------------------------------------- +c ---- call phionential propagator --------------------------- +c------------------------------------------------------------- + told = tcur +c +c if (told + dtl .gt. tn) dtl = tn-told +c construct initial vector for Arnoldi: r - A w(old) +c + do 10 k=1, n + x(k) = w(k) + 10 continue + indic = 4 + return + 11 continue + do 12 k=1, n + u(k,1) = r(k) - y(k) + 12 continue +c + 101 continue + call phihes (n,m,dtl,eps,u,job,z,wkc,beta,errst,hh,ih,x, y,indic, + * ierr) +c----------------------------------------------------------------------- + if (ierr .ne. 0) return + if (indic .eq. 3) return + tcur = told + dtl + if(verboz) print *, ' tcur now = ', tcur, ' dtl = ', dtl +c +c relative error +c if(verboz) print *, ' beta', beta + errst = errst / beta +c--------- + if ((errst .le. eps) .and. ( (errst .gt. eps/100.0) .or. + * (tcur .eq. tn))) goto 102 +c +c use approximation : [ new err ] = fact**m * [cur. error] +c + red = (0.5*eps / errst)**(1.0d0 /dble(m) ) + dtl = dtl*red + if (dabs(told+dtl) .gt. dabs(tn) ) dtl = tn-told + if(verboz) print *, ' red =',red,' , reducing dt to: ', dtl +c------- + job = 1 + goto 101 +c------- + 102 continue +c + call project(n, m, w, dtl, u, z) +c never go beyond tcur + job = 0 + dtl = dmin1(dtl, tn-tcur) + if (dabs(tcur+dtl) .gt. dabs(tn)) dtl = tn-tcur + if (dabs(tcur) .lt. dabs(tn)) goto 100 + indic = 1 + return + end +c----------end-of-phipro------------------------------------------------ +c----------------------------------------------------------------------- + subroutine phihes (n,m,dt,eps,u,job,z,wkc,beta,errst,hh,ih, + * x, y, indic,ierr) +c implicit real*8 (a-h,o-z) + integer n, m, job, ih, indic, ierr + real*8 hh(ih+2,m+1), u(n,m+1), z(m+1), x(n), y(n) + complex*16 wkc(m+1) + real*8 dt, eps, beta, errst +c----------------------------------------------------------------------- +c this subroutine computes the Arnoldi basis Vm and the corresponding +c coeffcient vector ym in the approximation +c +c w ::= beta Vm ym +c where ym = phi(- Hm * dt) * e1 +c +c to the vector phi(-A * dt) w where A is an arbitary matrix and +c w is a given input vector. The phi function is defined by +c phi(z) = (1 - exp(z) ) / z +c +c In case job .lt.0 the arnoldi basis is recomputed. Otherwise the +c code assumes assumes that u(*) contains an already computed +c arnoldi basis and computes only the y-vector (which is stored in +c v(*)). Three different options are available through the argument job. +c----------------------------------------------------------------------- +c on entry: +c---------- +c n = dimension of matrix +c +c m = dimension of Krylov subspace (= degree of polynomial +c approximation to the phionential used. ) +c +c dt = scalar by which to multiply matrix. Can be viewed +c as a time step. dt must be positive [to be fixed]. +c +c eps = scalar indicating the relative error tolerated for the result. +c the code will try to compute an answer such that +c norm2(exactanswer-approximation) / norm2(w) .le. eps +c +c u = work array of size n*(m+1) to contain the Arnoldi basis +c +c w = real array of length n = input vector to which phi(-A) is +c to be applied. +c +c job = integer. job indicator. If job .lt. 0 then the Arnoldi +c basis is recomputed. If job .gt. 0 then it is assumed +c that the user wants to use a previously computed Krylov +c subspace but a different dt. Thus the Arnoldi basis and +c the Hessenberg matrix Hm are not recomputed. +c In that case the user should not modify the values of beta +c and the matrices hh and u(n,*) when recalling phipro. +c job = -1 : recompute basis and get an initial estimate for +c time step dt to be used. +c job = 0 : recompute basis and do not alter dt. +c job = 1 : do not recompute arnoldi basis. +c +c z = real work array of size (m+1) +c wkc = complex*16 work array of size (m+1) +c +c hh = work array of size size at least (m+2)*(m+1) +c +c ih+2 = first dimension of hh as declared in the calling program. +c ih must be .ge. m. +c +c----------------------------------------------------------------------- +c on return: +c----------- +c w2 = resulting vector w2 = phi(-A *dt) * w +c beta = real equal to the 2-norm of w. Needed if phipro will +c be recalled with the same Krylov subspace and a different dt. +c errst = rough estimates of the 2-norm of the error. +c hh = work array of dimension at least (m+2) x (m+1) +c +c----------------------------------------------------------------------- +c local variables +c + integer ndmax + parameter (ndmax=20) + real*8 alp0, fnorm, t, rm, ddot, dabs, dsqrt, dsign,dble + complex*16 alp(ndmax+1), rd(ndmax+1) + integer i, j, k, ldg, i0, i1, m1 + logical verboz + data verboz/.true./ + save +c------use degree 14 chebyshev all the time -------------------------- + if (indic .eq. 3) goto 60 +c +c------get partial fraction expansion of rational function ----------- +c----------------------------------------------------------------------- +c chebyshev (14,14) +c ldg= 7 +c alp0 = 0.183216998528140087E-11 +c alp(1)=( 0.557503973136501826E+02,-0.204295038779771857E+03) +c rd(1)=(-0.562314417475317895E+01, 0.119406921611247440E+01) +c alp(2)=(-0.938666838877006739E+02, 0.912874896775456363E+02) +c rd(2)=(-0.508934679728216110E+01, 0.358882439228376881E+01) +c alp(3)=( 0.469965415550370835E+02,-0.116167609985818103E+02) +c rd(3)=(-0.399337136365302569E+01, 0.600483209099604664E+01) +c alp(4)=(-0.961424200626061065E+01,-0.264195613880262669E+01) +c rd(4)=(-0.226978543095856366E+01, 0.846173881758693369E+01) +c alp(5)=( 0.752722063978321642E+00, 0.670367365566377770E+00) +c rd(5)=( 0.208756929753827868E+00, 0.109912615662209418E+02) +c alp(6)=(-0.188781253158648576E-01,-0.343696176445802414E-01) +c rd(6)=( 0.370327340957595652E+01, 0.136563731924991884E+02) +c alp(7)=( 0.143086431411801849E-03, 0.287221133228814096E-03) +c rd(7)=( 0.889777151877331107E+01, 0.166309842834712071E+02) +c----------------------------------------------------------------------- +c Pade of degree = (4,4) +c +c ldg= 2 +c alp(1)=(-0.132639894655051648E+03,-0.346517448171383875E+03) +c rd(1)=(-0.579242120564063611E+01, 0.173446825786912484E+01) +c alp(2)=( 0.926398946550511936E+02, 0.337809095284865179E+02) +c rd(2)=(-0.420757879435933546E+01, 0.531483608371348736E+01) +c +c Pade of degree = 8 +c + ldg= 4 + alp(1)=( 0.293453004361944040E+05, 0.261671093076405813E+05) + rd(1)=(-0.104096815812822569E+02, 0.523235030527069966E+01) + alp(2)=(-0.212876889060526154E+05,-0.764943398790569044E+05) + rd(2)=(-0.111757720865218743E+02, 0.173522889073929320E+01) + alp(3)=(-0.853199767523084301E+04,-0.439758928252937039E+03) + rd(3)=(-0.873657843439934822E+01, 0.882888500094418304E+01) + alp(4)=( 0.330386145089576530E+03,-0.438315990671386316E+03) + rd(4)=(-0.567796789779646360E+01, 0.127078225972105656E+02) +c + do 102 k=1, ldg + alp(k) = - alp(k) / rd(k) + 102 continue + alp0 = 0.0d0 +c +c if job .gt. 0 skip arnoldi process: +c + if (job .gt. 0) goto 2 +c------normalize vector u and put in first column of u -- + beta = dsqrt(ddot(n,u,1,u,1)) +c----------------------------------------------------------------------- + if(verboz) print *, ' In PHIHES, beta ', beta + if (beta .eq. 0.0d0) then + ierr = -1 + indic = 1 + return + endif +c + t = 1.0d0/beta + do 25 j=1, n + u(j,1) = u(j,1)*t + 25 continue +c------------------Arnoldi loop ----------------------------------------- +c fnorm = 0.0d0 + i1 = 1 + 58 i = i1 + i1 = i + 1 + do 59 k=1, n + x(k) = u(k,i) + 59 continue + indic = 3 + return + 60 continue + do 61 k=1, n + u(k,i1) = y(k) + 61 continue + i0 =1 +c switch for Lanczos version +c i0 = max0(1, i-1) + call mgsr (n, i0, i1, u, hh(1,i)) + fnorm = fnorm + ddot(i1, hh(1,i),1, hh(1,i),1) + if (hh(i1,i) .eq. 0.0) m = i + if (i .lt. m) goto 58 +c--------------done with arnoldi loop --------------------------------- + rm = dble(m) + fnorm = dsqrt( fnorm / rm ) +c------- put beta*e1 into z ------------------------------------------- + m1 = m+1 + do 4 i=1,m1 + hh(i,m1) = 0.0 + 4 continue +c +c compute initial dt when job .lt. 1 +c + if (job .ge. 0) goto 2 +c + t = 2.0*eps + do 41 k=1, m + t = 2.0*t*dble(k+1)/rm + 41 continue +c + t = rm* (t**(1.0d0/rm) ) / fnorm + if(verboz) print *, ' t, dt = ', t, dt + t = dmin1(dabs(dt),t) + dt = dsign(t, dt) +c---------------------- get the vector phi(Hm)e_1 + estimate ----------- + 2 continue + z(1) = beta + do 3 k=2, m1 + z(k) = 0.0d0 + 3 continue +c-------get : phi(H) * beta*e1 + call hes(ldg,m1,hh,ih,dt,z,rd,alp,alp0,wkc) +c-------error estimate + errst = dabs(z(m1)) + if(verboz) print *, ' error estimate =', errst +c----------------------------------------------------------------------- + indic = 2 + return + end +c----------------------------------------------------------------------- + subroutine mgsr (n, i0, i1, ss, r) +c implicit real*8 (a-h,o-z) + integer n, i0, i1 + real*8 ss(n,i1), r(i1) +c----------------------------------------------------------------------- +c modified gram - schmidt with partial reortho. the vector ss(*,i1) is +c orthogonalized against the first i vectors of ss (which are already +c orthogonal). the coefficients of the orthogonalization are returned in +c the array r +c------------------------------------------------------------------------ +c local variables +c + integer i, j, k, it + real*8 hinorm, tet, ddot, t, dsqrt + data tet/10.0d0/ + + do 53 j=1, i1 + r(j) = 0.0d0 + 53 continue + i = i1-1 + it = 0 + 54 hinorm = 0.0d0 + it = it +1 + if (i .eq. 0) goto 56 +c + do 55 j=i0, i + t = ddot(n, ss(1,j),1,ss(1,i1),1) + hinorm = hinorm + t**2 + r(j) = r(j) + t + call daxpy(n,-t,ss(1,j),1,ss(1,i1),1) + 55 continue + t = ddot(n, ss(1,i1), 1, ss(1,i1), 1) + 56 continue +c +c test for reorthogonalization see daniel et. al. +c two reorthogonalization allowed --- +c + if (t*tet .le. hinorm .and. it .lt. 2) goto 54 + t =dsqrt(t) + r(i1)= t + if (t .eq. 0.0d0) return + t = 1.0d0/t + do 57 k=1,n + ss(k,i1) = ss(k,i1)*t + 57 continue + return + end +c----------end-of-mgsr-------------------------------------------------- +c----------------------------------------------------------------------- + subroutine project(n, m, w, t, u, v) + integer n, m + real*8 u(n,m), v(m), w(n), t, scal +c +c computes the vector w = w + t * u * v +c +c local variables +c + integer j, k + + do 100 j=1,m + scal = t*v(j) + do 99 k=1,n + w(k) = w(k) + scal*u(k,j) + 99 continue + 100 continue + return + end +c----------------------------------------------------------------------- + subroutine hes (ndg,m1,hh,ih,dt,y,root,coef,coef0,w2) +c implicit real*8 (a-h,o-z) + integer ndg, m1, ih + real*8 hh(ih+2,m1), y(m1) + complex*16 coef(ndg), root(ndg), w2(m1) + real*8 dt, coef0 +c-------------------------------------------------------------------- +c computes phi ( H dt) * y (1) +c where H = Hessenberg matrix (hh) +c y = arbitrary vector. +c ---------------------------- +c ndg = number of poles as determined by getrat +c m1 = dimension of hessenberg matrix +c hh = hessenberg matrix (real) +c ih+2 = first dimension of hh +c dt = scaling factor used for hh (see (1)) +c y = real vector. on return phi(H dt ) y is computed +c and overwritten on y. +c root = poles of the rational approximation to phi as +c computed by getrat +c coef, +c coef0 = coefficients of partial fraction phiansion +c +c phi(t) ~ coef0 + sum Real [ coef(i) / (t - root(i) ] +c i=1,ndg +c +c valid for real t. +c coef0 is real, coef(*) is a complex array. +c +c-------------------------------------------------------------------- +c local variables +c + integer m1max + parameter (m1max=70) + complex*16 hloc(m1max+1,m1max), t, zpiv, dcmplx + real*8 yloc(m1max), dble + integer i, j, ii +c +c if (m1 .gt. m1max) print *, ' *** ERROR : In HES, M+1 TOO LARGE' +c +c loop associated with the poles. +c + do 10 j=1,m1 + yloc(j) = y(j) + y(j) = y(j)*coef0 + 10 continue +c + do 8 ii = 1, ndg +c +c copy Hessenberg matrix into temporary +c + do 2 j=1, m1 + do 1 i=1, j+1 + hloc(i,j) = dcmplx( dt*hh(i,j) ) + 1 continue + hloc(j,j) = hloc(j,j) - root(ii) + w2(j) = dcmplx(yloc(j)) + 2 continue +c +c forward solve +c + do 4 i=2,m1 + zpiv = hloc(i,i-1) / hloc(i-1,i-1) + do 3 j=i,m1 + hloc(i,j) = hloc(i,j) - zpiv*hloc(i-1,j) + 3 continue + w2(i) = w2(i) - zpiv*w2(i-1) + 4 continue +c +c backward solve +c + do 6 i=m1,1,-1 + t=w2(i) + do 5 j=i+1,m1 + t = t-hloc(i,j)*w2(j) + 5 continue + w2(i) = t/hloc(i,i) + 6 continue +c +c accumulate result in y. +c + do 7 i=1,m1 + y(i) = y(i) + dble ( coef(ii) * w2(i) ) + 7 continue + 8 continue + return + end +c----------end-of-hes--------------------------------------------------- +c----------------------------------------------------------------------- + subroutine daxpy(n,t,x,indx,y,indy) + integer n, indx, indy + real*8 x(n), y(n), t +c------------------------------------------------------------------- +c does the following operation +c y <--- y + t * x , (replace by the blas routine daxpy ) +c indx and indy are supposed to be one here +c------------------------------------------------------------------- + integer k + + do 1 k=1,n + y(k) = y(k) + x(k)*t +1 continue + return + end +c----------end-of-daxpy------------------------------------------------- +c----------------------------------------------------------------------- + function ddot(n,x,ix,y,iy) + integer n, ix, iy + real*8 ddot, x(n), y(n) +c------------------------------------------------------------------- +c computes the inner product t=(x,y) -- replace by blas routine ddot +c------------------------------------------------------------------- + integer j + real*8 t + + t = 0.0d0 + do 10 j=1,n + t = t + x(j)*y(j) +10 continue + ddot=t + return + end +c----------end-of-ddot-------------------------------------------------- +c----------------------------------------------------------------------- + diff --git a/UNSUPP/MATEXP/rexp.f b/UNSUPP/MATEXP/rexp.f new file mode 100644 index 0000000..c5629b0 --- /dev/null +++ b/UNSUPP/MATEXP/rexp.f @@ -0,0 +1,98 @@ + program exptest +c------------------------------------------------------------------- +c +c Test program for exponential propagator using Arnoldi approach +c This main program is a very simple test using diagonal matrices +c (Krylov subspace methods are blind to the structure of the matrix +c except for symmetry). This provides a good way of testing the +c accuracy of the method as well as the error estimates. +c +c------------------------------------------------------------------- + implicit real*8 (a-h,o-z) + parameter (nmax = 400, ih0=60, ndmx=20,nzmax = 7*nmax) + real*8 a(nzmax), u(ih0*nmax), w(nmax),w1(nmax),x(nmax),y(nmax) + integer ioff(10) + data iout/6/, a0/0.0/, b0/1.0/, epsmac/1.d-10/, eps /1.d-10/ +c +c set dimension of matrix +c + n = 100 +c--------------------------- define matrix ----------------------------- +c A is a single diagonal matrix (ndiag = 1 and ioff(1) = 0 ) +c----------------------------------------------------------------------- + ndiag = 1 + ioff(1) = 0 +c +c-------- entries in the diagonal are uniformly distributed. +c + h = 1.0d0 / real(n+1) + do 1 j=1, n + a(j) = real(j+1)* h + 1 continue +c-------- + write (6,'(10hEnter tn: ,$)') + read (5,*) tn +c + write (6,'(36hEpsilon (desired relative accuracy): ,$)') + read (5,*) eps +c------- + write (6,'(36h m (= dimension of Krylov subspace): ,$)') + read (5,*) m +c------- +c define initial conditions: chosen so that solution = (1,1,1,1..1)^T +c------- + do 2 j=1,n + w(j) = dexp(a(j)*tn) + 2 w1(j) = w(j) +c + call expprod (n, m, eps, tn, u, w, x, y, a, ioff, ndiag) +c + print *, ' final answer ' + print *, (w(k),k=1,20) +c + do 4 k=1,n + 4 w1(k) = dexp(-a(k)*tn) * w1(k) + print *, ' exact solution ' + print *, (w1(k),k=1,20) +c +c---------- computing actual 2-norm of error ------------------ +c + t = 0.0d0 + do 47 k=1,n + 47 t = t+ (w1(k)-w(k))**2 + t = dsqrt(t / ddot(n, w,1,w,1) ) +c + write (6,*) ' final error', t +c-------------------------------------------------------------- + stop + end +c------- + subroutine oped(n,x,y,diag,ioff,ndiag) +c====================================================== +c this kernel performs a matrix by vector multiplication +c for a diagonally structured matrix stored in diagonal +c format +c====================================================== + implicit real*8 (a-h,o-z) + real*8 x(n), y(n), diag(n,ndiag) + common nope, nmvec + integer j, n, ioff(ndiag) +CDIR$ IVDEP + do 1 j=1, n + y(j) = 0.00 + 1 continue +c + do 10 j=1,ndiag + io = ioff(j) + i1=max0(1,1-io) + i2=min0(n,n-io) +CDIR$ IVDEP + do 9 k=i1,i2 + y(k) = y(k)+diag(k,j)*x(k+io) + 9 continue + 10 continue + nmvec = nmvec + 1 + nope = nope + 2*ndiag*n + return + end +c diff --git a/UNSUPP/MATEXP/rphi.f b/UNSUPP/MATEXP/rphi.f new file mode 100644 index 0000000..17f75a4 --- /dev/null +++ b/UNSUPP/MATEXP/rphi.f @@ -0,0 +1,127 @@ + program phitest +c------------------------------------------------------------------- +c Test program for exponential propagator using Arnoldi approach +c This main program is a very simple test using diagonal matrices +c (Krylov subspace methods are blind to the structure of the matrix +c except for symmetry). This provides a good way of testing the +c accuracy of the method as well as the error estimates. This test +c program tests the phi-function variant instead of the exponential. +c +c The subroutine phipro which is tested here computes an approximation +c to the vector +c +c w(tn) = w(t0) + tn * phi( - A * tn ) * (r - A w(t0)) +c +c where phi(z) = (1-exp(z)) / z +c +c i.e. it solves dw/dt = -A w + r in [t0,t0+ tn] (returns only w(t0+tn)) +c +c In this program t0=0, tn is input by the user and A is a simple +c diagonal matrix. +c +c------------------------------------------------------------------- + implicit real*8 (a-h,o-z) + parameter (nmax = 400, ih0=60, ndmx=20,nzmax = 7*nmax) + real*8 a(nzmax), u(ih0*nmax), w(nmax),w1(nmax),x(nmax),y(nmax), + * r(nmax) + integer ioff(10) + data iout/6/,a0/0.0/,b0/1.0/,epsmac/1.d-10/,eps/1.d-10/ +c +c dimendion of matrix +c + n = 100 +c---------------------------define matrix ----------------------------- +c A is a single diagonal matrix (ndiag = 1 and ioff(1) = 0 ) +c----------------------------------------------------------------------- + ndiag = 1 + ioff(1) = 0 +c +c entriesin the diagonal are uniformly distributed. +c + h = 1.0d0 / real(n+1) + do 1 j=1, n + a(j) = real(j+1)*h + 1 continue +c-------- + write (6,'(10hEnter tn: ,$)') + read (5,*) tn +c + write (6,'(36hEpsilon (desired relative accuracy): ,$)') + read (5,*) eps +c------- + write (6,'(36h m (= dimension of Krylov subspace): ,$)') + read (5,*) m +c +c define initial conditions to be (1,1,1,1..1)^T +c + do 2 j=1,n + w(j) = 1.0 - 1.0/real(j+10) + r(j) = 1.0 + w1(j) = w(j) + 2 continue +c +c +c HERE IT IS DONE IN 10 SUBSTEPS +c nsteps = 10 +c tnh = tn/real(nsteps) +c MARCHING LOOP +c do jj =1, nsteps +c call phiprod (n, m, eps, tnh, u, w, r, x, y, a, ioff, ndiag) + call phiprod (n, m, eps, tn, u, w, r, x, y, a, ioff, ndiag) +c enddo + print *, ' final answer ' + print *, (w(k),k=1,20) +c +c exact solution +c + do 4 k=1,n + w1(k)=w1(k)+((1.0 - dexp(-a(k)*tn) )/a(k))*(r(k) + + - a(k)*w1(k) ) + 4 continue +c +c exact solution +c + print *, ' exact answer ' + print *, (w1(k),k=1,20) +c +c computing actual 2-norm of error +c + t = 0.0d0 + do 47 k=1,n + t = t+ (w1(k)-w(k))**2 + 47 continue + t = dsqrt(t / ddot(n, w,1,w,1) ) +c + write (6,*) ' final error', t +c----------------------------------------------------------------------- + stop + end +c----------------------------------------------------------------------- + subroutine oped(n,x,y,diag,ioff,ndiag) +c====================================================== +c this kernel performs a matrix by vector multiplication +c for a diagonally structured matrix stored in diagonal format +c====================================================== + implicit real*8 (a-h,o-z) + real*8 x(n), y(n), diag(n,ndiag) + common nope, nmvec + integer j, n, ioff(ndiag) +CDIR$ IVDEP + do 1 j=1, n + y(j) = 0.00 + 1 continue +c + do 10 j=1,ndiag + io = ioff(j) + i1=max0(1,1-io) + i2=min0(n,n-io) +CDIR$ IVDEP + do 9 k=i1,i2 + y(k) = y(k)+diag(k,j)*x(k+io) + 9 continue + 10 continue + nmvec = nmvec + 1 + nope = nope + 2*ndiag*n + return + end +c diff --git a/UNSUPP/PLOTS/README b/UNSUPP/PLOTS/README new file mode 100644 index 0000000..c555d1f --- /dev/null +++ b/UNSUPP/PLOTS/README @@ -0,0 +1,19 @@ + + ----------------- + Current contents: + ----------------- + +Some of the files that were originally in this directory +have been moved to the INOUT module, or were obsolte and removed. + +* psgrd.f contains subroutine "psgrid" which plots a symmetric graph. + +* texplt1.f contains subroutine "texplt" allows several matrices + in the same picture by calling texplt several times and exploiting job and + different shifts. + +* texgrid1.f contains subroutine "texgrd" which generates tex commands + for plotting a symmetric graph associated with a mesh. Allows + several grids in the same picture by calling texgrd several times and + exploiting job and different shifts. + diff --git a/UNSUPP/PLOTS/psgrd.f b/UNSUPP/PLOTS/psgrd.f new file mode 100644 index 0000000..3a6f4c5 --- /dev/null +++ b/UNSUPP/PLOTS/psgrd.f @@ -0,0 +1,190 @@ + subroutine psgrid (npts,ja,ia,xx,yy,title,ptitle,size,munt,iunt) +c----------------------------------------------------------------------- +c plots a symmetric graph defined by ja,ia and the coordinates +c xx(*),yy(*) +c----------------------------------------------------------------------- +c npts = number of points in mesh +c ja, ia = connectivity of mesh -- as given by pattern of sparse +c matrix. +c xx, yy = cordinates of the points. +c +c title = character*(*). a title of arbitrary length to be printed +c as a caption to the figure. Can be a blank character if no +c caption is desired. +c +c ptitle = position of title; 0 under the drawing, else above +c +c size = size of the drawing +c +c munt = units used for size : 'cm' or 'in' +c +c iunt = logical unit number where to write the matrix into. +c----------------------------------------------------------------------- + implicit none + integer npts,ptitle,iunt, ja(*), ia(*) + character title*(*), munt*2 + real*8 xx(npts),yy(npts) + real size +c----------------------------------------------------------------------- +c local variables -------------------------------------------------- +c----------------------------------------------------------------------- + integer nr,ii,k,ltit + real xi,yi,xj,yj,lrmrgn,botmrgn,xtit,ytit,ytitof,fnstit,siz, + * xl,xr, yb,yt, scfct,u2dot,frlw,delt,paperx,conv,dimen, + * haf,zero, xdim, ydim + real*8 xmin,xmax,ymin,ymax,max,min + integer j +c----------------------------------------------------------------------- + integer LENSTR + external LENSTR +c----------------------------------------------------------------------- + data haf /0.5/, zero/0.0/, conv/2.54/ + siz = size +c +c get max and min dimensions +c + xmin = xx(1) + xmax = xmin + ymin = yy(1) + ymax = ymin + do j=2, npts + xmax = max(xmax,xx(j)) + xmin = min(xmin,xx(j)) + ymax = max(ymax,yy(j)) + ymin = min(ymin,yy(j)) + enddo +c----------------------------------------------------------------------- +c n = npts + nr = npts + xdim = xmax -xmin + ydim = ymax -ymin + dimen = max(xdim,ydim) +c----------------------------------------------------------------------- + print *, ' xmin', xmin, ' xmax', xmax + print *, ' ymin', ymin, ' ymax', ymax, ' dimen ', dimen +c----------------------------------------------------------------------- +c +c units (cm or in) to dot conversion factor and paper size +c + if (munt.eq.'cm' .or. munt.eq.'CM') then + u2dot = 72.0/conv + paperx = 21.0 + else + u2dot = 72.0 + paperx = 8.5*conv + siz = siz*conv + end if +c +c left and right margins (drawing is centered) +c + lrmrgn = (paperx-siz)/2.0 +c +c bottom margin : 2 cm +c + botmrgn = 2.0/dimen +c scaling factor + scfct = siz*u2dot/dimen +c frame line witdh + frlw = 0.25/dimen +c font siz for title (cm) + fnstit = 0.5/dimen + ltit = LENSTR(title) +c +c position of title : centered horizontally +c at 1.0 cm vertically over the drawing + ytitof = 1.0/dimen + xtit = paperx/2.0 + ytit = botmrgn+siz*nr/dimen + ytitof +c almost exact bounding box + xl = lrmrgn*u2dot - scfct*frlw/2 + xr = (lrmrgn+siz)*u2dot + scfct*frlw/2 + yb = botmrgn*u2dot - scfct*frlw/2 + yt = (botmrgn+siz*ydim/dimen)*u2dot + scfct*frlw/2 + if (ltit.gt.0) then + yt = yt + (ytitof+fnstit*0.70)*u2dot + end if +c add some room to bounding box + delt = 10.0 + xl = xl-delt + xr = xr+delt + yb = yb-delt + yt = yt+delt +c +c correction for title under the drawing +c + if (ptitle.eq.0 .and. ltit.gt.0) then + ytit = botmrgn + fnstit*0.3 + botmrgn = botmrgn + ytitof + fnstit*0.7 + end if +c +c begin output +c + write(iunt,10) '%!' + write(iunt,10) '%%Creator: PSPLTM routine' + write(iunt,12) '%%BoundingBox:',xl,yb,xr,yt + write(iunt,10) '%%EndComments' + write(iunt,10) '/cm {72 mul 2.54 div} def' + write(iunt,10) '/mc {72 div 2.54 mul} def' + write(iunt,10) '/pnum { 72 div 2.54 mul 20 string' + write(iunt,10) 'cvs print ( ) print} def' + write(iunt,10) + 1 '/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def' +c +c we leave margins etc. in cm so it is easy to modify them if +c needed by editing the output file +c + write(iunt,10) 'gsave' + if (ltit.gt.0) then + write(iunt,*) '/Helvetica findfont',fnstit,' cm scalefont setfont' + write(iunt,*) xtit,' cm',ytit,' cm moveto' + write(iunt,'(3A)') '(',title(1:ltit),') Cshow' + end if +c + write(iunt,*) lrmrgn,' cm ',botmrgn,' cm translate' + write(iunt,*) siz,' cm ',dimen,' div dup scale ' +c +c draw a frame around the matrix // REMOVED +c +c del = 0.005 +c del2 = del*2.0 +c write(iunt,*) del, ' setlinewidth' +c write(iunt,10) 'newpath' +c write(iunt,11) -del2, -del2, ' moveto' +c write(iunt,11) dimen+del2,-del2,' lineto' +c write(iunt,11) dimen+del2, dimen+del2, ' lineto' +c write(iunt,11) -del2,dimen+del2,' lineto' +c write(iunt,10) 'closepath stroke' +c +c----------- plotting loop --------------------------------------------- + write(iunt,*) ' 0.01 setlinewidth' +c + do 1 ii=1, npts + +c if (mask(ii) .eq. 0) goto 1 + xi = xx(ii) - xmin + yi = yy(ii) - ymin +c write (iout+1,*) ' ******** ii pt', xi, yi, xmin, ymin + do 2 k=ia(ii),ia(ii+1)-1 + j = ja(k) + if (j .le. ii) goto 2 + xj = xx(j) - xmin + yj = yy(j) - ymin +c write (iout+1,*) ' j pt -- j= ',j, 'pt=', xj, yj +c +c draw a line from ii to j +c + write(iunt,11) xi, yi, ' moveto ' + write(iunt,11) xj, yj, ' lineto' + write(iunt,10) 'closepath stroke' + 2 continue + 1 continue +c----------------------------------------------------------------------- + write(iunt,10) 'showpage' + return +c + 10 format (A) + 11 format (2F9.2,A) + 12 format (A,4F9.2) + 13 format (2F9.2,A) +c----------------------------------------------------------------------- + end diff --git a/UNSUPP/PLOTS/texgrid1.f b/UNSUPP/PLOTS/texgrid1.f new file mode 100644 index 0000000..906099e --- /dev/null +++ b/UNSUPP/PLOTS/texgrid1.f @@ -0,0 +1,242 @@ + subroutine texgrd(npts,ja,ia,xx,yy,munt,size,vsize,hsize, + * xleft,bot,job,title,ptitle,ijk,node,nelx,iunt) +c----------------------------------------------------------------------- + integer npts,iunt,ptitle,ja(*),ia(*), ijk(node,*) + character title*(*), munt*2 + real*8 xx(npts), yy(npts) +c----------------------------------------------------------------------- +c allows to have several grids in same picture by calling texgrd +c several times and exploiting job and different shifts. +c----------------------------------------------------------------------- +c input arguments description : +c +c npts = number of rows in matrix +c +c ncol = number of columns in matrix +c +c mode = integer indicating whether the matrix is stored in +c CSR mode (mode=0) or CSC mode (mode=1) or MSR mode (mode=2) +c +c ja = column indices of nonzero elements when matrix is +c stored rowise. Row indices if stores column-wise. +c ia = integer array of containing the pointers to the +c beginning of the columns in arrays a, ja. +c +c munt = units used for sizes : either 'cm' or 'in' +c +c size = size of the matrix box in 'munt' units +c +c vsize = vertical size of the frame containing the picture +c in 'munt' units +c +c hsize = horizontal size of the frame containing the picture +c in 'munt' units +c +c xleft = position of left border of matrix in 'munt' units +c +c bot = position of bottom border of matrix in 'munt' units +c +c job = job indicator for preamble and post process +c can be viewed as a 2-digit number job = [job1,job2] +c where job1 = job /10 , job2 = job - 10*job1 = mod(job,10) +c job2 relates to preamble/post processing: +c job2 = 0: all preambles+end-document lines +c job2 = 1: preamble only +c job2 = 2: end-document only +c anything else: no preamble or end-docuiment lines +c Useful for plotting several matrices in same frame. +c +c job1 relates to the way in which the nodes and elements must +c be processed: +c job1 relates to options for the plot. +c job1 = 0 : only a filled circle for the nodes, no labeling +c job1 = 1 : labels the nodes (in a circle) +c job1 = 2 : labels both nodes and elements. +c job1 = 3 : no circles, no labels +c +c title = character*(*). a title of arbitrary length to be printed +c as a caption to the matrix. Can be a blank character if no +c caption is desired. Can be put on top or bottom of matrix +c se ptitle. +c +c ptitle = position of title; 0 under the frame, else above +c +c nlines = number of separation lines to draw for showing a partionning +c of the matrix. enter zero if no partition lines are wanted. +c +c lines = integer array of length nlines containing the coordinates of +c the desired partition lines . The partitioning is symmetric: +c a horizontal line across the matrix will be drawn in +c between rows lines(i) and lines(i)+1 for i=1, 2, ..., nlines +c an a vertical line will be similarly drawn between columns +c lines(i) and lines(i)+1 for i=1,2,...,nlines +c +c iunt = logical unit number where to write the matrix into. +c----------------------------------------------------------------------- + real*8 xmin, xmax, ymin, ymax + + n = npts + siz = size + job1 = job /10 + job2 = job - 10*job1 +c +c get max and min dimensions +c + xmin = xx(1) + xmax = xmin + ymin = yy(1) + ymax = ymin +c + do j=2, npts + xmax = max(xmax,xx(j)) + xmin = min(xmin,xx(j)) + ymax = max(ymax,yy(j)) + ymin = min(ymin,yy(j)) + enddo +c----------------------------------------------------------------------- + n = npts + xdim = xmax -xmin + ydim = ymax -ymin + dimen = max(xdim,ydim) +c----------------------------------------------------------------------- + print *, ' xmin', xmin, ' xmax', xmax + print *, ' ymin', ymin, ' ymax', ymax, ' dimen ', dimen +c----------------------------------------------------------------------- +c +c units (cm or in) to dot conversion factor and paper size +c + tdim = max(ydim,xdim) + unit0 = size/tdim + hsiz = hsize/unit0 + vsiz = vsize/unit0 + siz = size/unit0 +c +c size of little circle for each node -- cirr = in local units +c cirabs in inches (or cm) -- rad = radius in locl units -- +c + cirabs = 0.15 + if (job1 .le. 0) cirabs = 0.08 + if (job1 .eq. 3) cirabs = 0.0 + cirr = cirabs/unit0 + rad = cirr/2.0 +c +c begin document generation +c + if (job2 .le. 1) then + write (iunt,*) ' \\documentstyle[epic,eepic,12pt]{article} ' + write (iunt,*) ' \\begin{document}' + write (iunt,100) unit0, munt + write (iunt,99) hsiz, vsiz + else +c redeclare unitlength + write (iunt,100) unit0, munt + endif + if (job1 .le. 0) then + write (iunt,101) cirr + else + write (iunt,102) cirr + endif + 102 format('\\def\\cird{\\circle{',f5.2,'} }') + 101 format('\\def\\cird{\\circle*{',f5.2,'} }') + 99 format('\\begin{picture}(',f8.2,1h,,f8.2,1h)) + 100 format(' \\setlength{\\unitlength}{',f5.3,a2,'}') +c +c bottom margin between cir and title +c + xs = xleft / unit0 + (tdim - xdim)*0.5 + (hsiz - siz)*0.5 + ys = bot / unit0 - ymin +c + xmargin = 0.30/unit0 + if (munt .eq. 'cm' .or. munt .eq. 'CM') xmargin = xmargin*2.5 + xtit = xs + xmin + if (ptitle .eq. 0) then + ytit = ys + ymin - xmargin + else + ytit = ys + ymax + xmargin + endif + ltit = LENSTR(title) + write(iunt,111) xtit,ytit,xdim,xmargin,title(1:ltit) +c + 111 format ('\\put(',F6.2,',',F6.2, + * '){\\makebox(',F6.2,1h,,F6.2,'){',A,2h}}) +c +c print all the circles if needed +c +c ##### temporary for showing f +c write (iunt,102) 0.01 +c write (iunt,112)xs+xx(1), ys+yy(1) +c----------------------------------------------------------------------- + if (job1 .eq. 3) goto 230 + do 22 i=1, npts + x = xs + xx(i) + y = ys + yy(i) + write(iunt,112) x, y + 112 format ('\\put(',F6.2,',',F6.2,'){\\cird}') +c write(iunt,113) x-rad, y-rad, cirr, cirr, i +c 113 format ('\\put(',F6.2,',',F6.2, +c * '){\\makebox(',F6.2,1h,,F6.2,'){\\scriptsize ',i4,2h}}) + if (job1 .ge. 1) then + write(iunt,113) x, y, i + endif + 113 format ('\\put(',F6.2,',',F6.2, + * '){\\makebox(0.0,0.0){\\scriptsize ',i4,2h}}) + 22 continue + 230 continue +c +c number the elements if needed +c + if (job1 .eq. 2) then + do 23 iel = 1, nelx + x = 0.0 + y = 0.0 + do j=1, node + x = x+xx(ijk(j,iel)) + y = y+yy(ijk(j,iel)) + enddo + x = xs + x / real(node) + y = ys + y / real(node) + write(iunt,113) x, y, iel + 23 continue + endif +c +c draw lines +c + write (iunt,*) ' \\Thicklines ' + do 1 ii=1, npts + xi = xs+ xx(ii) + yi = ys+ yy(ii) + do 2 k=ia(ii),ia(ii+1)-1 + j = ja(k) + if (j .le. ii) goto 2 + xj = xs + xx(j) + yj = ys + yy(j) + xspan = xj - xi + yspan = yj - yi + tlen = sqrt(xspan**2 + yspan**2) + if (abs(xspan) .gt. abs(yspan)) then + ss = yspan / tlen + cc = sqrt(abs(1.0 - ss**2)) + cc = sign(cc,xspan) + else + cc = xspan / tlen + ss = sqrt(abs(1.0 - cc**2)) + ss = sign(ss,yspan) + endif +c print *, ' ss -- cc ', ss, cc +c write(iunt,114)xi,yi,xj,yj + write(iunt,114)xi+cc*rad,yi+ss*rad,xj-cc*rad,yj-ss*rad + 114 format('\\drawline(',f6.2,1h,,f6.2,')(',f6.2,1h,,f6.2,1h)) +c tlen = tlen - 2.0*cirr +c write(iunt,114) xi+cc*cirr,yi+ss*cirr,cc,ss,tlen +c 114 format('\\put(',f6.2,1h,,f6.2,'){\\line(', +c * f6.2,1h,,f6.2,'){',f6.2,'}}') + 2 continue + 1 continue +c----------------------------------------------------------------------- + if (job2 .eq. 0 .or. job2 .eq. 2) then + write (iunt,*) ' \\end{picture} ' + write (iunt,*) ' \\end{document} ' + endif +c + return + end diff --git a/UNSUPP/PLOTS/texplt1.f b/UNSUPP/PLOTS/texplt1.f new file mode 100644 index 0000000..97f3661 --- /dev/null +++ b/UNSUPP/PLOTS/texplt1.f @@ -0,0 +1,243 @@ + subroutine texplt(nrow,ncol,mode,ja,ia,munt,size,vsize,hsize, + * xleft,bot,job,title,ptitle,nlines,lines,iunt) +c----------------------------------------------------------------------- + integer nrow,ncol,mode,iunt,ptitle,ja(*),ia(*),lines(nlines) + character title*(*), munt*2 +c----------------------------------------------------------------------- +c allows to have several matrices in same picture by calling texplt +c several times and exploiting job and different shifts. +c----------------------------------------------------------------------- +c input arguments description : +c +c nrow = number of rows in matrix +c +c ncol = number of columns in matrix +c +c mode = integer indicating whether the matrix is stored in +c CSR mode (mode=0) or CSC mode (mode=1) or MSR mode (mode=2) +c +c ja = column indices of nonzero elements when matrix is +c stored rowise. Row indices if stores column-wise. +c ia = integer array of containing the pointers to the +c beginning of the columns in arrays a, ja. +c +c munt = units used for sizes : either 'cm' or 'in' +c +c size = size of the matrix box in 'munt' units +c +c vsize = vertical size of the frame containing the picture +c in 'munt' units +c +c hsize = horizontal size of the frame containing the picture +c in 'munt' units +c +c xleft = position of left border of matrix in 'munt' units +c +c bot = position of bottom border of matrix in 'munt' units +c +c job = job indicator for preamble and post process +c +c can be thought of as a 2-digit number job = [job1,job2] +c where job1 = job /10 , job2 = job - 10*job1 = mod(job,10) +c job2 = 0: all preambles+end-document lines +c job2 = 1: preamble only +c job2 = 2: end-document only +c anything else for job2: no preamble or end-docuiment lines +c Useful for plotting several matrices in same frame. +c +c job1 indicates what to put for a nonzero dot. +c job1 relates to preamble/post processing: +c job1 = 0 : a filled squate +c job1 = 1 : a filled circle +c job1 = 2 : the message $a_{ij}$ where i,j are the trow/column +c positions of the nonzero element. +c +c title = character*(*). a title of arbitrary length to be printed +c as a caption to the matrix. Can be a blank character if no +c caption is desired. Can be put on top or bottom of matrix +c se ptitle. +c +c ptitle = position of title; 0 under the frame, else above +c +c nlines = number of separation lines to draw for showing a partionning +c of the matrix. enter zero if no partition lines are wanted. +c +c lines = integer array of length nlines containing the coordinates of +c the desired partition lines . The partitioning is symmetric: +c a horizontal line across the matrix will be drawn in +c between rows lines(i) and lines(i)+1 for i=1, 2, ..., nlines +c an a vertical line will be similarly drawn between columns +c lines(i) and lines(i)+1 for i=1,2,...,nlines +c +c iunt = logical unit number where to write the matrix into. +c----------------------------------------------------------------------- + data haf /0.5/, zero/0.0/, conv/2.54/ +c----------------------------------------------------------------------- + n = ncol + if (mode .eq. 0) n = nrow + job1 = job /10 + job2 = job - 10*job1 + maxdim = max(nrow, ncol) + rwid = real(ncol-1) + rht = real(nrow-1) + unit0 = size/real(maxdim) + hsiz = hsize/unit0 + vsiz = vsize/unit0 + siz = size/unit0 +c +c size of little box for each dot -- boxr = in local units +c boxabs in inches (or cm) +c + boxr = 0.6 + boxabs = unit0*boxr +c +c spaces between frame to nearest box +c + space = 0.03/unit0+(1.0-boxr)/2.0 +c +c begin document generation +c for very first call better have \unitlength set first.. + if (job2 .le. 1) then + write (iunt,*) ' \\documentstyle[epic,12pt]{article} ' + write (iunt,*) ' \\begin{document}' + write (iunt,100) unit0, munt + write (iunt,99) hsiz, vsiz + else +c redeclare unitlength + write (iunt,100) unit0, munt + endif +c----- always redefine units + + if (job1 .eq. 0) then + write (iunt,101) boxabs, boxabs + else + write (iunt,102) boxabs/unit0 + endif + 100 format(' \\setlength{\\unitlength}{',f5.3,a2,'}') + 99 format('\\begin{picture}(',f8.2,1h,,f8.2,1h)) + 101 format('\\def\\boxd{\\vrule height',f7.4,'in width',f7.4,'in }') + 102 format('\\def\\boxd{\\circle*{',f7.4,'}}') +c +c draw a frame around the matrix +c get shifts from real inches to local units +c + xs = xleft/unit0 + (hsiz-siz)*0.5 + ys = bot/unit0 +c + eps = 0.0 + xmin = xs + xmax = xs +rwid + boxr + 2.0*space + ymin = ys + ymax = ys+rht + boxr + 2.0*space +c +c bottom margin between box and title +c + xmargin = 0.30/unit0 + if (munt .eq. 'cm' .or. munt .eq. 'CM') xmargin = xmargin*2.5 + xtit = 0.5*(xmin+xmax) + xtit = xmin + ytit = ymax + if (ptitle .eq. 0) ytit = ymin - xmargin + xdim = xmax-xmin + ltit = LENSTR(title) + write(iunt,111) xtit,ytit,xdim,xmargin,title(1:ltit) +c + 111 format ('\\put(',F6.2,',',F6.2, + * '){\\makebox(',F6.2,1h,F6.2,'){',A,2h}}) +c + write(iunt,*) ' \\thicklines' + write (iunt,108) xmin,ymin,xmax,ymin,xmax,ymax, + * xmin,ymax,xmin,ymin + 108 format('\\drawline',1h(,f8.2,1h,,f8.2,1h), + * 1h(,f8.2,1h,,f8.2,1h), 1h(,f8.2,1h,,f8.2,1h), + * 1h(,f8.2,1h,,f8.2,1h), 1h(,f8.2,1h,,f8.2,1h)) +c +c draw the separation lines +c +c if (job1 .gt.0) then +c xs = xs + 0.25 +c ys = ys + 0.25 +c endif + write(iunt,*) ' \\thinlines' + do 22 kol=1, nlines + isep = lines(kol) +c +c horizontal lines +c + yy = ys + real(nrow-isep) + write(iunt,109) xmin, yy, xmax, yy +c +c vertical lines +c + xx = xs+real(isep) + write(iunt,109) xx, ymin, xx, ymax + 22 continue +c + 109 format('\\drawline', + * 1h(,f8.2,1h,,f8.2,1h), 1h(,f8.2,1h,,f8.2,1h)) + +c-----------plotting loop --------------------------------------------- +c +c add some space right of the frame and up from the bottom +c + xs = xs+space + ys = ys+space +c----------------------------------------------------------------------- + do 1 ii=1, n + istart = ia(ii) + ilast = ia(ii+1)-1 + if (mode .eq. 1) then + do 2 k=istart, ilast + if (job1 .le. 1) then + write(iunt,12) xs+real(ii-1),ys+real(nrow-ja(k)) + else + write(iunt,13) xs+real(ii-1),ys+real(nrow-ja(k)), + * ii,ja(k) + endif + 2 continue + else + y = ys+real(nrow-ii) + do 3 k=istart, ilast + if (job1 .le. 1) then + write(iunt,12) xs+real(ja(k)-1), y + else + write(iunt,13) xs+real(ja(k)-1), y, ii, ja(k) + endif + 3 continue +c add diagonal element if MSR mode. + if (mode .eq. 2) + * write(iunt,12) xs+real(ii-1), ys+real(nrow-ii) + endif + 1 continue +c----------------------------------------------------------------------- + 12 format ('\\put(',F6.2,',',F6.2,')','{\\boxd}') + 13 format ('\\put(',F6.2,',',F6.2,')','{$a_{',i3,1h,,i3,'}$}') +c----------------------------------------------------------------------- + if (job2 .eq. 0 .or. job2 .eq. 2) then + write (iunt,*) ' \\end{picture} ' + write (iunt,*) ' \\end{document} ' + endif +c + return + end + integer function lenstr0(s) +c----------------------------------------------------------------------- +c return length of the string S +c----------------------------------------------------------------------- + character*(*) s + integer len + intrinsic len + integer n +c----------------------------------------------------------------------- + n = len(s) +10 continue + if (s(n:n).eq.' ') then + n = n-1 + if (n.gt.0) go to 10 + end if + lenstr0 = n +c + return +c----------------------------------------------------------------------- + end +c----------------------------------------------------------------------- diff --git a/UNSUPP/README b/UNSUPP/README new file mode 100644 index 0000000..98e0bbc --- /dev/null +++ b/UNSUPP/README @@ -0,0 +1,57 @@ + + ---------- + | UNSUPP | + ---------- + + This is meant to contain any subroutine that is not part + of SPARSKIT proper (for example preconditioners, iterative + solvers, plotting and other tools,...) but which are + nevertheless provided with the understanding that they may + not be the best codes around or that there is further work + needed on them.. + + CONTRIBUTIONS REQUESTED. + ----------------------- + ----------------- + Current contents: + ----------------- +SUBDIRECTORY BLAS1 +------------------ + +* blas1.f : includes subroutines: + dcopy : copies a vector, x, to a vector, y. + ddot : dot product of two vectors. + csscal: scales a complex vector by a real constant. + cswap : interchanges two vectors. + csrot : applies a plane rotation. + cscal : scales a vector by a constant. + ccopy : copies a vector, x, to a vector, y. + drotg : construct givens plane rotation. + drot : applies a plane rotation. + dswap : interchanges two vectors. + dscal : scales a vector by a constant. + daxpy : constant times a vector plus a vector. + +SUBDIRECTORY PLOTS +------------------ + +* psgrd.f contains subroutine "psgrid" which plots a symmetric graph. + +* texplt1.f contains subroutine "texplt" allows several matrices + in the same picture by calling texplt several times and exploiting job and + different shifts. + +* texgrid1.f contains subroutine "texgrd" which generates tex commands + for plotting a symmetric graph associated with a mesh. Allows + several grids in the same picture by calling texgrd several times and + exploiting job and different shifts. + + + SUBDIRECTORY MATEXP + ------------------- + routines related to matrix exponentials. + + +* exppro.f computes w=exp( t A) v -- + a simple test program rexp.f +* phipro.f computes w = phi(At)v, where phi(x)=(1-exp(x))/x; + Also allows to solve the P.D.E. system y'= A y + b diff --git a/dotests b/dotests new file mode 100755 index 0000000..82aeddc --- /dev/null +++ b/dotests @@ -0,0 +1,144 @@ +#!/bin/sh +# +# SPARSKIT script for making and running all test programs. +# Last modified: May 9, 1994. + +make all +cd BLASSM +echo Making tests in BLASSM directory +make mvec.ex +make tester.ex +cd .. +cd FORMATS +echo Making tests in FORMATS directory +make un.ex +make fmt.ex +make rvbr.ex +cd .. +cd INFO +echo Making tests in INFO directory +make info1.ex +cd .. +cd INOUT +echo Making tests in INOUT directory +make chk.ex +make hb2ps.ex +make hb2pic.ex +cd .. +cd ITSOL +echo Making tests in ITSOL directory +make riters.ex +make rilut.ex +make riter2.ex +cd .. +cd MATGEN/FDIF +echo Making tests in MATGEN/FDIF directory +make gen5.ex +make genbl.ex +cd ../.. +cd MATGEN/FEM +echo Making tests in MATGEN/FEM directory +make fem.ex +cd ../.. +cd MATGEN/MISC +echo Making tests in MATGEN/MISC directory +make sobel.ex +make zlatev.ex +make markov.ex +cd ../.. +cd UNSUPP/MATEXP +echo Making tests in UNSUPP/MATEXP directory +make exp.ex +make phi.ex +cd ../.. + +# run all test programs + +cd BLASSM +echo Testing BLASSM/mvec.ex --------------------------------------- +./mvec.ex +echo Testing BLASSM/tester.ex --------------------------------------- +./tester.ex +cd .. +cd FORMATS +echo Testing FORMATS/un.ex --------------------------------------- +./un.ex +cat unary.mat +echo Testing FORMATS/fmt.ex --------------------------------------- +./fmt.ex +grep ERROR *.mat +ls -s *.mat +echo Testing FORMATS/rvbr.ex --------------------------------------- +./rvbr.ex +cd .. +cd INFO +echo Testing INFO/info1.ex --------------------------------------- +./info1.ex < saylr1 +cd .. +cd INOUT +echo Testing INOUT/chk.ex --------------------------------------- +./chk.ex +echo Testing INOUT/hb2ps.ex --------------------------------------- +./hb2ps.ex < ../INFO/saylr1 > saylr1.ps +echo Testing INOUT/hb2pic.ex --------------------------------------- +./hb2pic.ex < ../INFO/saylr1 > saylr1.pic +cd .. +cd ITSOL +echo Testing ITSOL/riters.ex --------------------------------------- +./riters.ex +echo Testing ITSOL/rilut.ex --------------------------------------- +./rilut.ex +echo Testing ITSOL/riter2.ex --------------------------------------- +./riter2.ex < ../INFO/saylr1 +cd .. +cd MATGEN/FDIF +echo Testing MATGEN/FDIF/gen5.ex --------------------------------------- +./gen5.ex << \EOF +10 10 1 +testpt.mat +EOF +echo Testing MATGEN/FDIF/genbl.ex --------------------------------------- +./genbl.ex << \EOF +10 10 1 +4 +testbl.mat +EOF +cd ../.. +cd MATGEN/FEM +echo Testing MATGEN/FEM/fem.ex --------------------------------------- +./fem.ex << \EOF +2 +2 +EOF +cat mat.hb +cd ../.. +cd MATGEN/MISC +echo Testing MATGEN/MISC/sobel.ex --------------------------------------- +./sobel.ex << \EOF +10 +EOF +echo Testing MATGEN/MISC/zlatev.ex --------------------------------------- +./zlatev.ex +cat zlatev1.mat +cat zlatev2.mat +cat zlatev3.mat +echo Testing MATGEN/MISC/markov.ex --------------------------------------- +./markov.ex << \EOF +10 +EOF +cat markov.mat +cd ../.. +cd UNSUPP/MATEXP +echo Testing UNSUPP/MATEXP/exp.ex --------------------------------------- +./exp.ex << \EOF +0.1 +0.00001 +10 +EOF +echo Testing UNSUPP/MATEXP/phi.ex --------------------------------------- +./phi.ex << \EOF +0.1 +0.00001 +10 +EOF +cd ../.. diff --git a/logfile b/logfile new file mode 100644 index 0000000..918c71f --- /dev/null +++ b/logfile @@ -0,0 +1,329 @@ + +---------------------------------------------------------------------- +SPARSKIT Revision History +------------------------------------------------------------------------ + +May 9, 1994 (Version 2) + +Warning: +The interface for gen57pt has changed. +The interface for csrbnd has changed. +The interface for bsrcsr has changed. + +New or rearranged modules: +ITSOL/ilut.f -- four preconditioners (old UNSUPP/SOLVERS plus ilutp) +ITSOL/iters.f -- nine iterative solvers using reverse communication +MATGEN -- rearranged into three subdirectories: FDIF, FEM, MISC. +MATGEN/MISC/sobel.f-- generate matrices from a statistical application +ORDERINGS/ccn -- routines for strongly connected components +ORDERINGS/color.f -- coloring based routines for reordering +ORDERINGS/levset.f -- level set based routines for reordering +UNSUPP/PLOTS -- many routines have been moved to the INOUT module + +New format: VBR (Variable block row) +------------------------------------------------------------------------ +May 25, 1994 +Fixed a bug in FORMATS/unary.f/levels, found by Aart J.C. Bik, Leiden. +------------------------------------------------------------------------ +June 3, 1994 +The symmetric and nonsymmetric carpenter square format has been renamed +to the symmetric and unsymmetric sparse skyline format. This is simply +a name change for the functions: + csrucs to csruss + ucscsr to usscsr + csrscs to csrsss + scscsr to ssscsr +This is a new format that was not in version 1 of SPARSKIT. +------------------------------------------------------------------------ +June 27, 1994 + +The function ssrcsr has changed, to make it more flexible (K. Wu, UMN). +The old version will still be available in xssrcsr, but may be deleted +in the near future. Please let us know of any bugs, or errors in the +code documentation. + +The interface to msrcsr has changed, to make the function in place +(R. Bramley, Indiana). + +A number of minor bug fixes to the INOUT module (R. Bramley, Indiana). + +ICOPY in ccn.f was renamed to CCNICOPY to eliminate name conflicts +with other libraries. + +Very minor typographical fixes were made to the paper.* documentation. +------------------------------------------------------------------------ +August 3, 1994 + +dinfo13.f was modified very slightly to handle skew-symmetric matrices. +------------------------------------------------------------------------ +August 8, 1994 + +Bug fixed in usscsr (D. Su). + +Bug fixed in ssrcsr (K. Wu). +------------------------------------------------------------------------ +August 18, 1994 + +New, more efficient version of cooell. The old version will still be +available in xcooell, but may be deleted in the near future. (K. Wu) + +Bug fixed in INFO/infofun/ansym. (K. Wu) +------------------------------------------------------------------------ +September 22, 1994 + +Bug fixed in FORMATS/unary/getdia. (John Red-horse, Sandia) + +Changes to ITSOL/iters.f: +Bug fix in TFQMR; initialization of workspace; number of matrix-vector +multiplications reported now includes those done in initialization; +added routine FOM (Full Orthogonalization Method). (K. Wu) + +This version has only been tested on Solaris, and the test script +output is in out.new. The other outputs are somewhat out of date. +The changes have not been major; please let us know if you find +any incompatibilities. Thanks. (E. Chow) +------------------------------------------------------------------------ +October 10, 1994 + +formats.f: revised ssrcsr to be able to sort the column of the matrix +produced, revised cooell to fill the unused entries in AO,JAO with zero +diagonal elements. (K. Wu) + +unary.f: new routine clncsr for removing duplicate entries, sorting +columns of the input matrix, it requires less work space than csort. +(K. Wu) + +iters.f: bug fix in fom. (K. Wu) + +chkfmt1.f (test program): bug fix in call to ssrcsr. + +dotests script: slight modification when running fmt.ex + +matvec.f: added atmuxr, Tranpose(A) times a vector, where A is rectangular +in CSR format. Also useful for A times a vector, where A is rectangular +in CSC format. Very similar to atmux. (E. Chow) +------------------------------------------------------------------------ +October 17, 1994 + +Minor fix to ilut.f, proper stopping when maxits is a multiple of the +Krylov subspace size. + +A number of changes to iters.f: +(1) add reorthgonalization to the Modified Gram-Schmidt procedures; +(2) check number of matrix-vector multiplications used at the end of +evey Arnoldi step; +(3) in the initialization stage of the iterative solvers, clear fpar +elements to zero. +------------------------------------------------------------------------ +November 16, 1994 + +Selective reorthogonalization replaces reorthogonalization change +of Oct. 17, 1994. +------------------------------------------------------------------------ +November 23, 1994 + +Added csrcsc2, a minor variation on csrcsc for rectangular matrices. +csrcsc now calls csrcsc2. + +Removed a useless line in infofun.f that could give a compiler warning. + +In the ILUT preconditioner, lfil-1 new fill-ins for rows in the +strictly upper part was used. This has been changed to lfil, +to be consistent with the strictly lower part. + +Replaced levset.f with dsepart.f, which adds a number of new partitioners: +rdis, dse2way, dse, in addition to the original dblstr. +The new perphn subroutine no longer takes the iperm array. +------------------------------------------------------------------------ +January 3, 1995 + +FORMATS/formats.f:ellcsr ia(1) was not set. (Reported by J. Schoon.) +------------------------------------------------------------------------ +January 30, 1995 + +BLASSM/blassm.f:amub fixed the documentation. (Reported by D. O'Leary.) +------------------------------------------------------------------------ +February 27, 1995 + +iters.f: the reverse communication protocol has been augmented to make +performing users own convergence test easier. minor bug fixes. + +unary.f: subroutine clncsr is slightly changed so that it will remove +zero entries. also minor corrections to its documentation. + +formats.f: subroutine ssrcsr is slightly changed so it may optionally +remove zero entries. also minor corrections to its documentation. + +infofun.f: subroutine ansym is rewritten to compute the Frobineus norm +of the pattern-nonsymmetric part directly insead of computing it from +the difference between the Frobineus of the whole matrix and its +pattern-symmetric part. This should make the answer of 'FAN' more +reliable. +------------------------------------------------------------------------ +March 21, 1995 + +Bug fix in iters.f:fom. +Also, FOM, GMRES, FGMRES modified so that if a zero pivot is +encountered in the triangular solve part of the algorithm, +the solve is truncated. + +The latest output of the dotests script as run on a solaris 2 machine +is in out.sol2. +------------------------------------------------------------------------ +March 27, 1995 + +Fixes to ILUT and ILUTP. +Backed out of the change of Nov. 23, 1994. The original code was +correct (lenu includes the diagonal). +A smaller drop tolerance than prescribed was used (namely, by +the 1-norm of the row); this has now been fixed. +------------------------------------------------------------------------ +April 12, 1995 + +Minor fix in rilut.f. A duplicate call to ilut has been removed. +------------------------------------------------------------------------ +April 21, 1995 + +Cleaner versions of ILUT and ILUTP. Note that the interface has been +changed slightly (workspace parameters have been coalesced), and the +definition of lfil has changed. +ILUK, the standard level ILU(k), has been added to ilut.f. +Due to these changes, ilut.f, and rilut.f have changed. +Also, riters.f riter2.f have changed where they call ilut. + +The Block Sparse Row (BSR) format has changed, so that entries are +stored in A(ni,ni,nnz), rather than A(nnz,ni,ni), where the blocks +are ni by ni, and there are nnz blocks. This stores the entries of +the blocks contiguously so that they may be passed to other subroutines. +As a result of this change, the following codes have changed: +FORMATS/formats.f:bsrcsr - additionally takes extra workspace +FORMATS/formats.f:csrbsr +MATGEN/FDID/genmat.f:gen57bl - output n is now block dimension +FORMATS/chkfmt1.f +FORMATS/rvbr.f +MATGEN/FDIF/rgenblk.f +BLASSM/rmatvec.f + +The latest output of the dotests script from our Solaris machines here +is in out.04-21-95. +------------------------------------------------------------------------ +April 22, 1995 + +Now you can ask csrbsr to tell you the number of block nonzeros beforehand. +Also, a minor fix if job.eq.0. +------------------------------------------------------------------------ +April 25, 1995 + +csrbsr cleaned up even more. +------------------------------------------------------------------------ +May 22, 1995 + +iters.f - fixed rare bug in bcg and bcgstab: termination test not done +properly if they breakdown on the first step. +------------------------------------------------------------------------ +July 27, 1995 + +Fixed a bug in the header documentation for csrcsc(), describing +the appending of data structures. Detected by Dan Stanescu, Concordia. + +Fixed compilation errors in UNSUPP/PLOTS/texgrid1.f for IBM machines, +detected by Regis Gras, Laboratoire CEPHAG. +------------------------------------------------------------------------ +Sept. 22, 1995 + +Fixed a bug in the ILUT/ILUTP routines -- found by Larry Wigton +[Boeing] This bug caused small elements to be stored in L factor +produced by ILUT. Recall that the ILUT codes have been revised on +April 21 line above and there are changes in meanings of the +parameters and calling sequences. The drop strategy used has also +been modified slightly. + +We also added two new preconditioning routines named ILUD and ILUDP +[The difference between these and ILUT is that there is no control of +storage. Drop strategy is controled by only one parameter (tol). [This +should be bigger than in ILUT in general.] +----------------------------------------------------------------------- +Sept. 26, 1995 + +infofun.f:ansym was improved again. +----------------------------------------------------------------------- +Feb 17th, 1996: + Bug fix in getdia (bug reported by Norm Fuchs, Purdue). +----------------------------------------------------------------------- + +August 13th, 1996 + 1. A few more fixes to ILUT, ILUTP [ILUTP did not give the same result as + ILUT when pivoting is not done. This is now fixed. + 2. Small bug in (SPARSKIT2/ITSOL/iters.f) subroutine tidycg reported + by Laura Dutto. + 3. documentation error in minor (SPARSKIT2/ITSOL/iters.f) subroutine + FGMRES requires more storage than stated. + +Sep. 6, 1997 + one routine (dperm1) has been added to FORMATS/unary.f + (slightly modified from PSPARSIB).. YS + +Nov. 20, 1997 + Implicit none caused some minor compilation problems because of + order of declarations [reported by Stefan Nilsson (Chalmers) and + Christer Andersson (NADA, Sweden)]. Fixed by changing order of + declarations. YS + +----------------------------------------------------------------------- + +Aug. 16th, 1998. + removed useless argument in function mindom (ORDERINGS/dsepart.f) + added one option to gen57pt in MATGEN/FDIF/matgen.f + +Sept. 2nd 1998, + - fixed yet other compiler problems with double declarations of + integer n in ilut.f -- these show up with gnu f77. + - fixed an incorrect declaration of arraw iwk in coicsr in + FORMATS/formats (reported by Dan Lee -- bmw) + - removed unnecessary declaration of stopbis in tfqmr + - lenr was not initialized in nonz() in infofun (reported by Massino + Caspari). + - a spurious "g" character was inadvertantly introduced in the previous + version. [reported by Mike Botchev (CWI, NL).. + +Sept. 30th, 1998 + - fixed a bug in routine apldia (in BLASSM/blassm.f). The code worked + only for in place cases. +----------------------------------------------------------------------- + +June 16, 1999 + - the finite element matrix generation suite has been updated + (I. Moulistas) - three files have changed elmtlib2.f femgen.f meshes.f + in the directory MATGEN/FEM + - the finite difference matrix generation routione matgen.f has been + changed [SPARSKIT2/MATGEN/FDIF/genmat.f] - bug reported by David + Hyson and corrected by Kesheng John Wu.. + - Adoption of the GNU general public licencing - GNU licence agreement + added and terms in the main README file changed.. + +March 3, 2001: fix documentation glitch regarding size of w in ilut routine. + +July 12, 2001: iband was not initialized in bandwidth -- warning: quite + a few bugs found so far in infofun! + +July 24, 2001: another bug in infofun (in ansym).. no fun YS. + +----------------------------------------------------------------------- + +Sep 2003: fixed returned nrhs in readmtc + +Dec. 29th, 03 -- it looks like the March 3, 2001 correction was not done +[mishandled versions!] -- put new version.. + +Mar. 08, 2005: revamping of the old files in DOC - contributed by + Daniel Heiserer (Thanks!) + +Mar. 08, 2005: Moved to the Lesser GNU license instead of GNU - + +Oct. 20, 2005: a few bug fixes reported by E. Canot (irisa). + +Nov. 18, 2009: a bug in csort [made assumption that ncol SPARSKIT2.tar.gz) + +all: $(OBJ) $(OBJ2) libskit.a + +BLASSM/blassm.o: BLASSM/blassm.f + (cd BLASSM ; $(F77) $(OPT) blassm.f) +BLASSM/matvec.o: BLASSM/matvec.f + (cd BLASSM ; $(F77) $(OPT) matvec.f) +FORMATS/formats.o: FORMATS/formats.f + (cd FORMATS ; $(F77) $(OPT) formats.f) +FORMATS/unary.o: FORMATS/unary.f + (cd FORMATS ; $(F77) $(OPT) unary.f) +INFO/infofun.o: INFO/infofun.f + (cd INFO ; $(F77) $(OPT) infofun.f) +INOUT/inout.o: INOUT/inout.f + (cd INOUT; $(F77) $(OPT) inout.f) +ITSOL/ilut.o: ITSOL/ilut.f + (cd ITSOL; $(F77) $(OPT) ilut.f) +ITSOL/iters.o: ITSOL/iters.f + (cd ITSOL; $(F77) $(OPT) iters.f) +ITSOL/itaux.o: ITSOL/itaux.f + (cd ITSOL; $(F77) $(OPT) itaux.f) +MATGEN/FDIF/genmat.o: MATGEN/FDIF/genmat.f + (cd MATGEN/FDIF ; $(F77) $(OPT) genmat.f) +MATGEN/FDIF/functns.o: MATGEN/FDIF/functns.f + (cd MATGEN/FDIF ; $(F77) $(OPT) functns.f) +MATGEN/FEM/elmtlib2.o: MATGEN/FEM/elmtlib2.f + (cd MATGEN/FEM ; $(F77) $(OPT) elmtlib2.f) +MATGEN/FEM/femgen.o: MATGEN/FEM/femgen.f + (cd MATGEN/FEM ; $(F77) $(OPT) femgen.f) +MATGEN/FEM/functns2.o : MATGEN/FEM/functns2.f + (cd MATGEN/FEM ; $(F77) $(OPT) functns2.f) +MATGEN/FEM/meshes.o: MATGEN/FEM/meshes.f + (cd MATGEN/FEM ; $(F77) $(OPT) meshes.f) +MATGEN/MISC/sobel.o: MATGEN/MISC/sobel.f + (cd MATGEN/MISC ; $(F77) $(OPT) sobel.f) +MATGEN/MISC/zlatev.o: MATGEN/MISC/zlatev.f + (cd MATGEN/MISC ; $(F77) $(OPT) zlatev.f) +ORDERINGS/ccn.o: ORDERINGS/ccn.f + (cd ORDERINGS ; $(F77) $(OPT) ccn.f) +ORDERINGS/color.o: ORDERINGS/color.f + (cd ORDERINGS ; $(F77) $(OPT) color.f) +ORDERINGS/dsepart.o: ORDERINGS/dsepart.f + (cd ORDERINGS ; $(F77) $(OPT) dsepart.f) +UNSUPP/BLAS1/blas1.o: UNSUPP/BLAS1/blas1.f + (cd UNSUPP/BLAS1 ; $(F77) $(OPT) blas1.f) +UNSUPP/MATEXP/exppro.o: UNSUPP/MATEXP/exppro.f + (cd UNSUPP/MATEXP ; $(F77) $(OPT) exppro.f) +UNSUPP/MATEXP/phipro.o: UNSUPP/MATEXP/phipro.f + (cd UNSUPP/MATEXP ; $(F77) $(OPT) phipro.f) +UNSUPP/PLOTS/psgrd.o : UNSUPP/PLOTS/psgrd.f + (cd UNSUPP/PLOTS ; $(F77) $(OPT) psgrd.f) +UNSUPP/PLOTS/texgrid1.o : UNSUPP/PLOTS/texgrid1.f + (cd UNSUPP/PLOTS ; $(F77) $(OPT) texgrid1.f) +UNSUPP/PLOTS/texplt1.o : UNSUPP/PLOTS/texplt1.f + (cd UNSUPP/PLOTS ; $(F77) $(OPT) texplt1.f) diff --git a/sgrep b/sgrep new file mode 100755 index 0000000..4fe735d --- /dev/null +++ b/sgrep @@ -0,0 +1,5 @@ +# Usage: sgrep pattern +# Searches all source files for 'pattern'. +# Regular expressions should be enclosed in quotes "". + +find . -name '*.f' -exec grep "$*" /dev/null {} \; -- cgit v1.2.3 From 4221e6aa6f9c46f29c013122644854af20d8aacf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Mollier?= Date: Wed, 3 Feb 2021 16:37:21 +0100 Subject: Import sparskit_2.0.0-4.debian.tar.xz [dgit import tarball sparskit 2.0.0-4 sparskit_2.0.0-4.debian.tar.xz] --- changelog | 44 +++++++++ control | 43 +++++++++ copyright | 17 ++++ docs | 1 + get-orig-source | 7 ++ libsparskit-dev.install | 2 + libsparskit2.0.install | 1 + libsparskit2.0.lintian-overrides | 1 + patches/50_all_changes.diff | 203 +++++++++++++++++++++++++++++++++++++++ patches/gcc-10.patch | 37 +++++++ patches/series | 3 + patches/spelling.patch | 17 ++++ rules | 59 ++++++++++++ salsa-ci.yml | 4 + source/format | 1 + 15 files changed, 440 insertions(+) create mode 100644 changelog create mode 100644 control create mode 100644 copyright create mode 100644 docs create mode 100644 get-orig-source create mode 100644 libsparskit-dev.install create mode 100644 libsparskit2.0.install create mode 100644 libsparskit2.0.lintian-overrides create mode 100644 patches/50_all_changes.diff create mode 100644 patches/gcc-10.patch create mode 100644 patches/series create mode 100644 patches/spelling.patch create mode 100755 rules create mode 100644 salsa-ci.yml create mode 100644 source/format diff --git a/changelog b/changelog new file mode 100644 index 0000000..1613075 --- /dev/null +++ b/changelog @@ -0,0 +1,44 @@ +sparskit (2.0.0-4) unstable; urgency=medium + + * Team upload. + * Fix FTBFS with gcc-10. (Closes: #957828) + * Standards-Version: 4.5.1 (routine-update) + * debhelper-compat 13 (routine-update) + * Remove trailing whitespace in debian/rules (routine-update) + * Add salsa-ci file (routine-update) + * Rules-Requires-Root: no (routine-update) + * Use versioned copyright format URI. + * Use secure URI in Homepage field. + * Use canonical URL in Vcs-Browser. + * Restore a instead of 8 spaces in d/rules. + * Restore a missing endif in d/rules dh_auto_test target. + * Fix typo caught by lintian. + * Glue the License field in d/copyright. + + -- Étienne Mollier Wed, 03 Feb 2021 16:37:21 +0100 + +sparskit (2.0.0-3) unstable; urgency=medium + + * Team upload. + * Moved packaging from SVN to Git + * cme fix dpkg-control + * debhelper 11 + * d/rules: short dh + * Fix homepage + + -- Andreas Tille Mon, 29 Jan 2018 14:01:02 +0100 + +sparskit (2.0.0-2) unstable; urgency=low + + * Bump Standards-Version to 3.9.2 (no changes necessary) + * Bump compat level to 8 + * Added vcs fields + * Updated email address + + -- Dominique Belhachemi Wed, 21 Sep 2011 22:43:27 -0400 + +sparskit (2.0.0-1) unstable; urgency=low + + * Initial release (Closes: #498653) + + -- Dominique Belhachemi Sat, 03 Apr 2010 10:18:28 -0400 diff --git a/control b/control new file mode 100644 index 0000000..5a99e61 --- /dev/null +++ b/control @@ -0,0 +1,43 @@ +Source: sparskit +Maintainer: Debian Science Team +Uploaders: Dominique Belhachemi +Section: libs +Priority: optional +Build-Depends: debhelper-compat (= 13), + gfortran, + cmake, + liblapack-dev +Standards-Version: 4.5.1 +Vcs-Browser: https://salsa.debian.org/science-team/sparskit +Vcs-Git: https://salsa.debian.org/science-team/sparskit.git +Homepage: https://www-users.cs.umn.edu/~saad/software/SPARSKIT/ +Rules-Requires-Root: no + +Package: libsparskit2.0 +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends} +Description: basic tool-kit for sparse matrix computations - runtime + SPARSKIT a basic tool-kit for sparse matrix computations. Sparskit is a + general purpose FORTRAN-77 library for sparse matrix computations. It has + been gathered over several years and includes some of the most useful tools + for developing and implementing sparse matrix techniques, particularly for + iterative solvers. If you need a simple routine for doing a sparse matrix + operation (e.g., adding two sparse matrices, or reordering a sparse matrix) + it is likely to be available in SPARSKIT. SPARSKIT also contains most of + the iterative accelarators and a number of efficient preconditioners. + +Package: libsparskit-dev +Architecture: any +Section: libdevel +Depends: libsparskit2.0 (= ${binary:Version}), + ${misc:Depends} +Description: basic tool-kit for sparse matrix computations - devel + SPARSKIT a basic tool-kit for sparse matrix computations. Sparskit is a general + purpose FORTRAN-77 library for sparse matrix computations. It has been + gathered over several years and includes some of the most useful tools for + developing and implementing sparse matrix techniques, particularly for + iterative solvers. If you need a simple routine for doing a sparse matrix + operation (e.g., adding two sparse matrices, or reordering a sparse matrix) it + is likely to be available in SPARSKIT. SPARSKIT also contains most of the + iterative accelarators and a number of efficient preconditioners. diff --git a/copyright b/copyright new file mode 100644 index 0000000..af77065 --- /dev/null +++ b/copyright @@ -0,0 +1,17 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Debianized-By: Dominique Belhachemi +Debianized-Date: Thu, 11 Sep 2008 23:22:53 +0200 +Original-Source: http://www-users.cs.umn.edu/~saad/software/SPARSKIT/sparskit.html + +Files: * +Copyright: + Copyright (C) 2005, the University of Minnesota, + Yousef Saad, saad AT cs dot umn dot edu +License: LGPL-2.1 + see `/usr/share/common-licenses/LGPL-2.1' + +Files: debian/* +Copyright: Copyright 2008, Dominique Belhachemi +License: GPL-2+ + The Debian packaging is licensed under the LGPL-2.1, + see `/usr/share/common-licenses/LGPL-2.1' diff --git a/docs b/docs new file mode 100644 index 0000000..e845566 --- /dev/null +++ b/docs @@ -0,0 +1 @@ +README diff --git a/get-orig-source b/get-orig-source new file mode 100644 index 0000000..1d9bcb6 --- /dev/null +++ b/get-orig-source @@ -0,0 +1,7 @@ +wget http://www-users.cs.umn.edu/~saad/software/SPARSKIT/SPARSKIT2.tar.gz +tar xvzf SPARSKIT2.tar.gz +mv SPARSKIT2 sparskit-2.0.0 +tar cvzf sparskit_2.0.0.orig.tar.gz sparskit-2.0.0/ +rm SPARSKIT2.tar.gz + + diff --git a/libsparskit-dev.install b/libsparskit-dev.install new file mode 100644 index 0000000..e60284a --- /dev/null +++ b/libsparskit-dev.install @@ -0,0 +1,2 @@ +usr/lib/libskit.a +shared/usr/lib/libskit.so usr/lib/ diff --git a/libsparskit2.0.install b/libsparskit2.0.install new file mode 100644 index 0000000..df97210 --- /dev/null +++ b/libsparskit2.0.install @@ -0,0 +1 @@ +shared/usr/lib/libskit.so.* usr/lib diff --git a/libsparskit2.0.lintian-overrides b/libsparskit2.0.lintian-overrides new file mode 100644 index 0000000..96437f7 --- /dev/null +++ b/libsparskit2.0.lintian-overrides @@ -0,0 +1 @@ +libsparskit2.0: package-name-doesnt-match-sonames libskit2.0 diff --git a/patches/50_all_changes.diff b/patches/50_all_changes.diff new file mode 100644 index 0000000..53c5c3b --- /dev/null +++ b/patches/50_all_changes.diff @@ -0,0 +1,203 @@ +Description: CMake'ing sparskit +Author: Dominique Belhachemi +Index: sparskit-2.0.0/BLASSM/CMakeLists.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ sparskit-2.0.0/BLASSM/CMakeLists.txt 2010-04-10 08:10:47.000000000 -0400 +@@ -0,0 +1,9 @@ ++enable_language( Fortran ) ++ ++set(CMAKE_Fortran_FLAGS "-g") ++ ++add_executable(mvec.ex rmatvec.f ../MATGEN/FDIF/functns.f) ++target_link_libraries (mvec.ex skit skit_helper blas) ++ ++add_executable(tester.ex rmatvec.f ../MATGEN/FDIF/functns.f) ++target_link_libraries (tester.ex skit) +Index: sparskit-2.0.0/CMakeLists.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ sparskit-2.0.0/CMakeLists.txt 2010-04-10 08:10:35.000000000 -0400 +@@ -0,0 +1,76 @@ ++cmake_minimum_required(VERSION 2.6) ++ ++# Input directories must have CMakeLists.txt. ++cmake_policy(SET CMP0014 NEW) ++ ++ ++project (sparskit) ++ ++ ++set(STATIC_LIBRARY_FLAGS "-rcv") ++set(CMAKE_Fortran_FLAGS " -g -ffixed-line-length-none -ffree-line-length-none") ++#set(CMAKE_Fortran_FLAGS " -c -g -Wall -ffixed-line-length-none -ffree-line-length-none") ++ ++enable_language(Fortran) ++ ++ ++# Create a library called "skit". ++add_library (skit ++ BLASSM/blassm.f ++ BLASSM/matvec.f ++ FORMATS/formats.f ++ FORMATS/unary.f ++ INFO/infofun.f ++ INOUT/inout.f ++ ITSOL/ilut.f ++ ITSOL/iters.f ++ MATGEN/FDIF/genmat.f ++ MATGEN/FEM/elmtlib2.f ++ MATGEN/FEM/femgen.f ++ MATGEN/FEM/meshes.f ++ MATGEN/MISC/sobel.f ++ MATGEN/MISC/zlatev.f ++ ORDERINGS/ccn.f ++ ORDERINGS/color.f ++ ORDERINGS/dsepart.f ++) ++ ++SET_TARGET_PROPERTIES(skit PROPERTIES ++ LINKER_LANGUAGE Fortran ++ SOVERSION 2.0 ++ VERSION 2.0.0 ++) ++ ++install(TARGETS skit ++ RUNTIME DESTINATION bin COMPONENT RuntimeLibraries ++ LIBRARY DESTINATION lib COMPONENT RuntimeLibraries ++ ARCHIVE DESTINATION lib COMPONENT Development ++) ++ ++ ++OPTION(BUILD_TESTING "Enable this to perform testing of sparskit" ON) ++ ++IF(BUILD_TESTING) ++ # non-library and unsupported objects ++ add_library (skit_helper ++ ITSOL/itaux.f ++ MATGEN/FDIF/functns.f ++ MATGEN/FEM/functns2.f ++ UNSUPP/BLAS1/blas1.f ++ UNSUPP/MATEXP/exppro.f ++ UNSUPP/MATEXP/phipro.f ++ UNSUPP/PLOTS/psgrd.f ++ UNSUPP/PLOTS/texgrid1.f ++ UNSUPP/PLOTS/texplt1.f ++ ) ++ add_subdirectory (BLASSM) ++ add_subdirectory (FORMATS) ++ add_subdirectory (INFO) ++ add_subdirectory (INOUT) ++ add_subdirectory (ITSOL) ++ add_subdirectory (MATGEN/FDIF) ++ add_subdirectory (MATGEN/FEM) ++ add_subdirectory (MATGEN/MISC) ++ add_subdirectory (UNSUPP/MATEXP) ++ENDIF(BUILD_TESTING) ++ +Index: sparskit-2.0.0/FORMATS/CMakeLists.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ sparskit-2.0.0/FORMATS/CMakeLists.txt 2010-04-10 08:11:10.000000000 -0400 +@@ -0,0 +1,12 @@ ++#enable_language( Fortran ) ++ ++set(CMAKE_Fortran_FLAGS "-g") ++ ++add_executable(un.ex chkun.f ../MATGEN/FDIF/functns.f) ++target_link_libraries (un.ex skit) ++ ++add_executable(chkfmt.ex chkfmt1.f ../MATGEN/FDIF/functns.f) ++target_link_libraries (chkfmt.ex skit) ++ ++add_executable(rvbr.ex rvbr.f ../MATGEN/FDIF/functns.f) ++target_link_libraries (rvbr.ex skit) +Index: sparskit-2.0.0/INFO/CMakeLists.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ sparskit-2.0.0/INFO/CMakeLists.txt 2010-04-10 08:11:15.000000000 -0400 +@@ -0,0 +1,4 @@ ++set(CMAKE_Fortran_FLAGS "-g") ++ ++add_executable(info1.ex rinfo1.f dinfo13.f) ++target_link_libraries (info1.ex skit) +Index: sparskit-2.0.0/INOUT/CMakeLists.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ sparskit-2.0.0/INOUT/CMakeLists.txt 2010-04-10 08:10:41.000000000 -0400 +@@ -0,0 +1,10 @@ ++set(CMAKE_Fortran_FLAGS "-g") ++ ++add_executable(chk.ex chkio.f ../MATGEN/FDIF/functns.f) ++target_link_libraries (chk.ex skit) ++ ++add_executable(hb2ps.ex hb2ps.f) ++target_link_libraries (hb2ps.ex skit) ++ ++add_executable(hb2pic.ex hb2pic.f) ++target_link_libraries (hb2pic.ex skit) +Index: sparskit-2.0.0/ITSOL/CMakeLists.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ sparskit-2.0.0/ITSOL/CMakeLists.txt 2010-04-10 08:09:48.000000000 -0400 +@@ -0,0 +1,11 @@ ++set(CMAKE_Fortran_FLAGS "-g") ++ ++add_executable(riters.ex riters.f iters.f ilut.f itaux.f ../UNSUPP/BLAS1/blas1.f) ++target_link_libraries (riters.ex skit) ++ ++add_executable(rilut.ex rilut.f ilut.f iters.f itaux.f ../UNSUPP/BLAS1/blas1.f) ++target_link_libraries (rilut.ex skit) ++ ++add_executable(riter2.ex riter2.f iters.f ilut.f itaux.f ../UNSUPP/BLAS1/blas1.f) ++target_link_libraries (riter2.ex skit) ++ +Index: sparskit-2.0.0/MATGEN/FDIF/CMakeLists.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ sparskit-2.0.0/MATGEN/FDIF/CMakeLists.txt 2010-04-10 08:11:05.000000000 -0400 +@@ -0,0 +1,7 @@ ++set(CMAKE_Fortran_FLAGS "-g") ++ ++add_executable(gen5.ex rgen5pt.f functns.f) ++target_link_libraries (gen5.ex skit) ++ ++add_executable(genbl.ex rgenblk.f functns.f) ++target_link_libraries (genbl.ex skit) +Index: sparskit-2.0.0/MATGEN/FEM/CMakeLists.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ sparskit-2.0.0/MATGEN/FEM/CMakeLists.txt 2010-04-10 08:10:58.000000000 -0400 +@@ -0,0 +1,4 @@ ++set(CMAKE_Fortran_FLAGS "-g") ++ ++add_executable(fem.ex convdif.f functns2.f ../../UNSUPP/PLOTS/psgrd.f ) ++target_link_libraries (fem.ex skit) +Index: sparskit-2.0.0/MATGEN/MISC/CMakeLists.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ sparskit-2.0.0/MATGEN/MISC/CMakeLists.txt 2010-04-10 08:10:52.000000000 -0400 +@@ -0,0 +1,11 @@ ++set(CMAKE_Fortran_FLAGS "-g") ++ ++add_executable(sobel.ex rsobel.f) ++target_link_libraries (sobel.ex skit) ++ ++add_executable(zlatev.ex rzlatev.f) ++target_link_libraries (zlatev.ex skit) ++ ++add_executable(markov.ex markov.f) ++target_link_libraries (markov.ex skit) ++ +Index: sparskit-2.0.0/UNSUPP/MATEXP/CMakeLists.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ sparskit-2.0.0/UNSUPP/MATEXP/CMakeLists.txt 2010-04-10 08:11:21.000000000 -0400 +@@ -0,0 +1,7 @@ ++set(CMAKE_Fortran_FLAGS "-g") ++ ++add_executable(exp.ex rexp.f exppro.f) ++target_link_libraries (exp.ex skit) ++ ++add_executable(phi.ex rphi.f phipro.f) ++target_link_libraries (phi.ex skit) diff --git a/patches/gcc-10.patch b/patches/gcc-10.patch new file mode 100644 index 0000000..42144ef --- /dev/null +++ b/patches/gcc-10.patch @@ -0,0 +1,37 @@ +Description: fix ftbfs with gcc-10 + This fixes the argument type mismatch in the csrcsc + call by introducing the one dimension vector iziama of type + real(8), instead of an integer(4) scalar, while trying to + maintain compatibility with Fortran 77. +Author: Étienne Mollier +Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=957828 +Forwarded: saad *at* cs *dot* umn *dot* edu +Last-Update: 2021-02-02 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- sparskit.orig/ORDERINGS/ccn.f ++++ sparskit/ORDERINGS/ccn.f +@@ -90,7 +90,7 @@ + c July 1992 - Update: March 1994 + C----------------------------------------------------------------------- + integer izs(nw), lpw(n), nsbloc(0:nblcmx), ia(n+1), ja(*) +- real*8 amat(*) ++ real*8 amat(*), iziama(1) + logical impr + character*6 chsubr + C----------------------------------------------------------------------- +@@ -147,10 +147,12 @@ + * ja, ia, izs(ilpw), izs(ilpw), job) + ipos = 1 + c..........We sort columns inside JA. +- call csrcsc(n, job, ipos, amat, ja, ia, izs(iamat), ++ iziama(1) = izs(iamat) ++ call csrcsc(n, job, ipos, amat, ja, ia, iziama, + * izs(ijat), izs(iiat)) +- call csrcsc(n, job, ipos, izs(iamat), izs(ijat), izs(iiat), ++ call csrcsc(n, job, ipos, iziama, izs(ijat), izs(iiat), + * amat, ja, ia) ++ izs(iamat) = iziama(1) + endif + c.....We modify the ordering of unknowns in LPW + call compos(n, lpw, izs(ilpw)) diff --git a/patches/series b/patches/series new file mode 100644 index 0000000..9041998 --- /dev/null +++ b/patches/series @@ -0,0 +1,3 @@ +50_all_changes.diff +gcc-10.patch +spelling.patch diff --git a/patches/spelling.patch b/patches/spelling.patch new file mode 100644 index 0000000..d7e4f0e --- /dev/null +++ b/patches/spelling.patch @@ -0,0 +1,17 @@ +Description: fix spelling caught by lintian +Author: Étienne Mollier +Forwarded: no +Last-Update: 2021-02-02 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- sparskit.orig/INOUT/inout.f ++++ sparskit/INOUT/inout.f +@@ -1386,7 +1386,7 @@ + c if can't write the data to the I/O unit specified, should be able to + c write everything to standard output (unit 6) + c +- 1000 write(0, *) 'Error, Can''t write data to sepcified unit',iounit ++ 1000 write(0, *) 'Error, Can''t write data to specified unit',iounit + write(0, *) 'Write the matrix into standard output instead!' + ierr = 1 + write(6,*) n diff --git a/rules b/rules new file mode 100755 index 0000000..4541930 --- /dev/null +++ b/rules @@ -0,0 +1,59 @@ +#!/usr/bin/make -f + +PACKAGE=sparskit + +DEB_SOURCE_PACKAGE:=$(PACKAGE) + +STATIC_BUILD_PATH = DEB_build_static +SHARED_BUILD_PATH = DEB_build_shared + + +# Uncomment this to turn on verbose mode. +export DH_VERBOSE=1 + +get-orig-source: + . debian/get-orig-source + +CMAKE_FLAGS = -DCMAKE_INSTALL_PREFIX:PATH=/usr \ + -DCMAKE_SHARED_LINKER_FLAGS="-Wl,--as-needed" \ + -DCMAKE_EXE_LINKER_FLAGS="-Wl,--as-needed" \ + -DCMAKE_SKIP_RPATH:BOOL=ON + +%: + dh $@ + +override_dh_auto_configure: + if [ ! -d $(STATIC_BUILD_PATH) ]; then mkdir $(STATIC_BUILD_PATH); fi + cd $(STATIC_BUILD_PATH) \ + && cmake $(CURDIR) $(CMAKE_FLAGS) -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON + cd $(STATIC_BUILD_PATH) \ + && cmake $(CURDIR) $(CMAKE_FLAGS) -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON + + if [ ! -d $(SHARED_BUILD_PATH) ]; then mkdir $(SHARED_BUILD_PATH); fi + cd $(SHARED_BUILD_PATH) \ + && cmake $(CURDIR) $(CMAKE_FLAGS) -DBUILD_SHARED_LIBS:BOOL=ON -DBUILD_TESTING:BOOL=OFF + cd $(SHARED_BUILD_PATH) \ + && cmake $(CURDIR) $(CMAKE_FLAGS) -DBUILD_SHARED_LIBS:BOOL=ON -DBUILD_TESTING:BOOL=OFF + +override_dh_auto_build: + # build static libs + $(MAKE) $(JOBS) -C $(STATIC_BUILD_PATH) + + # build shared libs and binaries + $(MAKE) $(JOBS) -C $(SHARED_BUILD_PATH) + +override_dh_auto_test: +ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) + # run a test + ./DEB_build_static/ITSOL/riters.ex +endif + +override_dh_clean: + rm -rf $(STATIC_BUILD_PATH) + rm -rf $(SHARED_BUILD_PATH) +# - rm libskit.a + dh_clean + +override_dh_auto_install: + $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install -C $(STATIC_BUILD_PATH) + $(MAKE) DESTDIR=$(CURDIR)/debian/tmp/shared install -C $(SHARED_BUILD_PATH) diff --git a/salsa-ci.yml b/salsa-ci.yml new file mode 100644 index 0000000..33c3a64 --- /dev/null +++ b/salsa-ci.yml @@ -0,0 +1,4 @@ +--- +include: + - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml + - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml diff --git a/source/format b/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) -- cgit v1.2.3 From d069cb0dff1bdd78f91784c6cd45aa815eaca81b Mon Sep 17 00:00:00 2001 From: Dominique Belhachemi Date: Wed, 3 Feb 2021 16:37:21 +0100 Subject: CMake'ing sparskit =================================================================== Gbp-Pq: Name 50_all_changes.diff --- BLASSM/CMakeLists.txt | 9 ++++++ CMakeLists.txt | 76 ++++++++++++++++++++++++++++++++++++++++++++ FORMATS/CMakeLists.txt | 12 +++++++ INFO/CMakeLists.txt | 4 +++ INOUT/CMakeLists.txt | 10 ++++++ ITSOL/CMakeLists.txt | 11 +++++++ MATGEN/FDIF/CMakeLists.txt | 7 ++++ MATGEN/FEM/CMakeLists.txt | 4 +++ MATGEN/MISC/CMakeLists.txt | 11 +++++++ UNSUPP/MATEXP/CMakeLists.txt | 7 ++++ 10 files changed, 151 insertions(+) create mode 100644 BLASSM/CMakeLists.txt create mode 100644 CMakeLists.txt create mode 100644 FORMATS/CMakeLists.txt create mode 100644 INFO/CMakeLists.txt create mode 100644 INOUT/CMakeLists.txt create mode 100644 ITSOL/CMakeLists.txt create mode 100644 MATGEN/FDIF/CMakeLists.txt create mode 100644 MATGEN/FEM/CMakeLists.txt create mode 100644 MATGEN/MISC/CMakeLists.txt create mode 100644 UNSUPP/MATEXP/CMakeLists.txt diff --git a/BLASSM/CMakeLists.txt b/BLASSM/CMakeLists.txt new file mode 100644 index 0000000..1522e9f --- /dev/null +++ b/BLASSM/CMakeLists.txt @@ -0,0 +1,9 @@ +enable_language( Fortran ) + +set(CMAKE_Fortran_FLAGS "-g") + +add_executable(mvec.ex rmatvec.f ../MATGEN/FDIF/functns.f) +target_link_libraries (mvec.ex skit skit_helper blas) + +add_executable(tester.ex rmatvec.f ../MATGEN/FDIF/functns.f) +target_link_libraries (tester.ex skit) diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d8ed8ef --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,76 @@ +cmake_minimum_required(VERSION 2.6) + +# Input directories must have CMakeLists.txt. +cmake_policy(SET CMP0014 NEW) + + +project (sparskit) + + +set(STATIC_LIBRARY_FLAGS "-rcv") +set(CMAKE_Fortran_FLAGS " -g -ffixed-line-length-none -ffree-line-length-none") +#set(CMAKE_Fortran_FLAGS " -c -g -Wall -ffixed-line-length-none -ffree-line-length-none") + +enable_language(Fortran) + + +# Create a library called "skit". +add_library (skit + BLASSM/blassm.f + BLASSM/matvec.f + FORMATS/formats.f + FORMATS/unary.f + INFO/infofun.f + INOUT/inout.f + ITSOL/ilut.f + ITSOL/iters.f + MATGEN/FDIF/genmat.f + MATGEN/FEM/elmtlib2.f + MATGEN/FEM/femgen.f + MATGEN/FEM/meshes.f + MATGEN/MISC/sobel.f + MATGEN/MISC/zlatev.f + ORDERINGS/ccn.f + ORDERINGS/color.f + ORDERINGS/dsepart.f +) + +SET_TARGET_PROPERTIES(skit PROPERTIES + LINKER_LANGUAGE Fortran + SOVERSION 2.0 + VERSION 2.0.0 +) + +install(TARGETS skit + RUNTIME DESTINATION bin COMPONENT RuntimeLibraries + LIBRARY DESTINATION lib COMPONENT RuntimeLibraries + ARCHIVE DESTINATION lib COMPONENT Development +) + + +OPTION(BUILD_TESTING "Enable this to perform testing of sparskit" ON) + +IF(BUILD_TESTING) + # non-library and unsupported objects + add_library (skit_helper + ITSOL/itaux.f + MATGEN/FDIF/functns.f + MATGEN/FEM/functns2.f + UNSUPP/BLAS1/blas1.f + UNSUPP/MATEXP/exppro.f + UNSUPP/MATEXP/phipro.f + UNSUPP/PLOTS/psgrd.f + UNSUPP/PLOTS/texgrid1.f + UNSUPP/PLOTS/texplt1.f + ) + add_subdirectory (BLASSM) + add_subdirectory (FORMATS) + add_subdirectory (INFO) + add_subdirectory (INOUT) + add_subdirectory (ITSOL) + add_subdirectory (MATGEN/FDIF) + add_subdirectory (MATGEN/FEM) + add_subdirectory (MATGEN/MISC) + add_subdirectory (UNSUPP/MATEXP) +ENDIF(BUILD_TESTING) + diff --git a/FORMATS/CMakeLists.txt b/FORMATS/CMakeLists.txt new file mode 100644 index 0000000..f21fe79 --- /dev/null +++ b/FORMATS/CMakeLists.txt @@ -0,0 +1,12 @@ +#enable_language( Fortran ) + +set(CMAKE_Fortran_FLAGS "-g") + +add_executable(un.ex chkun.f ../MATGEN/FDIF/functns.f) +target_link_libraries (un.ex skit) + +add_executable(chkfmt.ex chkfmt1.f ../MATGEN/FDIF/functns.f) +target_link_libraries (chkfmt.ex skit) + +add_executable(rvbr.ex rvbr.f ../MATGEN/FDIF/functns.f) +target_link_libraries (rvbr.ex skit) diff --git a/INFO/CMakeLists.txt b/INFO/CMakeLists.txt new file mode 100644 index 0000000..d387cfe --- /dev/null +++ b/INFO/CMakeLists.txt @@ -0,0 +1,4 @@ +set(CMAKE_Fortran_FLAGS "-g") + +add_executable(info1.ex rinfo1.f dinfo13.f) +target_link_libraries (info1.ex skit) diff --git a/INOUT/CMakeLists.txt b/INOUT/CMakeLists.txt new file mode 100644 index 0000000..0cab200 --- /dev/null +++ b/INOUT/CMakeLists.txt @@ -0,0 +1,10 @@ +set(CMAKE_Fortran_FLAGS "-g") + +add_executable(chk.ex chkio.f ../MATGEN/FDIF/functns.f) +target_link_libraries (chk.ex skit) + +add_executable(hb2ps.ex hb2ps.f) +target_link_libraries (hb2ps.ex skit) + +add_executable(hb2pic.ex hb2pic.f) +target_link_libraries (hb2pic.ex skit) diff --git a/ITSOL/CMakeLists.txt b/ITSOL/CMakeLists.txt new file mode 100644 index 0000000..c24991d --- /dev/null +++ b/ITSOL/CMakeLists.txt @@ -0,0 +1,11 @@ +set(CMAKE_Fortran_FLAGS "-g") + +add_executable(riters.ex riters.f iters.f ilut.f itaux.f ../UNSUPP/BLAS1/blas1.f) +target_link_libraries (riters.ex skit) + +add_executable(rilut.ex rilut.f ilut.f iters.f itaux.f ../UNSUPP/BLAS1/blas1.f) +target_link_libraries (rilut.ex skit) + +add_executable(riter2.ex riter2.f iters.f ilut.f itaux.f ../UNSUPP/BLAS1/blas1.f) +target_link_libraries (riter2.ex skit) + diff --git a/MATGEN/FDIF/CMakeLists.txt b/MATGEN/FDIF/CMakeLists.txt new file mode 100644 index 0000000..f4844cd --- /dev/null +++ b/MATGEN/FDIF/CMakeLists.txt @@ -0,0 +1,7 @@ +set(CMAKE_Fortran_FLAGS "-g") + +add_executable(gen5.ex rgen5pt.f functns.f) +target_link_libraries (gen5.ex skit) + +add_executable(genbl.ex rgenblk.f functns.f) +target_link_libraries (genbl.ex skit) diff --git a/MATGEN/FEM/CMakeLists.txt b/MATGEN/FEM/CMakeLists.txt new file mode 100644 index 0000000..7c875c8 --- /dev/null +++ b/MATGEN/FEM/CMakeLists.txt @@ -0,0 +1,4 @@ +set(CMAKE_Fortran_FLAGS "-g") + +add_executable(fem.ex convdif.f functns2.f ../../UNSUPP/PLOTS/psgrd.f ) +target_link_libraries (fem.ex skit) diff --git a/MATGEN/MISC/CMakeLists.txt b/MATGEN/MISC/CMakeLists.txt new file mode 100644 index 0000000..b7fc61b --- /dev/null +++ b/MATGEN/MISC/CMakeLists.txt @@ -0,0 +1,11 @@ +set(CMAKE_Fortran_FLAGS "-g") + +add_executable(sobel.ex rsobel.f) +target_link_libraries (sobel.ex skit) + +add_executable(zlatev.ex rzlatev.f) +target_link_libraries (zlatev.ex skit) + +add_executable(markov.ex markov.f) +target_link_libraries (markov.ex skit) + diff --git a/UNSUPP/MATEXP/CMakeLists.txt b/UNSUPP/MATEXP/CMakeLists.txt new file mode 100644 index 0000000..0458d5c --- /dev/null +++ b/UNSUPP/MATEXP/CMakeLists.txt @@ -0,0 +1,7 @@ +set(CMAKE_Fortran_FLAGS "-g") + +add_executable(exp.ex rexp.f exppro.f) +target_link_libraries (exp.ex skit) + +add_executable(phi.ex rphi.f phipro.f) +target_link_libraries (phi.ex skit) -- cgit v1.2.3 From bdef27fbb2abb646f922d48056255dfc4f39799b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Mollier?= Date: Wed, 3 Feb 2021 16:37:21 +0100 Subject: fix ftbfs with gcc-10 Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=957828 Forwarded: saad *at* cs *dot* umn *dot* edu Last-Update: 2021-02-02 This fixes the argument type mismatch in the csrcsc call by introducing the one dimension vector iziama of type real(8), instead of an integer(4) scalar, while trying to maintain compatibility with Fortran 77. Last-Update: 2021-02-02 Gbp-Pq: Name gcc-10.patch --- ORDERINGS/ccn.f | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ORDERINGS/ccn.f b/ORDERINGS/ccn.f index eee5836..037cfa9 100644 --- a/ORDERINGS/ccn.f +++ b/ORDERINGS/ccn.f @@ -90,7 +90,7 @@ C Laura C. Dutto - email: dutto@cerca.umontreal.ca c July 1992 - Update: March 1994 C----------------------------------------------------------------------- integer izs(nw), lpw(n), nsbloc(0:nblcmx), ia(n+1), ja(*) - real*8 amat(*) + real*8 amat(*), iziama(1) logical impr character*6 chsubr C----------------------------------------------------------------------- @@ -147,10 +147,12 @@ c..........We copy IA and JA on IAT and JAT respectively * ja, ia, izs(ilpw), izs(ilpw), job) ipos = 1 c..........We sort columns inside JA. - call csrcsc(n, job, ipos, amat, ja, ia, izs(iamat), + iziama(1) = izs(iamat) + call csrcsc(n, job, ipos, amat, ja, ia, iziama, * izs(ijat), izs(iiat)) - call csrcsc(n, job, ipos, izs(iamat), izs(ijat), izs(iiat), + call csrcsc(n, job, ipos, iziama, izs(ijat), izs(iiat), * amat, ja, ia) + izs(iamat) = iziama(1) endif c.....We modify the ordering of unknowns in LPW call compos(n, lpw, izs(ilpw)) -- cgit v1.2.3 From cfc865d00fca4aab6347db82be6f000e8f2ad710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Mollier?= Date: Wed, 3 Feb 2021 16:37:21 +0100 Subject: fix spelling caught by lintian Forwarded: no Last-Update: 2021-02-02 Last-Update: 2021-02-02 Gbp-Pq: Name spelling.patch --- INOUT/inout.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INOUT/inout.f b/INOUT/inout.f index 820c548..da65ca6 100644 --- a/INOUT/inout.f +++ b/INOUT/inout.f @@ -1386,7 +1386,7 @@ c c if can't write the data to the I/O unit specified, should be able to c write everything to standard output (unit 6) c - 1000 write(0, *) 'Error, Can''t write data to sepcified unit',iounit + 1000 write(0, *) 'Error, Can''t write data to specified unit',iounit write(0, *) 'Write the matrix into standard output instead!' ierr = 1 write(6,*) n -- cgit v1.2.3