diff options
author | dfr <dfr@FreeBSD.org> | 1997-05-18 10:03:48 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 1997-05-18 10:03:48 +0000 |
commit | 8fc601bf6f37fba71b0dcd292805572648a02312 (patch) | |
tree | d5cf7f0c98da749ee03cad31ffb71c4326597f01 /tools/regression/nfsmmap | |
parent | 958b435ec8760a6985dca3730ae11e9df3d0baba (diff) | |
download | FreeBSD-src-8fc601bf6f37fba71b0dcd292805572648a02312.zip FreeBSD-src-8fc601bf6f37fba71b0dcd292805572648a02312.tar.gz |
Add a couple of test cases for mmap over NFS.
Diffstat (limited to 'tools/regression/nfsmmap')
-rw-r--r-- | tools/regression/nfsmmap/Makefile | 3 | ||||
-rw-r--r-- | tools/regression/nfsmmap/README | 20 | ||||
-rw-r--r-- | tools/regression/nfsmmap/test1/Makefile | 25 | ||||
-rw-r--r-- | tools/regression/nfsmmap/test1/test1.c | 46 | ||||
-rw-r--r-- | tools/regression/nfsmmap/test1/test1.good.uu | 95 | ||||
-rw-r--r-- | tools/regression/nfsmmap/test1/test1.zeros.uu | 95 | ||||
-rw-r--r-- | tools/regression/nfsmmap/test2/Makefile | 25 | ||||
-rw-r--r-- | tools/regression/nfsmmap/test2/test2.c | 44 | ||||
-rw-r--r-- | tools/regression/nfsmmap/test2/test2.good.uu | 95 | ||||
-rw-r--r-- | tools/regression/nfsmmap/test2/test2.zeros.uu | 95 |
10 files changed, 543 insertions, 0 deletions
diff --git a/tools/regression/nfsmmap/Makefile b/tools/regression/nfsmmap/Makefile new file mode 100644 index 0000000..c731d42 --- /dev/null +++ b/tools/regression/nfsmmap/Makefile @@ -0,0 +1,3 @@ +SUBDIR= test1 test2 + +.include <bsd.subdir.mk> diff --git a/tools/regression/nfsmmap/README b/tools/regression/nfsmmap/README new file mode 100644 index 0000000..81c4ad5 --- /dev/null +++ b/tools/regression/nfsmmap/README @@ -0,0 +1,20 @@ +These tests are intended to make sure that NFS's use of the +b_{valid,dirty}{off,end} fields of struct buf is consistent with the +VM system's use of the underlying VM pages. + +Test1: + Open the file and write into the file, creating a buf + with a valid range and a dirty range + + Fsync, flushing the dirty range + + Mmap and read the whole page. Since only part of the page is + valid, the VM system must re-read the invalid parts of the + page. + +Test2: + This is the same as test1 without the fsync. The VM system + should first write out the dirty range and then read the rest + of the page. This is currently broken since the vnode_pager + doesn't use the original buf for its i/o and therefore the + information in b_dirtyoff, b_dirtyend is not avalable. diff --git a/tools/regression/nfsmmap/test1/Makefile b/tools/regression/nfsmmap/test1/Makefile new file mode 100644 index 0000000..54a7b9d --- /dev/null +++ b/tools/regression/nfsmmap/test1/Makefile @@ -0,0 +1,25 @@ +PROG= test1 +NOMAN= t +NFSSERVER?= herring.nlsystems.com +CLEANFILES= test1.zeros test1.good test1.data test1.scratch + +all: test1 test1.zeros test1.good + @cp ${.OBJDIR}/test1.zeros ${.OBJDIR}/test1.data + @if [ `hostname` != ${NFSSERVER} ] ; then \ + ssh ${NFSSERVER} touch ${.OBJDIR}/test1.data; \ + fi + @cd ${.OBJDIR}; ${.OBJDIR}/test1 + @if cmp -s ${.OBJDIR}/test1.data ${.OBJDIR}/test1.good && \ + cmp -s ${.OBJDIR}/test1.scratch ${.OBJDIR}/test1.good ; then \ + echo passed; \ + else \ + echo failed; \ + fi + +test1.zeros: test1.zeros.uu + uudecode $? + +test1.good: test1.good.uu + uudecode $? + +.include <bsd.prog.mk> diff --git a/tools/regression/nfsmmap/test1/test1.c b/tools/regression/nfsmmap/test1/test1.c new file mode 100644 index 0000000..7a7e69f --- /dev/null +++ b/tools/regression/nfsmmap/test1/test1.c @@ -0,0 +1,46 @@ +#include <sys/types.h> +#include <sys/fcntl.h> +#include <sys/mman.h> +#include <unistd.h> + +int main(int argc, char** argv) +{ + int fd, fd2; + caddr_t addr; + char zeros[4096]; + char ones[200]; + + memset(zeros, 0, sizeof zeros); + memset(ones, 1, sizeof ones); +#if 0 + unlink("test1.data"); + fd = open("test1.data", O_RDWR|O_CREAT, 0666); + if (fd < 0) + err(1, "creating file"); + if (write(fd, zeros, sizeof zeros) < 0) + err(1, "writing zeros"); + close(fd); +#endif + + fd = open("test1.data", O_RDWR); + if (fd < 0) + err(1, "opening file"); + if (lseek(fd, 600, SEEK_SET) < 0) + err(1, "seeking"); + + if (write(fd, ones, sizeof ones) < 0) + err(1, "writing ones"); + + fsync(fd); + + addr = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + if (addr == MAP_FAILED) + err(1, "mapping"); + unlink("test1.scratch"); + fd2 = open("test1.scratch", O_RDWR|O_CREAT, 0666); + if (fd2 < 0) + err(1, "creating scratch"); + + if (write(fd2, addr, 4096) < 0) + err(1, "writing scratch"); +} diff --git a/tools/regression/nfsmmap/test1/test1.good.uu b/tools/regression/nfsmmap/test1/test1.good.uu new file mode 100644 index 0000000..633d2d3 --- /dev/null +++ b/tools/regression/nfsmmap/test1/test1.good.uu @@ -0,0 +1,95 @@ +begin 644 test1.good +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +!```` +` +end diff --git a/tools/regression/nfsmmap/test1/test1.zeros.uu b/tools/regression/nfsmmap/test1/test1.zeros.uu new file mode 100644 index 0000000..2332258 --- /dev/null +++ b/tools/regression/nfsmmap/test1/test1.zeros.uu @@ -0,0 +1,95 @@ +begin 644 test1.zeros +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +!```` +` +end diff --git a/tools/regression/nfsmmap/test2/Makefile b/tools/regression/nfsmmap/test2/Makefile new file mode 100644 index 0000000..460c0b2 --- /dev/null +++ b/tools/regression/nfsmmap/test2/Makefile @@ -0,0 +1,25 @@ +PROG= test2 +NOMAN= t +NFSSERVER?= herring.nlsystems.com +CLEANFILES= test2.zeros test2.good test2.data test2.scratch + +all: test2 test2.zeros test2.good + @cp ${.OBJDIR}/test2.zeros ${.OBJDIR}/test2.data + @if [ `hostname` != ${NFSSERVER} ] ; then \ + ssh ${NFSSERVER} touch ${.OBJDIR}/test2.data; \ + fi + @cd ${.OBJDIR}; ${.OBJDIR}/test2 + @if cmp -s ${.OBJDIR}/test2.data ${.OBJDIR}/test2.good && \ + cmp -s ${.OBJDIR}/test2.scratch ${.OBJDIR}/test2.good ; then \ + echo passed; \ + else \ + echo failed; \ + fi + +test2.zeros: test2.zeros.uu + uudecode $? + +test2.good: test2.good.uu + uudecode $? + +.include <bsd.prog.mk> diff --git a/tools/regression/nfsmmap/test2/test2.c b/tools/regression/nfsmmap/test2/test2.c new file mode 100644 index 0000000..b3a19e1 --- /dev/null +++ b/tools/regression/nfsmmap/test2/test2.c @@ -0,0 +1,44 @@ +#include <sys/types.h> +#include <sys/fcntl.h> +#include <sys/mman.h> +#include <unistd.h> + +int main(int argc, char** argv) +{ + int fd, fd2; + caddr_t addr; + char zeros[4096]; + char ones[200]; + + memset(zeros, 0, sizeof zeros); + memset(ones, 1, sizeof ones); +#if 0 + unlink("test2.data"); + fd = open("test2.data", O_RDWR|O_CREAT, 0666); + if (fd < 0) + err(1, "creating file"); + if (write(fd, zeros, sizeof zeros) < 0) + err(1, "writing zeros"); + close(fd); +#endif + + fd = open("test2.data", O_RDWR); + if (fd < 0) + err(1, "opening file"); + if (lseek(fd, 600, SEEK_SET) < 0) + err(1, "seeking"); + + if (write(fd, ones, sizeof ones) < 0) + err(1, "writing ones"); + + addr = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + if (addr == MAP_FAILED) + err(1, "mapping"); + unlink("test2.scratch"); + fd2 = open("test2.scratch", O_RDWR|O_CREAT, 0666); + if (fd2 < 0) + err(1, "creating scratch"); + + if (write(fd2, addr, 4096) < 0) + err(1, "writing scratch"); +} diff --git a/tools/regression/nfsmmap/test2/test2.good.uu b/tools/regression/nfsmmap/test2/test2.good.uu new file mode 100644 index 0000000..2edf155 --- /dev/null +++ b/tools/regression/nfsmmap/test2/test2.good.uu @@ -0,0 +1,95 @@ +begin 644 test2.good +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +!```` +` +end diff --git a/tools/regression/nfsmmap/test2/test2.zeros.uu b/tools/regression/nfsmmap/test2/test2.zeros.uu new file mode 100644 index 0000000..9be013a --- /dev/null +++ b/tools/regression/nfsmmap/test2/test2.zeros.uu @@ -0,0 +1,95 @@ +begin 644 test2.zeros +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +!```` +` +end |